簡體   English   中英

AVPlayer未同步

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM