0

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

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

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

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

[assetWriterVideoIn appendSampleBuffer:sampleBuffer]

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

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

4

1 回答 1

0

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

您可以在此处查看如何执行此操作,其中包含代码结构。

使用 AVFoundation (OSX) 向视频添加过滤器 - 如何将生成的图像写回 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];
于 2014-07-25T18:48:37.990 回答