2011-08-25 33 views
14

私はマルチトラックレコーダーのための簡単な概念証明を設計しています。iOS:同時録音と再生のサンプルコード

明白な出発点は、同時にファイルB.caf

にこの質問をマイク入力を記録しながら、ヘッドフォンにファイルA.cafから再生することです - Record and play audio Simultaneouslyを - 私は仕事ができたの三つのレベルがあることを指摘:

  • AVFoundationのAPI(AVAudioPlayer + AVAudioRecorder)
  • オーディオキューAPI
  • のAudio Unit API(RemoteIO)

どのレベルで作業するのが最適ですか?明らかに一般的な答えは、AVFoundationとなる仕事を達成する最高レベルで作業することです。

しかし、レイテンシの問題(彼はファイル間に0.3秒の遅延がありました)のためにこの仕事をしているので、これらの問題を避けるために低レベルで作業する必要がありますか?

また、バネボードにはどのようなソースコードがありますか?私はSpeakHereサンプル(http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html)を見てきました。私がもっと簡単なものを見つけることができないなら、私はこれを使用します。

誰かがもっとシンプルなものを提案できますか?もし私がそれを避けることができれば、私はむしろC++コードで作業したくないでしょう。

これを行うためにAVFoundationを使用するパブリックコードを知っている人はいますか?

EDIT:ここAVFoundation例: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):非常に良く、ここで1を探して:http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

EDIT(3):How do I record audio on iPhone with AVAudioRecorder?

答えて

5

Virajさんが提案したように、ここに答えがあります。

はい、AVFoundationを使用すると非常に良い結果が得られます。まず、プレーヤーとレコーダーの両方で、それらをアクティブにすることが2つのステップのプロセスであるという事実に注意を払う必要があります。

まずはプライムしてください。

あなたはそれを再生します。

だから、すべてをプライムしてください。その後、すべてを再生します。

これにより、待ち時間が約70msに短縮されます。私は、メトロノームティックを録音し、スピーカーからiPhoneをスピーカーまで持ち上げながら同時に再生することでテストしました。

2回目の録音では、エコーがクリアされていましたが、これは約70msでした。私は正確なオフセットを得るためにAudacityの信号を分析できました。

だから私だけperformSelectorをすべてをラインアップするために:withObject X:Y afterDelay:70.0/1000.0

例えば遅延は、デバイス間で異なることがあり、隠された思わぬ障害があるかもしれません。デバイスの動作によっても異なる場合があります。プレイヤーの起動とレコーダーの起動の間にスレッドが中断/再スケジュールされる可能性もあります。

しかし、それはうまく動作し、オーディオキュー/ユニットを使いこなすよりもはるかに細かいです。

+1

どのように「プライム」ですか?あなたはそれが意味することを説明できますか? –

+3

この機能のサンプルコードを提供していただけますか? –

+1

悲しいことに、まだこれを行う方法はない(少なくとも私が見つけることができる)。 70msは単に私にとってあまりにも多くのオフシンクであり、今日のさまざまなデバイスの範囲では、非同期の違いが大きすぎます。 iPhone 5では約66ミリ秒かかるが、iPhone 6では約40ミリ秒かかる。私はこの投稿が2011年からであることに気付きました。あなたはこれを行うより良い方法を見つけましたか? – Sti

6

を待ち時間の問題を回避するには、する必要がありますAVFoundationよりも低いレベルで動作します。このサンプルコードはAppleのAuriotouchからチェックしてください。リモートI/Oを使用します。

+1

実際、私はAVFoundationを使用して作業現場を取得しました。あなたはそれを蹴る前にすべてが準備されていることを確認するだけです。それに加えて、プレーヤーの後にレコーダーを70ms起動する必要があります。それはうまく整列しています。 (これはデバイスによって異なる場合があります)。 –

+2

お役立ち情報多分あなたはあなたの質問に答えるべきです。 – Viraj

1

私はこの問題を抱えていましたが、私はのパラメータをAudioSessionに変更するだけで解決しました。私はちょうど6msのレイテンシを持っていると思う。それは私のアプリにとって十分だ。

良い説明があるthis answerを確認してください。

+0

コードを入力してください。私は最後の4日間から苦労しています。 –

+0

確かに、私が持っているコードはXamarinにありますが、速くても客観的にでも書くのは難しくありません。私が答えで提供するリンクを見て、例があります。また、レコーダー(私はAVAudioRecorderとprepareToRecordを使用します)とプレイヤー(ファイル名でAVPlayerインスタンスを作成しています)を準備してから、低レイテンシで始めるようにしてください。また、AudioSessionをアクティブにするときは、カテゴリをplayAndRecordに設定してください。 – ernewston

+0

私は、ActivateMyAudioSesionと呼ばれる関数を持つAudioSessionHelperクラスを持っています。ここでは、カテゴリを設定し、Mode、preferredIOBufferDurationを設定してから、それを使用します。私はそれを有効にする。最初のレコーディングを開始する前にこの関数を呼び出します(高価なたびに呼び出さないでください)。または、アプリケーションの起動時にこの関数を呼び出すことができます。それが役に立てば幸い! – ernewston

関連する問題