[英]AVPlayer not synchronized
我真的沒有想法,所以我不得不再問你們......
我正在構建一個使用三個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-400ms(這是很多,100ms以下的一切都沒問題)。 其中兩個AVPlayer有一些音頻處理,比“普通”AVPlayer需要花費一些時間,但它曾經工作過,而且currentTime屬性告訴我,這些播放器都被延遲了,所以同步似乎失敗了。
我不知道它為什么停止工作,我沒有真正改變一些東西,但我正在使用一個觀察者,我可以詢問self.playerX.currentTime屬性,這給了我大約.3-.4秒的延遲。 ..如果延遲> .1f,我已經嘗試重新同步玩家,但延遲仍在那里。 所以我認為播放器1和2的音頻處理不能對延遲負責,因為currentTime屬性確實知道它們被延遲了(我希望你知道我的意思)。 也許你們中的某些人知道為什么我有這么可怕的延遲,或者能夠給我另一個想法。
提前致謝!
所以,我找到了解決方案。 我忘了[self.playerX prerollAtRate:]。 我想如果觀察者是AVPlayerReadyToPlay意味着玩家“真的”准備好了。 事實上,它沒有。 在AVPlayer readyToPlay之后,它必須預先滾動。 完成后,您可以同步您的布局器。 延遲現在是0.000006秒。
全功能可在多個iOS設備上同步avplayer
private func startTribePlayer() {
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd"
guard let refDate = dateFormatterGet.date(from: "2019-01-01") else { return }
let tsRef = Date().timeIntervalSince(refDate)
//currentDuration is avplayeritem.duration().seconds
let remainder = tsRef.truncatingRemainder(dividingBy: currentDuration)
let ratio = remainder / currentDuration
let seekTime = ratio * currentDuration
let bufferTime = 0.5
let bufferSeekTime = seekTime + bufferTime
let mulFactor = 10000.0
let timeScale = CMTimeScale(mulFactor)
let seekCMTime = CMTime(value: CMTimeValue(CGFloat(bufferSeekTime * mulFactor)), timescale: timeScale)
let syncTime = CMClockGetHostTimeClock()
let hostTime = CMClockGetTime(syncTime)
tribeMusicPlayer?.seek(to: seekCMTime, toleranceBefore: .zero, toleranceAfter: .zero, completionHandler: { [weak self] (successSeek) in
guard let tvc = self, tvc.tribeMusicPlayer?.currentItem?.status == .readyToPlay else { return }
tvc.tribeMusicPlayer?.preroll(atRate: 1.0, completionHandler: { [tvc] (successPreroll) in
tvc.tribePlayerDidPlay = true
tvc.tribeMusicPlayer?.setRate(1.0, time: seekCMTime, atHostTime: hostTime)
})
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.