CIImage CVPixelBuffer 缩小后为零
CIImage CVPixelBuffer is nil after scaling down
我正在使用 AVVideoComposition
API 从本地视频中获取 CIImage
s,在缩小 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)
我正在使用 AVVideoComposition
API 从本地视频中获取 CIImage
s,在缩小 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 theCVPixelBuffer
object that provides the image’s underlying image data. […] Otherwise, this property’s value isnil
.
传递给合成块的 CIImage
是从 AVFoundation 提供的像素缓冲区创建的。但是当你对其应用滤镜或变换时,你需要使用 CIContext
显式地将生成的图像渲染到像素缓冲区中,否则你将得不到结果。
如果您想更改合成正在使用的视频帧的大小,您可以使用 AVMutableVideoComposition
并在初始化后将其 renderSize
设置为您想要的大小:
let composition = AVMutableVideoComposition(asset: asset) { … }
composition.renderSize = CGSize(width: 1280, height: 720)