【问题标题】:How to show buffer progress on AVPlayer?如何在 AVPlayer 上显示缓冲区进度?
【发布时间】:2015-09-23 03:56:14
【问题描述】:

我有一个音乐播放器应用程序,允许用户从服务器流式传输歌曲。我已经能够使用 AVPlayer 从 url 流式传输歌曲。我想实现以下目标:

我已尝试将此How to get file size and current file size from NSURL for AVPlayer iOS4.0 帖子中的最佳答案转换为 swift,但我找不到“kLoadedTimeRanges”。

这是我的代码:

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {

    if object as? NSObject == songPlayer && keyPath == "status" {

        if songPlayer?.status == AVPlayerStatus.Failed {

            println("AVPlayerStatusReadyToFailed")

        }else if songPlayer?.status == AVPlayerStatus.ReadyToPlay {

            println("AVPlayerStatusReadyToPlay")
            self.songPlayer!.play()

        }else if songPlayer?.status == AVPlayerStatus.Unknown {

            println("AVPlayerStatusReadyToUnknown")

        }

    }
}

@IBAction func playAction(sender: UIButton) {

    var songUrl = "http://a575.phobos.apple.com/us/r1000/119/Music/v4/67/9d/b0/679db0ba-a7f4-35ea-3bf1-e817e7bcf11f/mzaf_3227008615944938675.aac.m4a"
    var songPlayerItem = self.songPlayer?.currentItem
    self.songPlayer = AVPlayer(URL: NSURL(string: songUrl))
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.songPlayer?.currentItem)

    self.songPlayer?.addObserver(self, forKeyPath: "status", options: nil, context: nil)
    //NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "updateProgress:", userInfo: nil, repeats: true)

}

我会很感激任何建议,不管是使用 Objective c 还是 swift

【问题讨论】:

    标签: ios iphone progress-bar audio-streaming avplayer


    【解决方案1】:

    目标 C: 注意:我制作了一个自定义 UISlider (Buffer Slider),在其中添加了一个 UIProgressView 来显示缓冲区进度。下面代码中显示的setBufferValue 方法是一个自定义方法,它将设置UIProgressView 值。

    static void *PlayerViewControllerLoadedTimeRangesObservationContext = &PlayerViewControllerLoadedTimeRangesObservationContext;
    
    [self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:PlayerViewControllerLoadedTimeRangesObservationContext];
    
    - (void)observeValueForKeyPath:(NSString*) path
                          ofObject:(id)object
                            change:(NSDictionary*)change
                           context:(void*)context
    {
        if (context == PlayerViewControllerLoadedTimeRangesObservationContext) {
            NSArray *timeRanges = (NSArray*)[change objectForKey:NSKeyValueChangeNewKey];
    
            if (timeRanges && [timeRanges count]) {
                CMTimeRange timerange=[[timeRanges objectAtIndex:0]CMTimeRangeValue];
                float bufferTimeValue=CMTimeGetSeconds(timerange.duration)/CMTimeGetSeconds(_player.currentItem.duration);
                [self.playerSlider setBufferValue:bufferTimeValue>.95?1:bufferTimeValue animated:YES];
            }
        }
    }
    

    【讨论】:

    • 为什么这个代码没有被接受?非常简单实用。
    【解决方案2】:

    只需使用

    [avPlayerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil];
    

    kLoadedTimeRanges 可能只是定义为

    static NSString *kLoadedTimeRanges = @"loadedTimeRanges";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多