AVFoundation を適応させて、可能と思われることを実行しようとしていますが、シナリオのサポートや例がどこにも見つかりません。
フロント カメラからビデオを取得し、それを 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 にすべてをインターリーブするという大変な作業を任せたいと思います。