在 AVPlayerItem 上更新 AVMutableVideoComposition 的速度比视频帧速率更快

Ran*_*all 5 avfoundation ios avplayer swift

我正在尝试使用 的初始值设定项预览CIFilter应用于视频的 a 。AVMutableVideoCompositionapplyingCIFiltersWithHandler

我有几个滑块可以更改过滤器中的值,这些值会由AVPlayer. 唯一的问题是移动滑块和应用我的更改的视频的下一帧之间存在明显的滞后。

如果我使用更高帧速率的视频,则应用程序块会被更频繁地调用,并且延迟并不明显。

我尝试过在滑块移动时重新创建并替换AVMutableVideoComposition当前的AVPlayerItem,但这在视频播放时看起来很不稳定。(如果视频暂停,效果很好。https: //developer.apple.com/library/archive/qa/qa1966/_index.html

知道如何在不编写可以使帧无效的自定义视频播放器的情况下执行此操作吗?

Ran*_*all 6

这是我设法找到的一个不错的解决方案。

\n

我注意到,在帧处理块中设置睡眠实际上似乎可以提高感知性能。

\n

AVMutableVideoComposition建立一个帧缓冲区,我看到的延迟是在具有新过滤器值的帧显示之前缓冲区耗尽。在帧处理块中休眠可以防止缓冲区填满,从而使更改立即显示出来。

\n

AVMutableVideoComposition我第一百万次浏览了 的文档,并在 的文档中发现了这个小宝石sourceTrackIDForFrameTiming

\n
\n

如果在源 asset\xe2\x80\x99s 轨道中遇到空编辑,则合成器将根据需要组合帧,直至达到 frameDuration 属性中指定的频率。否则,视频合成的帧时序是从具有相应 ID 的源资产轨道中导出的。

\n
\n

我之前曾尝试在合成上设置frameDuration,但无法让它比视频的帧速率更快。如果我将 sourceTrackIDForFrameTiming 设置为kCMPersistentTrackID_Invalid它实际上可以加快帧速率。

\n

通过将帧速率设置为极高(1000 fps),手机永远不会填满缓冲区,从而使更改显得立即。

\n
composition.sourceTrackIDForFrameTiming = kCMPersistentTrackID_Invalid\n\nlet frameRateTooHighForPhone = CMTime(value: 1, timescale: 1000)\ncomposition.frameDuration = frameRateTooHighForPhone\n
Run Code Online (Sandbox Code Playgroud)\n

它比理想的情况要复杂一些,但这不是一个糟糕的解决方案。

\n