保持两个AVPlayers同步

mos*_*she 5 synchronization avfoundation ios avplayer

我的客户有一个非常具体的应用程序请求,需要两个AVPlayers同步.一个视频用于某些内容,另一个视频用于讲述内容的演示者.使用AVMutableComposition将它们组合成一个视频不是一个选项,因为演示者视频必须能够响应用户生成的事件(例如,他们希望有一个功能来显示/隐藏演示者),我不相信有一种对特定AVMutableCompositionTrack进行控制的方法.

所以,我只想弄清楚如何确保两个AVPlayer保持同步,我想知道是否有人有这方面的经验或其他工具的建议来实现这一目标.

谢谢

zev*_*ito 1

可以使用以下方法

- (void)setRate:(float)rate 
           time:(CMTime)itemTime 
     atHostTime:(CMTime)hostClockTime;

- (void)prerollAtRate:(float)rate 
    completionHandler:(void (^)(BOOL finished))completionHandler;
Run Code Online (Sandbox Code Playgroud)

注意事项

重要 目前 HTTP Live Streaming 或当automaticWaitsToMinimizeStalling 为YES 时不支持此方法。对于与 iOS 10.0 及更高版本或 macOS 10.12 及更高版本链接的客户端,在automaticWaitsToMinimizeStalling 为 YES 时调用此方法将引发 NSInvalidArgument 异常。

这是预期的行为,因为“live”是“present”并且无法向前搜索,并且将速率设置为小于 1.0 会导致额外缓冲流(第二点是猜测)。

文档

https://developer.apple.com/documentation/avfoundation/avplayer/1386591-setrate?language=objc

https://developer.apple.com/documentation/avfoundation/avplayer/1389712-prerollat​​rate?language=objc

顺便说一句,考虑到 HLS 流不是真正的实时流,消费该流的客户端之间的“当前时刻”可能会变化几秒钟,这与 WebRTC 相反,例如,发布者和消费者之间的延迟最多保证 1 秒。