2017-02-05 16 views
5

Tôi đang sử dụng AVPlayer để phát các tệp mp3 từ một url từ xa. Tôi đang gặp một số vấn đề với thời gian tải ban đầu của mp3, nó rất chậm (khoảng 5-8 giây).
tôi đã so sánh nó với người chơi bên thứ ba khác và chậm hơn nhiều, tôi cũng so sánh nó với trình phát android và nó cũng chậm hơn nhiều.
vì vậy vấn đề không phải là với các url bản thân cũng không phải với kết nối mạng ..AVPlayer tải chậm

một điểm thú vị là sau khi AVPlayer bắt đầu chơi nhạc mp3, tìm kiếm rất nhanh (gần như ngay lập tức), điều đó có nghĩa việc tải xuống máy nghe nhạc toàn bộ tập tin mp3 trước khi bắt đầu chơi, và đó là lý do nó quá chậm?
tôi có thể kiểm soát hành vi này không? nếu không, bất kỳ ý tưởng nào khác có thể là lý do gì?

+0

Có thể liên quan: http://stackoverflow.com/questions/11171374/how-to-reduce-ios-avplayer-start-delay – Lukas

Trả lời

2

AVPlayer có một số chức năng mới (cho iOS 10+), mà bạn có thể dùng thử. Tôi đã tự sử dụng nó và mọi thứ đều hoạt động tốt.

/*! 
@method  playImmediatelyAtRate: 
@abstract  Immediately plays the available media data at the specified rate. 
@discussion 
When the player's currentItem has a value of NO for playbackBufferEmpty, this method causes the value of rate to change to the specified rate, the value of timeControlStatus to change to AVPlayerTimeControlStatusPlaying, and the receiver to play the available media immediately, whether or not prior buffering of media data is sufficient to ensure smooth playback. 
If insufficient media data is buffered for playback to start (e.g. if the current item has a value of YES for playbackBufferEmpty), the receiver will act as if the buffer became empty during playback, except that no AVPlayerItemPlaybackStalledNotification will be posted. 
*/ 
- (void)playImmediatelyAtRate:(float)rate NS_AVAILABLE(10_12, 10_0); 

Ngoài ra Bạn có thể kiểm tra biến này (Bạn có thể sử dụng KVO cho nó quá):

/*! 
    @property  reasonForWaitingToPlay 
    @abstract  Indicates the reason for waiting when the value of timeControlStatus is AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate 
    @discussion 
     When the value of timeControlStatus is AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate, this property describes why the player is currently waiting. It is nil otherwise. 
     You can use the value of reasonForWaitingToPlay to show UI indicating the player's waiting state conditionally. 
     This property is key value observable. 
     Possible values are AVPlayerWaitingWithNoItemToPlayReason, AVPlayerWaitingWhileEvaluatingBufferingRateReason, and AVPlayerWaitingToMinimizeStallsReason. 
    */ 

    @property (nonatomic, readonly, nullable) NSString *reasonForWaitingToPlay NS_AVAILABLE(10_12, 10_0); 
-1

Ở đây, Những gì tôi nghĩ về nó.

Tệp khác có các nguyên tử di chuyển khác nhau, Vì vậy, nếu trong tệp đó nếu nguyên tử di chuyển đến trước thì tệp này sẽ phát bằng bộ đệm. Vì vậy, tập tin này tải về với các bộ phận và nó đang chơi tiếp tục với bộ đệm.

Trong trường hợp khác, trong nguyên tử di chuyển tệp cuối cùng, sau đó toàn bộ tệp được tải xuống sau đó nó phát. Vì vậy, tôi nghĩ rằng đó là trường hợp của bạn đó là lý do tại sao mp3 trì hoãn với một thời gian để tải về toàn bộ mp3.

Bạn có thể thay đổi nguyên tử di chuyển vào tệp đó bằng mã hóa. Hãy xem câu trả lời này Move and fix moov atom of video recorded on phone iOS

+0

AFAIK, tệp MP3 không có nguyên tử MOOV, vì chúng cụ thể cho các luồng video MPEG4. – Jules