2013-10-31 106 views
7

我真的没了主意,所以我不得不再次问你们...AVPlayer不同步

我建立它使用AVPlayer的三个实例的iPhone应用程序。他们都在同一时间玩,这是非常重要的。我曾经运行这个代码:

CMClockRef syncTime = CMClockGetHostTimeClock(); 
CMTime hostTime = CMClockGetTime(hostTime); 
[self.playerOne setRate:1.0f time:kCMTimeInvalid atHostTime:hostTime]; 
[self.playerTwo setRate:1.0f time:kCMTimeInvalid atHostTime:hostTime]; 
[self.playerThree setRate:1.0f time:kCMTimeInvalid atHostTime:hostTime]; 

这是完美的工作。但是几天前它刚刚停止工作,三名选手延迟了大约300-400毫秒(这是很大的方法,100毫秒以内的所有选项都可以)。其中两个AVPlayer有一些音频处理,这比“正常”的AVPlayer花费的时间要多一些,但之前它曾经工作过,而currentTime属性告诉我,这些播放器被延迟了,所以同步似乎失败了。

我不知道为什么它停止工作,我没有真正改变一些东西,但我使用了一个观察者,在那里我可以问self.playerX.currentTime属性,这让我延迟了大约.3- .4秒......如果delay> .1f,我已经尝试重新同步球员,但延迟仍然存在。所以我认为player1和2的音频处理不能对延迟做出响应,因为currentTime属性确实知道它们被延迟了(我希望你知道我的意思)。也许你们中的一些人知道我为什么会有这么可怕的延迟,或者能够提供给我另一个想法。

在此先感谢!

回答

13

所以,我找到了解决方案。我忘了[self.playerX prerollAtRate:]。我想如果观察者是AVPlayerReadyToPlay,那就意味着玩家已经“真的”准备好了。事实上,事实并非如此。在AVPlayer准备好播放后,它必须预滚动。一旦完成,你可以同步你的砂金。延迟时间现在为0.000006秒。

+0

感谢分享,这个解决方案非常有帮助。 –

+0

这是否也适用于远程资产? – zevarito

+0

谢谢Max,你能编辑你的答案以包含原始代码吗?我不明白,setRate是否为每个玩家在prerollAtRate的完成处理程序中调用? –