iOS: Exemple de code pour l'enregistrement simultané et de la lecture
Je suis la conception d'une simple preuve de concept pour enregistreur multipiste.
Point de départ évident est de jouer à partir d'un fichier A. la caf pour un casque tout en enregistrant simultanément d'entrée du microphone dans le fichier B. fac
À cette question -- Enregistrer et lire de l'audio Simultanément -- souligne qu'il y a trois niveaux, à qui je peux travailler:
- AVFoundation API (AVAudioPlayer + AVAudioRecorder)
- Audio File d'attente de l'API
- Audio de l'Unité de l'API (RemoteIO)
Quel est le meilleur niveau pour travailler? Évidemment, le générique de réponse est de travailler au plus haut niveau qui fait le travail, ce qui serait AVFoundation.
Mais je vais prendre ce travail de quelqu'un qui a abandonné en raison de problèmes de latence (il était de 0,3 sec de retard entre les fichiers), donc peut-être que j'ai besoin de travailler à un niveau inférieur pour éviter ces problèmes?
En outre, ce code source est disponible à tremplin? J'ai été à la recherche à SpeakHere de l'échantillon ( http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html ). si je ne peux pas trouver quelque chose de plus simple, je vais utiliser ce.
Mais quelqu'un peut-il suggérer quelque chose de plus simple/else? Je préfère ne pas travailler avec du code C++ si je peux l'éviter.
Quelqu'un est-il au courant de certains publics, le code qui utilise AVFoundation pour ce faire?
EDIT: AVFoundation exemple ici: http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1
EDIT(2): Beaucoup plus agréable à la recherche d'un ici: http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework
MODIFIER(3): Comment puis-je enregistrer de l'audio sur l'iPhone avec AVAudioRecorder?
OriginalL'auteur P i | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Pour éviter les problèmes de latence, vous aurez à travailler à un niveau inférieur à celui de AVFoundation bien. Consultez cet exemple de code à partir de l'Apple - Auriotouch. Il utilise Remote I/O.
Bon à savoir. Vous devriez peut-être répondre à votre question.
OriginalL'auteur Viraj
Comme suggéré par Viraj, voici la réponse.
Oui, vous pouvez obtenir de très bons résultats en utilisant AVFoundation. Tout d'abord, vous devez payer attention sur le fait que pour à la fois le lecteur et l'enregistreur, l'activation est un processus en deux étapes.
D'abord, vous le premier.
Alors que vous jouez.
Donc, le premier tout. Puis tout jouer.
Cette obtiendrez votre temps de latence jusqu'à au sujet de 70ms. J'ai testé par l'enregistrement d'un métronome tique, puis de jouer en arrière à travers les haut-parleurs tout en maintenant l'iPhone pour les haut-parleurs et l'enregistrement simultané.
Le deuxième enregistrement a eu un écho très clair, que j'ai trouvé pour être ~70ms. Je pourrais avoir analysé le signal dans Audacity pour obtenir un décalage exact.
Afin de l'aligner avec le reste j'ai juste performSelector:x withObject: y afterDelay: 70.0/1000.0
Il peut être caché des chicots, par exemple, le retard peut varier d'un appareil à l'autre. il peut même varier en fonction de l'activité de l'appareil. Il est même possible que le fil peut être interrompue/reportées dans entre le point de départ, le joueur et le démarrage de l'enregistreur.
Mais il fonctionne, et c'est beaucoup plus propre que de déconner avec audio files d'attente /unités.
Pouvez-vous veuillez donner un Exemple de code de cette fonctionnalité ?
Malheureusement, il n'y a toujours pas moyen de faire de ce droit (à moins que j'ai pu trouver). 70ms est tout simplement trop de hors-sync pour moi, et avec la gamme d'appareils différents aujourd'hui, à la différence de la désynchronisation est trop grand. Sur l'iPhone 5s, je reçois environ 66ms, mais sur l'iPhone 6, je reçois environ 40ms. J'ai remarqué que ce post est à partir de 2011. Avez-vous jamais trouver un meilleur moyen de faire cela?
OriginalL'auteur P i
J'ai eu ce problème et je l'ai résolu dans mon projet, simplement en changeant la
PreferredHardwareIOBufferDuration
paramètre de laAudioSession
. Je pense que je viens de 6ms latence maintenant, qui est assez bon pour mon application.Vérifier cette réponse qui a une bonne explication.
Bien sûr, le code que j'ai est dans Xamarin, mais je suppose que ce n'est pas difficile de l'écrire dans swift ou d'un objectif. Regarde le lien que j'apporte dans la réponse, il n'y en est un exemple. Aussi, assurez-vous de préparer votre enregistreur (j'utilise AVAudioRecorder et prepareToRecord) et de votre joueur (j'ai une caisse AVPlayer exemple avec le nom de fichier) avant de sorte qu'ils commencent avec une faible latence. Aussi, lorsque vous l'activez, vous AudioSession assurez-vous de définir la catégorie à playAndRecord. Dans Xamarin ressemble à ceci:
AVAudioSession.SharedInstance().SetPreferredIOBufferDuration(0.005, out error);
J'ai un AudioSessionHelper classe avec une fonction appelée ActivateMyAudioSesion, où j'ai mis le catégorie, l'ensemble de la Mode, la preferredIOBufferDuration puis-je la rendre active. J'ai appeler cette fonction avant de commencer le premier enregistrement (ne pas l'appeler à chaque fois que c'est cher), ou vous pouvez le faire lorsque votre application démarre. Espérons que cela aide!
Lien : stefanpopp.de/2011/capture-iphone-microphone de référence à partir de ce code je ne peux pas en mesure de jouer dans l'enceinte bluetooth. sa lecture dans l'oreille haut-parleur(haut) tout en parlant. je veux jouer de l'audio bluetooth haut-parleurs tout en parlant. pouvez-vous m'aider sur ce point . j'ai essayé beaucoup de liens et de différentes manières, mais je ne suis pas arriver.
Êtes-vous essayer d'enregistrer et de jouer en même temps avec un faible temps de latence à l'aide de bluetooth? Je ne suis pas sûr de la façon de le faire, et vous ne savez pas si il est possible de le faire avec une faible latence certains appareils bluetooth ne sont pas fiables.
OriginalL'auteur ernewston