对于HTTP直播,iOS AVAsset.duration为零,但适用于渐进式

我有一个iOS应用程序,从HTTP Live流“playlist.m3u8”播放video,我有一个使用AVPlayer创建的自定义播放器。 为了处理正常的用户交互,例如擦洗,我需要获取video的持续时间,但出于某种原因,在使用xcode 4.0的iOS 4.3上,当我调用以下代码时,我得到一个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]; 

感谢任何人都可以提供的任何帮助。

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

上面的文档提到现在应该从AVPlayerItem实例获取持续时间,而不是它的相应AVAsset 。 为了通过键值观察获得当前玩家项目的持续时间,我使用以下方法(最初是从为iOS 4.0编写的NGMoviePlayer ):

 - (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的持续时间可以是不同的并且可以在其播放时改变。