保持两个AVPlayer同步

7
我有一个客户提出了一个非常具体的应用需求,需要两个AVPlayer同步播放。其中一个视频是内容,另一个视频是演讲者讲解内容。使用AVMutableComposition将它们合并为一个视频不是一个选择,因为演讲者视频必须能够响应用户生成的事件(例如,他们想要一个功能来显示/隐藏演讲者),我不相信有一种方法可以对特定的AVMutableCompositionTrack进行这种控制。因此,我需要找出如何确保两个AVPlayers保持同步,我想知道是否有人有过这方面的经验或有其他工具的建议来实现这一点。谢谢!

你尝试过将玩家的AVPlayerLayers放入同一个AVSynchronizedLayer中吗?(注意:我还没有尝试过这个) - David Cairns
我相信我尝试过那个。我认为AVSynchronizedLayer是用来保持动画与一个播放器同步的。最终,我手动启动/停止了两个播放器。然后客户更改了规格,使得这一切都无关紧要了。 - moshe
唉!我讨厌这种情况发生!不管怎样,这也是我的当前方法。这很痛苦,因为我在其中一个播放器中经常寻找。希望有一个更简单的解决方案。 - David Cairns
1个回答

1
以下方法是要使用的。
- (void)setRate:(float)rate 
           time:(CMTime)itemTime 
     atHostTime:(CMTime)hostClockTime;

- (void)prerollAtRate:(float)rate 
    completionHandler:(void (^)(BOOL finished))completionHandler;

注意事项

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

这是一种预期行为,因为“直播”是“实时”的,不能向前搜索,并且将速率设置为小于1.0会导致流进行额外的缓冲(第二个点是一个猜测)。

文档

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

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

作为一个旁注,需要考虑到HLS流并不是真正的实时流,观看流的不同客户端之间可能会有几秒钟的时间差异,相反WebRTC则保证了发布者和消费者之间的延迟最多只有1秒钟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接