我们正在应用程序中使用 Core Image 滤镜处理视频,使用
AVMutableVideoComposition
(用于播放/预览和导出)。
对于较旧的设备,出于性能和内存的原因,我们希望限制处理视频帧的分辨率。理想情况下,我们会告诉 AVFoundation 在我们的合成中提供具有定义的最大尺寸的视频帧。我们认为将合成的
renderSize
属性设置为所需的大小就可以做到这一点。
但是,这只会更改 output 帧的大小,而不是进入合成处理程序块的源帧的大小。例如:
let composition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: { request in
let input = request.sourceImage // <- this still has the video's original size
// ...
})
composition.renderSize = CGSize(width: 1280, heigth: 720) // for example
因此,如果用户选择 4K 视频,我们的过滤器链将获得 4K 输入帧。当然,我们可以在管道内缩小它们的规模,但这会消耗资源,尤其是大量内存。如果 AVFoundation 能够在将视频帧传递到合成处理程序之前以所需大小解码视频帧,那就更好了。
有没有办法告诉 AVFoundation 加载较小的视频帧?
参见
kVTDecompressionPropertyKey_ReducedResolutionDecode
和按键
kVTDecompressionResolutionKey_Width
和
kVTDecompressionResolutionKey_Height
您也可以使用
kVTDecompressionPropertyKey_ReducedCoefficientDecode
kVTDecompressionPropertyKey_PixelFormatsWithReducedResolutionSupport
戳一下编解码器,以确保您请求解码的像素格式可行我没有亲自处理过这个问题,但我相信 ProRes 和 HEVC 支持此功能(HEVC 如果编码正确)以及所有变体的 ProRes。
我不确定 H.264 等其他编解码器
您可以使用 AVVideoCompressionPropertiesKey 将视频工具箱密钥传递给 AVAssetReaderOutput 或 AVPlayerItemOutput,如 AVVideoSettings 标头中所述