2017-08-11 17 views
3

CoreAudioとAVFoundationについて質問があります。CoreAudioとAVFoundationの間のパフォーマンス

私はAUGraphとAudioUnitでCoreAudioを使用してプロオーディオアプリケーションを構築しました。

本当に素晴らしいと思われるAVFoundationフレームワークに切り替えたいと思います。しかし、私はパフォーマンスについて心配しているので、もう少し詳しく知りたいです。

私のコアオーディオレンダリングコールバックでは、44100kHzのサンプルレートで512サンプルを処理できるので、コールバックは10msごとに呼び出されるため、簡単に高速化できると思います。

AVFoundationでは、レンダリングコールバックはAVAudioNodeのTapです。そして、私はbufferSizeパラメータがthe requested size of the incoming buffers in sample frames. Supported range is [100, 400] ms.であるというコメントを読んでいます。それで、それぞれの呼び出しで4410未満のサンプルを処理することはできないでしょうか?

制限はObjective-Cの制約(メッセージ呼び出し、ロックなど)に由来していますか?

リアルタイムDSPプロセスに影響を与えませんか?

答えて

4

iOS AVAudioEngine API(iOS 10.3.3)を使った私の実験では、実際にAVAudioNodeバスにタップをインストールしても、私のiPhone 7では4410サンプル未満のバッファは配信されませんでした。これは、AVAudioEngineタップCoreAudio Audio Unitのコールバックよりも優先度の低いスレッドにバッファを渡すため、頻繁に呼び出されることがなく、待ち時間が長くなります。

しかし、iPhone 7では、受信したバッファ(出力のためのインスタンスのinternalRenderBlockによって受信されたバッファ)が64から64サンプルに設定されたV3 AUAudioUnitサブクラスを作成できます。オーディオセッションでsetPreferredIOBufferDurationを呼び出すように設定されているようです優先AUAudioUnitはブロックのバッファサイズをレンダリングします。私は、動作中の低レイテンシーV3 AUAudioUnit音源サブクラスhereを作成するためのテストコード(Swift 3とObjective Cが混在しています)をいくつか投稿しました。レンダリングブロック内では、リアルタイムコーディング制限(メソッド呼び出し、ロック、メモリ割り当てなどなし)を理解し、それに従う必要があるため、ブロック内のオーディオコンテキストコードのプレーンCが最適(恐らくは必須)と思われます。

短いバッファで短いレイテンシーのマイク入力を使用する場合は、オーディオユニットのサブクラスをaudioEngineのinputNodeに接続してから、ユニットのレンダリングブロック内の入力のAURenderPullInputBlockを呼び出してみてください。

+0

ありがとう、@ hotpaw2!私はいつもあなたの質の高い答えに感謝します。 これは私が探していたものであり、素晴らしい解決策であるようです。私はAUAudioUnitのサブクラス化についてはしなかった。 AVAudioPlayerNode - > MyCustomAUを使用すると、AVAudioPlayerNodeのサンプルを高速に取得/変更する正しい方法は、AVAudioPlayerNode - > MyCustomAUのようになります。レンダリングコールバック) - > OtherAVAudioUnit。確かに、MacOS 10.13以降でAudioUnitを入手することは可能です。 – DEADBEEF

+0

前のコメントのソース[Apple Documentation](https://developer.apple.com/documentation/avfoundation)/avaudionode/2866396-auaudiounit) – DEADBEEF

+0

AUAudioUnitサブクラスは、macOS 10.12で動作するiOSシミュレータ内で動作するコードで動作するようです。それが何を意味するのか想像してみてください。 – hotpaw2

関連する問題