iOS AVAsset.duration равен нулю для прямой трансляции HTTP, но работает для прогрессивной - PullRequest
11 голосов
/ 10 мая 2011

У меня есть приложение для iOS, которое воспроизводит видео из потока HTTP Live "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 Ответ

8 голосов
/ 11 мая 2011

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, а docs указывает:

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

...