10

オーディオのキャプチャと録音のために AVFoundation を使用しています。よく分からない問題があります。

基本的に、AVCaptureSession からオーディオをキャプチャし、AVWriter を使用して書き込みたいのですが、AVCaptureSession から取得した CMSampleBuffer のタイムスタンプをシフトする必要があります。CMSampleBuffer のドキュメントを読みましたが、タイムスタンプには「プレゼンテーション タイムスタンプ」と「出力プレゼンテーション タイムスタンプ」という 2 つの異なる用語があります。2つの違いは何ですか?

AVCaptureSession から CMSampleBuffer (オーディオ用) インスタンスを取得し、それを AVWriter を使用してファイルに書き込みたいとします。CMTime をバッファに「挿入」してプレゼンテーション タイムスタンプを設定するには、どの関数を使用すればよいですか?結果のファイル?

ありがとう。

4

2 に答える 2

6

CMSampleBufferGetPresentationTimeStamp を使用します。これは、バッファがキャプチャされ、再生時に「提示」されて同期される必要がある時間です。WWDC 2012 のセッション 520 を引用すると、「プレゼンテーション時間は、バッファ内の最初のサンプルがマイクによってピックアップされた時間です」。

AVWriterを起動すると

[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];

次に、サンプルを追加します

if(videoWriterInput.readyForMoreMediaData) [videoWriterInput appendSampleBuffer:sampleBuffer];

完成したビデオのフレームは、CMSampleBufferGetPresentationTimeStamp と一致します (確認済み)。サンプルを追加するときに時間を変更したい場合は、AVAssetWriterInputPixelBufferAdaptor を使用する必要があります

于 2013-02-09T17:08:13.923 に答える
6

ここからのサンプル コードのチャンク: http://www.gdcl.co.uk/2013/02/20/iPhone-Pause.html CMSampleBufferRef サンプル - あなたの sampleBuffer、CMSampleBufferRef はあなたの出力です。NewTimeStamp はタイム スタンプです。

CMItemCount count;
CMTime newTimeStamp = CMTimeMake(YOURTIME_GOES_HERE);
CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count);
CMSampleTimingInfo* pInfo = malloc(sizeof(CMSampleTimingInfo) * count);
CMSampleBufferGetSampleTimingInfoArray(sample, count, pInfo, &count);
for (CMItemCount i = 0; i < count; i++)
{
    pInfo[i].decodeTimeStamp = newTimeStamp; // kCMTimeInvalid if in sequence
    pInfo[i].presentationTimeStamp = newTimeStamp;

}
CMSampleBufferRef sout;
CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, sample, count, pInfo, &sout);
free(pInfo);
于 2013-03-02T06:06:17.803 に答える