2017-02-05 41 views
5

Używam AVPlayer do odtwarzania plików mp3 ze zdalnego adresu URL. Mam pewne problemy z początkowym czasem ładowania pliku mp3, jest bardzo wolny (około 5-8 sekund).
Porównałem go z innymi graczami będącymi stronami trzecimi i znacznie wolniej, porównałem go również z odtwarzaczem Android i jest on również znacznie wolniejszy.
więc problem nie jest z samej ani z połączeniem sieciowym url ..AVPlayer powolne ładowanie

kolejnym interesującym punktem jest to, że po rozpoczęciu AVPlayer odtwarzanie mp3, poszukiwanie jest bardzo szybka (prawie natychmiast), to znaczy, pobieranie player cały plik mp3 przed rozpoczęciem odtwarzania, i to jest powód, dlaczego jest tak powolny?
Czy mogę kontrolować to zachowanie? jeśli nie, wszelkie inne pomysły, co może być przyczyną?

+0

Może pokrewne: http://stackoverflow.com/questions/11171374/how-to-reduce-ios-avplayer-start-delay – Lukas

Odpowiedz

2

AVPlayer ma kilka nowych funkcji (na iOS 10+), które możesz wypróbować. Użyłem go sam i wszystko działało poprawnie.

/*! 
@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); 

Dodatkowo można sprawdzić tę zmienną (można użyć KVO dla niego zbyt):

/*! 
    @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

Oto, co o tym myślę.

Ten inny plik ma różne atomy ruchu, więc jeśli w takim pliku, jeśli ruch atomu był pierwszy, ten plik jest odtwarzany z buforowaniem. Ten plik jest pobierany z częściami, a jego odtwarzanie jest kontynuowane z buforowaniem.

W innym przypadku, w przypadku przeniesienia pliku, atom jest w końcu pierwszym plikiem pobranym, a następnie odtwarzanym. Więc myślę, że to twój przypadek, dlatego mp3 opóźnia trochę czasu, by pobrać cały mp3.

Możesz zmienić atom ruchu na taki plik z kodowaniem. Sprawdź tę odpowiedź Move and fix moov atom of video recorded on phone iOS

+0

AFAIK, pliki MP3 nie mają atomy Moov, jak te są specyficzne dla strumieni wideo MPEG4. – Jules