2010-10-22 112 views

回答

0

我认为你不想知道关于文件大小的任何事情,但你对时代更感兴趣。

尝试self.player.currentItem.asset.duration持续当前播放项目,self.player.currentTime当前时间。

+0

是的,我制作滑块的持续时间。但是,如果用户幻灯片通过了什么是加载的,那么坏消息。所以我想要下载/播放曲目的进度,是吗?那有意义吗? – slowman21 2010-10-22 22:08:56

+0

我明白了,我不确定这一点,但是您可能希望仅在“self.player.currentItem.loadedTimeRanges”中指定的范围内启用搜索。 – Michal 2010-10-23 08:49:57

+0

是的,我也需要这样做。但仍然会让用户看到已加载的内容。就像一个真正的流光。 – slowman21 2010-10-25 14:48:43

5

你需要开始观察当前项目的loadedTimeRanges财产,像这样:

AVPlayerItem* playerItem = self.player.currentItem; 
[playerItem addObserver:self forKeyPath:kLoadedTimeRanges options:NSKeyValueObservingOptionNew context:playerItemTimeRangesObservationContext]; 

然后,在观察回调,你让你通过这样的数据的意义:

-(void)observeValueForKeyPath:(NSString*)aPath ofObject:(id)anObject change:(NSDictionary*)aChange context:(void*)aContext { 

if (aContext == playerItemTimeRangesObservationContext) { 

    AVPlayerItem* playerItem = (AVPlayerItem*)anObject; 
    NSArray* times = playerItem.loadedTimeRanges; 

    // there is only ever one NSValue in the array 
    NSValue* value = [times objectAtIndex:0]; 

    CMTimeRange range; 
    [value getValue:&range]; 
    float start = CMTimeGetSeconds(range.start); 
    float duration = CMTimeGetSeconds(range.duration); 

    _videoAvailable = start + duration; // this is a float property of my VC 
    [self performSelectorOnMainThread:@selector(updateVideoAvailable) withObject:nil waitUntilDone:NO]; 
} 

然后在主线程中选择更新进度条,就像这样:

-(void)updateVideoAvailable { 

    CMTime playerDuration = [self playerItemDuration]; 
double duration = CMTimeGetSeconds(playerDuration); 
    _videoAvailableBar.progress = _videoAvailable/duration;// this is a UIProgressView 
} 
+0

kLoadedTimeRanges应该代表什么?我无法在任何地方找到这个 – 2012-01-25 00:20:41

+0

只是为了防止复制和粘贴错误。确保你在count 8时测试times数组。在iOS 8中,它可以返回一个空数组。 – 2014-09-19 17:26:12

0

@“loadedTimeRange”是AVPlayerItem类的KVO值。你可以在AVPlayerItem.h文件中找到它的定义,在

@interface AVPlayerItem (AVPlayerItemPlayability) 

类别定义。