5

Mac でビデオ フィードをリアルタイムでキャプチャし、事前にセグメント化された mp4 チャンクを書き出すものを構築しようとしています。一部のカメラでは機能しますが、他のカメラでは機能しません。

セットアップは次のとおりです。

アンAVCaptureVideoDataOutputは を持っていAVCaptureVideoDataOutputSampleBufferDelegateます。

dispatch_queue_t sampleQueue = dispatch_queue_create("samples", NULL);
[videoOutput setSampleBufferDelegate: delegate queue: sampleQueue];

AVCaptureSession出力は、ファイルに保存してプレビューを表示する にも関与しており、すべて正常に動作します。

デリゲートには、AVAssetWriterInput. 次のように設定されています。

NSDictionary
    *videoFormat = [NSDictionary dictionaryWithObjectsAndKeys:
        // Format options
        AVVideoCodecH264, AVVideoCodecKey,// h264
        [NSNumber numberWithInt: width], AVVideoWidthKey,
        [NSNumber numberWithInt: height], AVVideoHeightKey,
        // Encoder options
        [NSDictionary dictionaryWithObjectsAndKeys:
            [NSNumber numberWithInt: theQuality*1024], AVVideoAverageBitRateKey,// 256kbps
            [NSNumber numberWithInt: 30], AVVideoMaxKeyFrameIntervalKey,// write at least one keyframe every 30 frames
        nil], AVVideoCompressionPropertiesKey,
    nil],
 video = [[AVAssetWriterInput assetWriterInputWithMediaType: AVMediaTypeVideo outputSettings: videoFormat] retain];
[video setExpectsMediaDataInRealTime: YES];

このデリゲートを使用してファイルに書き込む方法があります。

writer = [[AVAssetWriter assetWriterWithURL: url fileType: AVFileTypeMPEG4 error: &error] retain];
[writer setShouldOptimizeForNetworkUse: YES];
[writer addInput: video];

ここでcaptureData、サンプル データのバッファを処理するデリゲートのコールバック メソッド内で、次のようにします。

   if([video isReadyForMoreMediaData])
        [video appendSampleBuffer: sampleBuffer]; 

すごい!これは私のfacetimeカメラで機能しています。今は BlackMagic Intensity を接続して使用しています。

この行で:

        [video appendSampleBuffer: sampleBuffer]; 

次のエラーが表示されます。

*** -[AVAssetWriterInput appendSampleBuffer:] Input buffer must be in an uncompressed format when outputSettings is not nil

設定をいじってみvideoOutputましたが、役に立ちませんでした。ドキュメントは、これは圧縮できないものであると述べているようです。次のようなもの:

// not all at the same time, of course.
videoOutput.videoSettings = nil;
videoOutput.videoSettings = [NSDictionary dictionaryWithObject:@"avc1" forKey:AVVideoCodecKey];

最良の部分は、出力のすべてのエンコーディングを無効にすると、パススルー エンコーディングがサポートされていないことが通知されることです。甘い。

幸いなことに、このエラー メッセージをグーグルで調べてもヒットはありません。誰かがここで解決策を教えてくれるなら、何が間違っているのか知りたいです。

4

1 に答える 1

0

sampleBufferコーデックが解凍されていない場合。つまり、コーデックが yuvs、2vuy、RGB のいずれでもない場合、出力設定は nil であると予想されます。サンプル バッファは既に圧縮されているため、トランスコードしません。

于 2013-04-29T07:17:00.553 に答える