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];
最良の部分は、出力のすべてのエンコーディングを無効にすると、パススルー エンコーディングがサポートされていないことが通知されることです。甘い。
幸いなことに、このエラー メッセージをグーグルで調べてもヒットはありません。誰かがここで解決策を教えてくれるなら、何が間違っているのか知りたいです。