【问题标题】:AVPlayer buffering, pausing notification, and poster frameAVPlayer 缓冲、暂停通知和海报帧
【发布时间】:2012-05-25 19:28:39
【问题描述】:

我有一些与AVPlayer 相关的问题:

  1. 当我们暂停AVPlayer[player pause] 时,AVPlayer 是继续缓冲来自网络的视频还是停止?我在苹果的文档中找不到与此相关的任何信息。另外,是否可以强制 AVPlayer 在暂停时保持缓冲,这样如果我们暂停的视频正在等待第一个视频结束,那么我们不会发现视频之间有任何间隙?

  2. 在暂停AVPlayer 时,我们可以在[player pause] 上进行任何活动。

  3. 我们可以在AVPlayer 上显示几秒钟的静止图像吗?

谢谢

【问题讨论】:

  • 查看 AVQueuePlayer 以进行多项目连续无间隙播放。
  • 已经使用过了,它不处理流式音频/视频内容,我已经使用 AVPlayer 完成了。谢谢
  • @OmerWaqasKhan 用Charles观察你的app的网络包,你可以看到播放器在暂停的时候还是会发送网络请求
  • @OmerWaqasKhan 一种解决方法是将nil 发送到replaceCurrentItemWithPlayerItemviewWillAppear,用旧的替换
  • 关注这个答案。 stackoverflow.com/questions/4218090/…可能对你有帮助。

标签: iphone ios avfoundation avplayer


【解决方案1】:

1) AVPlayer 将在几种情况下缓冲视频,没有明确记录。我会说您可以在初始化视频和替换当前项目时进行缓冲。 您可以观察currentItem.loadedTimeRanges 以了解发生了什么。该属性会告诉您已加载哪些视频时间范围。

此外,还有一些其他 currentItem 属性可能对您有所帮助:playbackLikelyToKeepUpplaybackBufferFullplaybackBufferEmpty

实现完美无间隙播放并非易事。

/* player is an instance of AVPlayer */
[player addObserver:self 
         forKeyPath:@"currentItem.loadedTimeRanges" 
            options:NSKeyValueObservingOptionNew 
            context:kTimeRangesKVO];    

observeValueForKeyPath:ofObject:change:context::

if (kTimeRangesKVO == context) {
   NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey];
   if (timeRanges && [timeRanges count]) {
       CMTimeRange timerange = [[timeRanges objectAtIndex:0] CMTimeRangeValue];
       NSLog(@" . . . %.5f -> %.5f", CMTimeGetSeconds(timerange.start), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration)));
   }
}

2) 请留意player.rate

[player addObserver:self 
         forKeyPath:@"rate" 
            options:NSKeyValueObservingOptionNew 
            context:kRateDidChangeKVO];

然后在你的observeValueForKeyPath:ofObject:change:context::

    if (kRateDidChangeKVO == context) {
        NSLog(@"Player playback rate changed: %.5f", player.rate);
        if (player.rate == 0.0) {
            NSLog(@" . . . PAUSED (or just started)");
        }
    }

3) 您可以使用build a movie of a given length using a still image,但在播放器顶部使用普通的UIImageView 会更容易。需要时隐藏/显示它。

示例项目:随意使用the code I wrote to support my answer

【讨论】:

  • thanx madmw,我们可以强制 avplayer 在暂停状态下保持缓冲吗?
  • AFAIK 没有公共 api 可用于 AVPlayer 缓冲区。如果您想在暂停点之后继续缓冲,您可以假装暂停:继续播放无音量并隐藏视图,然后使用 seekToTime 恢复播放。
  • 谢谢!一个具体的例子很有帮助。
  • 我删除了“kTimeRangesKVO”观察者,但它没有删除并不断调用请帮助我
  • @JaiminPatel 你知道用这么少的信息来帮助你很难,几乎不可能,对吧?添加更详细的评论或考虑提出不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2023-03-20
  • 2011-11-26
  • 2012-06-30
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多