AVFoundation:在处理之前以较低分辨率解码视频帧

问题描述 投票:0回答:1

我们正在应用程序中使用 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 加载较小的视频帧?

ios avfoundation video-processing core-image
1个回答
0
投票
对于某些支持渐进式解码的视频编解码器,您可以使用 VideoToolbox 键。

参见

kVTDecompressionPropertyKey_ReducedResolutionDecode

 和按键 
kVTDecompressionResolutionKey_Width
kVTDecompressionResolutionKey_Height

您也可以使用

kVTDecompressionPropertyKey_ReducedCoefficientDecode


您可能需要用

kVTDecompressionPropertyKey_PixelFormatsWithReducedResolutionSupport

 戳一下编解码器,以确保您请求解码的像素格式可行

我没有亲自处理过这个问题,但我相信 ProRes 和 HEVC 支持此功能(HEVC 如果编码正确)以及所有变体的 ProRes。

我不确定 H.264 等其他编解码器

您可以使用 AVVideoCompressionPropertiesKey 将视频工具箱密钥传递给 AVAssetReaderOutput 或 AVPlayerItemOutput,如 AVVideoSettings 标头中所述

© www.soinside.com 2019 - 2024. All rights reserved.