2013-10-31 19 views
7

Tôi thực sự không có ý tưởng nên tôi sẽ phải hỏi các bạn một lần nữa ...AVPlayer không được đồng bộ

Tôi đang xây dựng một ứng dụng iPhone sử dụng ba phiên bản AVPlayer. Tất cả họ đều chơi cùng một lúc và điều rất quan trọng là họ làm như vậy. Tôi đã từng chạy mã này:

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]; 

hoạt động hoàn hảo. Nhưng một vài ngày trước nó chỉ ngừng hoạt động, ba người chơi bị trì hoãn khoảng 300-400ms (đó là cách để nhiều, mọi thứ dưới 100ms sẽ không sao). Hai trong số AVPlayer này có một số xử lý âm thanh, mất nhiều thời gian hơn AVPlayer "bình thường", nhưng nó được sử dụng để hoạt động trước và thuộc tính currentTime cho tôi biết rằng các trình phát này bị trì hoãn, vì vậy việc đồng bộ hóa dường như không thành công. Tôi không biết tại sao nó ngừng hoạt động, tôi đã không thực sự thay đổi một cái gì đó, nhưng tôi đang sử dụng một người quan sát, nơi tôi có thể yêu cầu tài sản self.playerX.currentTime, điều này làm tôi chậm trễ khoảng .3- .4 giây ... Tôi đã cố gắng đồng bộ hóa lại các trình phát nếu trì hoãn> .1f nhưng sự chậm trễ vẫn còn đó. Vì vậy, tôi nghĩ rằng việc xử lý âm thanh của player1 và 2 không thể được responsable cho sự chậm trễ, như tài sản currentTime không biết họ đang bị trì hoãn (tôi hy vọng bạn biết những gì tôi có ý nghĩa). Có lẽ một người nào đó của các bạn biết tại sao tôi lại có một sự chậm trễ khủng khiếp như vậy, hoặc có thể cung cấp cho tôi một ý tưởng khác.

Cảm ơn trước!

Trả lời

13

Vì vậy, tôi đã tìm thấy giải pháp. Tôi quên [self.playerX prerollAtRate:]. Tôi nghĩ rằng nếu người quan sát là AVPlayerReadyToPlay nó có nghĩa là, người chơi là "thực sự" đã sẵn sàng. Sự thật là nó không như vậy. Sau khi AVPlayer là readyToPlay, nó phải được cuộn trước. Khi đã xong, bạn có thể đồng bộ hóa với nhau. Sự chậm trễ bây giờ là một nơi nào đó tại 0.000006 giây.

+0

Cảm ơn bạn đã chia sẻ, giải pháp này rất hữu ích. –

+0

Điều đó có hoạt động với các tài sản từ xa không? – zevarito

+0

Cảm ơn Max, bạn có thể chỉnh sửa câu trả lời của mình để bao gồm mã gốc không? Tôi không hiểu, setRate có được gọi cho mỗi người chơi trong trình xử lý hoàn thành của prerollAtRate không? –

Các vấn đề liên quan