2012-04-07 148 views
4

我有一個客戶端對應用程序有非常特定的要求,需要兩個AVPlayers同步。一個視頻是針對某些內容的,另一個是演示者講述內容的。使用AVMutableComposition將它們組合成一個視頻不是一種選擇,因爲主持人視頻必須能夠響應用戶生成的事件(例如,他們想要顯示/隱藏主持人的功能),我不相信有一種對特定AVMutableCompositionTrack進行這種控制的方法。保持兩個AVPlayers同步

所以,我只是想知道如何確保兩個AVPlayers保持同步,我想知道是否有人有過這方面的經驗,或者有其他工具的建議來完成此任務。

感謝

+0

您是否嘗試將播放器的AVPlayerLayer放入同一個AVSynchronizedLayer? (注意:我還沒有嘗試過) – 2012-07-06 23:39:57

+0

我相信我試過了。我認爲AVSynchronizedLayer是爲了保持動畫與一名玩家同步。我最終手動啓動/停止兩個球員。然後,客戶改變了這一切都沒有實際意義的規範。 – moshe 2012-07-08 09:42:14

+0

D'oh!發生這種事時我討厭它!無論如何,這也是我目前的做法。這是一種痛苦,因爲我在其中一名球員中尋找很多。希望有一個更簡單的解決方案。 – 2012-07-09 19:40:40

回答

1

下面的方法是那些使用

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

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

注意事項

重要的是,目前不支持HTTP這種方法直播 流或automaticallyWaitsToMinimizeStalling時是是的。對於 與iOS 10.0及更高版本鏈接的客戶端或macOS 10.12及更高版本, 在自動更改爲最小化延遲爲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流是不是真正的實時流,「當前時刻」可能clientes消耗的數據流中的變化幾秒鐘,與WebRTC相反,例如,出版商與消費者之間的延遲最好保持1秒。