0

私はAVFoundationを可能にするように見えるようにするためにAVFoundationを採用しようとしていますが、私のシナリオではサポートやサンプルを見つけることができません。Core Audioを使用したライブオーディオではAVAssetWriterInputが可能ですか?

私はフロントカメラからビデオを取り込み、それをCore Audioのオーディオと組み合わせる必要があります。

私は、カメラからのビデオを取得し、それをマイクのオーディオと組み合わせるという一般的なケースを解決するコードを作成しました。これは、ほとんどの場合、RosyWriter Appleサンプルコードに適合しています。

しかし、私はCore Audioから出るオーディオのライブストリームを使用する方法を見つけることができません、それからAVAssetWriterInputを作成し、AVCaptureSessionへの入力としてそれを追加します。私がAVCaptureInputとAVAssetWriterInputをセットアップすることと関連するすべてのリソースは、それらをデバイスで初期化し、リアルタイムでデバイスからメディアを取得することを中心にしていますが、デバイスからオーディオを取得しようとはしていません。

AVCaptureInputを作成し、特定のASBD形式のデータを期待して、そのデータにCore Audioコールバックのデータを渡す方法はありますか?私はディスクにデータを書き込んでディスクから読み込む必要はありません - それは非常に遅いと思われます。解決策があるはずですが、見つけられません。

私はオーディオを入れるために使用するAudioBufferListオブジェクトからCMSampleBuffersを生成するコードを持っています。私はCMSampleBuffersを調べて、データの有効なフレームを含んでいるようですが、そのデータを修正したRosyWriterViewProcessor "writeSampleBuffer:ofType:"に送り返すと、正しく書かれているようです(エラーは表示されません)。ビデオファイルが完成したら私はビデオだけを見て、オーディオは聞こえません。

誰も私がやろうとしていることを達成するためのヒントはありますか?ここで

は全体で私が使用してきた標準ASBDです:

AudioStreamBasicDescription audioDescription; 
memset(&audioDescription, 0, sizeof(audioDescription)); 
audioDescription.mFormatID   = kAudioFormatLinearPCM; 
audioDescription.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian; 
audioDescription.mChannelsPerFrame = 2; 
audioDescription.mBytesPerPacket = sizeof(SInt16)*audioDescription.mChannelsPerFrame; 
audioDescription.mFramesPerPacket = 1; 
audioDescription.mBytesPerFrame  = sizeof(SInt16)*audioDescription.mChannelsPerFrame; 
audioDescription.mBitsPerChannel = 8 * sizeof(SInt16); 
audioDescription.mSampleRate  = 44100.0; 

は、ソリューションがなければ、私は私がAVCompositionを使用して一緒にパッチを当てることができると思い別々のビデオとオーディオファイルを持っていますが、私はむしろないと思います私のビデオとオーディオファイルは定期的に長さが違うので、そのルートを行くと私は一緒にフィットするように1つのトラックや別のものを伸ばして戦うしたくない - それは同期さえ終わることさえできないかもしれません! AVCaptureSessionですべてをセットアップし、AVFoundationですべてのものをインタリーブするのは難しい作業です。

+0

これはあなたがこれを理解しましたか? – user3344977

答えて

0

生のPCMフォーマットを使用して有効なアセットライター入力を作成してください。ただし、コールバックでその入力からデータを取り除き、オーディオユニットから作成した出力から保存されたバッファのデータを同じ長さに置き換えてください。

+0

これを行う方法についていくつかのヒントを教えてもらえますか?コールバックを言うときは、 "requestMediaDataWhenReadyOnQueue:usingBlock:"で初期化するか、単に "appendSampleBuffer:"を使用して初期化することを意味しますか? – patcoll

関連する問題