【问题标题】:Update AVMutableVideoComposition on AVPlayerItem faster than video framerate比视频帧速率更快地更新 AVPlayerItem 上的 AVMutableVideoComposition
【发布时间】:2020-10-13 21:52:02
【问题描述】:

我正在尝试使用AVMutableVideoCompositionapplyingCIFiltersWithHandler 初始化程序预览应用于视频的CIFilter

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

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

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

知道如何在不编写可以使帧无效的自定义视频播放器的情况下做到这一点吗?

【问题讨论】:

    标签: ios swift avfoundation avplayer


    【解决方案1】:

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

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

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

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

    如果在源资源的轨道中遇到空编辑,合成器会根据需要合成帧,直到 frameDuration 属性中指定的频率。否则,视频合成的帧时序源自具有相应 ID 的源资产轨道。

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

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

    composition.sourceTrackIDForFrameTiming = kCMPersistentTrackID_Invalid
    
    let frameRateTooHighForPhone = CMTime(value: 1, timescale: 1000)
    composition.frameDuration = frameRateTooHighForPhone
    

    这比理想情况下有点hackier,但它不是一个糟糕的解决方案。

    【讨论】:

      【解决方案2】:

      非常感谢您发布此消息,兰德尔。上面的 frameDuration hack 修复了我在启用/禁用图层时看到的延迟;所以,看来我正朝着正确的方向前进。

      我现在需要弄清楚的问题是,为什么使用这个 frameDuration hack 似乎还会在视频处理中引入故障和处理挂起的副作用。有时效果很好,但通常视频会在几秒钟后冻结,而音轨继续播放。没有 hack,播放是稳定的,但改变构图滞后。有了 hack,变化似乎是瞬间的,视频播放有大约 10% 的机会是稳定的 - 否则,挂起。 (如果我擦得足够多,它似乎会以某种方式自我修复,当它修复时,宇宙感觉就像一个更好的地方。)

      我对使用 AVMutableVideoComposition 和 AVVideoCompositing 协议非常陌生,关于我的用法的文档似乎很少,所以我发布此回复,以防有人有更多的信息要与我分享。

      【讨论】:

      • 希望您现在已经找到了解决方案,但这是设备或模拟器上的问题吗?我在模拟器上遇到了类似的问题,但在设备上运行良好。
      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2013-08-19
      • 1970-01-01
      相关资源
      最近更新 更多