缩放和裁剪 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在网站中动态裁剪/缩放图像

ImageMagick 缩放和裁剪保持纵横比

在 iOS 中以圆形格式裁剪和缩放图像

JS:图像上传实时操作、缩放、尺寸和裁剪

如何裁剪用户缩放的 UIImageView

Android 位图平移/缩放/裁剪