我有一个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];
感谢任何人提供的任何帮助。
答案 0 :(得分:8)
上面的文档提到现在应该从AVPlayerItem
实例获取持续时间,而不是相应的AVAsset
。为了通过键值观察获得当前玩家项目的持续时间,我使用以下方法(最初是从为{i} 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,docs指定:
特别是,基于流的媒体的URL资产报告的持续时间通常为kCMTimeIndefinite,而相应的AVPlayerItem的持续时间可能不同,并且可能在播放时发生变化。