【问题标题】:How to get file size and current file size from NSURL for AVPlayer iOS4.0如何从 AVPlayer iOS4.0 的 NSURL 获取文件大小和当前文件大小
【发布时间】:2010-10-22 17:10:37
【问题描述】:
self.player = [[AVPlayer playerWithURL:[NSURL URLWithString:@"http://myurl.com/track.mp3"]] retain];

我正在尝试为上述曲目制作 UIProgressView。如何从该 URL 获取文件大小和当前文件大小?请帮忙,谢谢!

【问题讨论】:

    标签: iphone avfoundation


    【解决方案1】:

    你需要开始观察当前项的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
    }
    

    【讨论】:

    • kLoadedTimeRanges 应该代表什么?我在任何地方都找不到这个
    • 只是为了防止复制和粘贴错误。确保你测试了 count > 0 的时间数组。在 iOS 8 中它可以返回一个空数组。
    【解决方案2】:

    我认为您不想了解有关文件大小的任何信息,但您对时间更感兴趣。

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

    【讨论】:

    • 是的,我正在制作带有持续时间的滑块。但是如果用户幻灯片通过了加载的内容,那就是坏消息了。所以我想要下载/播放曲目的进度,对吗?这有意义吗?
    • 我明白,我不确定这一点,但您可能希望仅在 self.player.currentItem.loadedTimeRanges 指定的范围内启用搜索。
    • 是的,我也需要这样做。但是对于用户来说,看看已经加载了什么仍然会很好。就像一个真正的流光。
    • 嗨,Michal,你能解释一下如何使用loadedTimeRange吗?我不知道如何从 CMTimeRange 获取持续时间。
    【解决方案3】:

    @"loadedTimeRange" 是 AVPlayerItem 类的 KVO 值。您可以在

    的 AVPlayerItem.h 文件中找到它的定义
    @interface AVPlayerItem (AVPlayerItemPlayability)
    

    类别定义。

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      相关资源
      最近更新 更多