AVAssetWriter抱怨BlackMagic强度的输入被压缩,因此无法编码

时间:2012-08-31 00:17:40

标签: avfoundation avcapturesession

我正在尝试构建能够实时捕获Mac上的视频输入并写出预分段的mp4块的内容。它适用于某些相机,但不适用于其他相机。

设置如下。

AVCaptureVideoDataOutputAVCaptureVideoDataOutputSampleBufferDelegate

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];

最好的部分是,如果我禁用输出上的所有编码内容,它会告诉我不支持传递编码。甜。

幸运的是,谷歌搜索此错误消息导致零点击。如果有人能指出我在这里的解决方案,我很想知道我做错了什么。

1 个答案:

答案 0 :(得分:0)

当sampleBuffer编解码器未解压缩时;即编解码器不是yuvs或2vuy或RGB,那么输出设置预计为零。因为它已经被压缩,所以它不会对样本缓冲区进行转码。