我正在尝试构建能够实时捕获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];
最好的部分是,如果我禁用输出上的所有编码内容,它会告诉我不支持传递编码。甜。
幸运的是,谷歌搜索此错误消息导致零点击。如果有人能指出我在这里的解决方案,我很想知道我做错了什么。
答案 0 :(得分:0)
当sampleBuffer编解码器未解压缩时;即编解码器不是yuvs或2vuy或RGB,那么输出设置预计为零。因为它已经被压缩,所以它不会对样本缓冲区进行转码。