我正在使用AvFoundation& AVCaptureVideoDataOutputSampleBufferDelegate录制视频。
我需要在录制的视频中实现缩放功能。我使用以下委托方法。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
我正在使用它来获取视频帧,因为我需要稍后添加文本和图像,然后将其附加到AVAssetWriterInput,使用
[assetWriterVideoIn appendSampleBuffer:sampleBuffer]
我能想到执行缩放的唯一方法是缩放和裁剪我从委托方法获得的“(CMSampleBufferRef)sampleBuffer”。
请帮我解决这个问题。我需要知道缩放和裁剪“CMSampleBufferRef”的可能方法。
答案 0 :(得分:0)
一种解决方案是将CMSampleBuffer ref转换为CIImage,然后将其缩放并将其写回CVPixelBufferRef并追加它。
您可以在此处查看包含代码结构的方法。
另一种选择是使用层指令缩放视频,如:
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];