缩放和裁剪CMSampleBufferRef

时间:2014-07-23 06:49:02

标签: ios avfoundation avassetwriter cmsamplebufferref cmsamplebuffer

我正在使用AvFoundation& AVCaptureVideoDataOutputSampleBufferDelegate录制视频。

我需要在录制的视频中实现缩放功能。我使用以下委托方法。

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

我正在使用它来获取视频帧,因为我需要稍后添加文本和图像,然后将其附加到AVAssetWriterInput,使用

[assetWriterVideoIn appendSampleBuffer:sampleBuffer]

我能想到执行缩放的唯一方法是缩放和裁剪我从委托方法获得的“(CMSampleBufferRef)sampleBuffer”。

请帮我解决这个问题。我需要知道缩放和裁剪“CMSampleBufferRef”的可能方法。

1 个答案:

答案 0 :(得分:0)

一种解决方案是将CMSampleBuffer ref转换为CIImage,然后将其缩放并将其写回CVPixelBufferRef并追加它。

您可以在此处查看包含代码结构的方法。

Adding filters to video with AVFoundation (OSX) - how do I write the resulting image back to AVWriter?

另一种选择是使用层指令缩放视频,如:

AVMutableVideoCompositionLayerInstruction *layerInstruction =
    [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstruction];
layerInstruction.trackID = mutableCompositionTrack.trackID;
[layerInstruction setTransform:CGAffineTransformMakeScale(2.0f,2.0f) atTime:kCMTimeZero];

这告诉构图将mutableCompositionTrack(或用于轨道的任何变量名称)从视频开头缩放2.0倍。

现在,当您合成视频时,添加图层说明数组,您就可以进行缩放,而无需担心操纵CMSampleBuffer(它也会快得多)。

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];

videoComposition.renderSize = CGSizeMake(1280, 720);
videoComposition.frameDuration = CMTimeMake(1, 30);
videoComposition.instructions = @[_instructions];