CIImage CVPixelBuffer 缩小后为零

CIImage CVPixelBuffer is nil after scaling down

我正在使用 AVVideoComposition API 从本地视频中获取 CIImages,在缩小 CIImage 后我得到 nil 在尝试获取 CVPixelBuffer.
时 在缩小源帧之前,我得到了原始帧 CVPixelBuffer.
缩小后缓冲区 nil 有什么原因吗?

样本:

   AVVideoComposition(asset: asset) { [weak self] request in
        let source = request.sourceImage
        let pixelBuffer = source.pixelBuffer // return value
        let scaledDown = source.transformed(by: .init(scaleX: 0.5, y: 0.5))
        let scaledPixelBuffer // return nil
   })

我认为您示例中的最后一行不完整。您是说 let scaledPixelBuffer = scaledDown.pixelBuffer 吗?如果是这样,那么是的,这是行不通的。原因是 pixelBuffer 属性 仅在 CIImage 直接从 CVPixelBuffer 创建时可用。来自文档:

If this image was create using the init(cvPixelBuffer:) initializer, this property’s value is the CVPixelBuffer object that provides the image’s underlying image data. […] Otherwise, this property’s value is nil.

传递给合成块的 CIImage 是从 AVFoundation 提供的像素缓冲区创建的。但是当你对其应用滤镜或变换时,你需要使用 CIContext 显式地将生成的图像渲染到像素缓冲区中,否则你将得不到结果。

如果您想更改合成正在使用的视频帧的大小,您可以使用 AVMutableVideoComposition 并在初始化后将其 renderSize 设置为您想要的大小:

let composition = AVMutableVideoComposition(asset: asset) { … }
composition.renderSize = CGSize(width: 1280, height: 720)