缩放和裁剪 CMSampleBufferRef
Posted
技术标签:
【中文标题】缩放和裁剪 CMSampleBufferRef【英文标题】:Scale and crop CMSampleBufferRef 【发布时间】:2014-07-23 06:49:02 【问题描述】:我正在使用 AvFoundation 和 AVCaptureVideoDataOutputSampleBufferDelegate 来录制视频。
我需要在正在录制的视频中实现缩放功能。我正在使用以下委托方法。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
我使用它来获取视频帧,因为我需要稍后在其上添加文本和图像,然后再将其附加到 AVAssetWriterInput,使用
[assetWriterVideoIn appendSampleBuffer:sampleBuffer]
我认为执行缩放的唯一方法是缩放和裁剪我从委托方法获得的“(CMSampleBufferRef)sampleBuffer”。
请帮我解决这个问题。我需要知道缩放和裁剪“CMSampleBufferRef”的可能方法。
【问题讨论】:
嗨@ios_DEV,您找到解决方案了吗? 【参考方案1】:一种解决方案是将 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];
【讨论】:
好的,我正确地重新阅读了这个问题 - 我认为使用 AVVideoOut(你正在这样做来获取缓冲区)我的第二种方法可能不起作用,但你仍然应该得到答案从我提供的链接缩放 XMSampleBuffer。以上是关于缩放和裁剪 CMSampleBufferRef的主要内容,如果未能解决你的问题,请参考以下文章