iOS AVAsset.продолжительность равна нулю для HTTP live streaming, но работает для progressive

#ios #avplayer

#iOS #avplayer

Вопрос:

У меня есть приложение для iOS, которое воспроизводит видео из HTTP Live stream «playlist.m3u8», и у меня есть пользовательский проигрыватель, созданный с использованием AVPlayer. Для обработки обычных пользовательских взаимодействий, таких как очистка, мне нужно получить длительность видео, но по какой-то причине в iOS 4.3 с использованием xcode 4.0 при вызове следующего кода я получаю CMTime, который при преобразовании в секунды дает NaN — я знаю, что это делает, потому что CMTimeValue = 0 и CMTimeScale = 0, которые дают NaN и CMTimeFlags = 17, что еще более странно.

Вот код, который я использую, который совсем не сложный:

 AVPlayerItem *pItem = mPlayer.currentItem;
AVAsset* asset = pItem.asset;
CMTime d = asset.duration;
double duration = CMTimeGetSeconds(asset.duration);
  

Я должен также упомянуть, что я отслеживаю состояние загружаемого списка воспроизведения, чтобы убедиться, что он готов, прежде чем я начну воспроизведение / очистку:

 [mPlayer addObserver:self forKeyPath:@"currentItem.status" options:0 context:VideoPlaybackViewDelegateStatusContext];
  

Спасибо за любую помощь по этим вопросам, которую кто-либо может предоставить.

Комментарии:

1. Я забыл упомянуть, что это работает в iOS 4.2 — как в симуляторе, так и на устройстве.

Ответ №1:

https://developer.apple.com/library/ios/releasenotes/AudioVideo/RN-AVFoundation-Old/#//apple_ref/doc/uid/TP40011199-CH1-SW4

В документах выше упоминается, что продолжительность теперь должна быть получена из AVPlayerItem экземпляра, а не соответствующего ему AVAsset . Чтобы получить длительность из текущего элемента проигрывателя с помощью наблюдения за значением ключа, я использую следующий метод (первоначально взятый из NGMoviePlayer , который был написан для iOS 4.0):

 - (void)loadPlayerWithItem:(AVPlayerItem *)playerItem {
    self.player = [AVPlayer playerWithPlayerItem:playerItem];
    ...
    // changed this from previous value currentItem.asset.duration
    [self.player addObserver:self forKeyPath:@"currentItem.duration"
                                     options:0
                                     context:nil];
    ...
}
  

Я внедрил вышеуказанное изменение в свой проигрыватель, и теперь длительность работает! Это изменение в AVFoundation было основной причиной проблемы. CMTimeFlags = 17 указывает kCMTimeFlags_Indefinite и kCMTimeFlags_Valid, и в документах указано:

В частности, длительность, указываемая ресурсом URL для потокового мультимедиа, обычно равна kCMTimeIndefinite, в то время как длительность соответствующего AVPlayerItem может отличаться и может меняться во время воспроизведения.

Комментарии:

1. Большое спасибо darvids0n, и я чувствую себя глупо из-за того, что пропустил примечание к выпуску :-).

2. для меня все еще возвращается nan : (, используя iOS 9.0