8

データからCMSampleBufferRefを作成し、それをAVAssetWriterにフィードしようとしています。しかし、アセットライターはデータから映画を作成できていません。以下は、CMSampleBufferRefを作成するためのコードです。

CVImageBufferRef cvimgRef = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(cvimgRef,0);

uint8_t *buf=(uint8_t *)CVPixelBufferGetBaseAddress(cvimgRef);

int width = 480;
int height = 360;
int bitmapBytesPerRow   = width*4;
int bitmapByteCount     = bitmapBytesPerRow*height;


CVPixelBufferRef pixelBufRef = NULL;
CMSampleBufferRef newSampleBuffer = NULL;
CMSampleTimingInfo timimgInfo = kCMTimingInfoInvalid;
CMSampleBufferGetSampleTimingInfo(sampleBuffer, 0, &timimgInfo);

OSStatus result = 0;

OSType pixFmt = CVPixelBufferGetPixelFormatType(cvimgRef);

CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, pixFmt, buf, bitmapBytesPerRow, NULL, NULL, NULL, &pixelBufRef);

CMVideoFormatDescriptionRef videoInfo = NULL;

result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBufRef, &videoInfo);

CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBufRef, true, NULL, NULL, videoInfo, &timimgInfo, &newSampleBuffer);

AVFoundationデータ出力コールバックメソッドから取得した元のCMSampleBufferRefを使用すると、ムービーの作成は正常に機能します。

しかし、カスタムCMSampleBufferRefを使用してムービーを作成しようとすると、同じことが失敗します。アセットライターは次のエラーをスローします。

The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)

この問題の解決にご協力ください。

4

2 に答える 2

4

AVAssetWriterInputPixelBufferAdaptor を調べる必要があります。これは CVPixelBuffers を受け入れるため、CVPixelBuffer を CMSampleBuffer に変換する必要はありません。

Apple devフォーラムのスレッドへのリンクは次のとおりです-> https://devforums.apple.com/thread/70258?tstart=0

また、プロジェクト ファイルまたはキャプチャ ムービーのサンプル コードを投稿する機会があれば、AVFoundation データ出力コールバック メソッドのデフォルトの CMSampleBuffer を使用していますが、カメラ ロールに保存すると、最後の 5 つを除いてすべて黒くなります。手動でスクラブする必要があるフレーム:S

私の問題に関して何か助けていただければ幸いです。

乾杯、

マイケル

于 2010-10-03T14:22:47.400 に答える
1
    The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)

このエラーは、timingInfoが無効な場合に必ず発生します。と で有効な値に設定する必要がありPTSますDuration

CMSampleTimingInfo timingInfo = kCMTimingInfoInvalid;
timingInfo.presentationTimeStamp = pts; 
timingInfo.duration = duration;
于 2014-04-19T03:54:17.240 に答える