AVPlayer缓冲、暂停通知和海报帧

16

我有一些关于AVPlayer的问题:

  1. 当我们通过[player pause]暂停AVPlayer时,它是否仍然从网络缓冲视频,还是只是停止?我在苹果的文档中找不到任何相关信息。另外,是否可以强制 AVPlayer 在暂停时保持缓冲,这样如果我们暂停的视频正在等待第一个视频结束,那么就不会在视频之间出现任何间隙了?

  2. 在暂停AVPlayer时,我们是否可以在[player pause]上有任何事件?

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

谢谢


请查看 AVQueuePlayer,以进行多项连续无间隙播放。 - MikeyWard
已经使用过了,但它无法处理流式音频/视频内容,我已经使用AVPlayer完成了。谢谢。 - Omer Waqas Khan
@OmerWaqasKhan 使用Charles观察您的应用程序的网络数据包,您会发现在暂停时玩家仍会发送网络请求。 - onmyway133
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - onmyway133
请参考这个答案:https://dev59.com/1m855IYBdhLWcg3wp2J0#39036307 这可能对你有所帮助。 - iPatel
1个回答

39
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) 您可以使用静态图像制作指定长度的电影,但更容易使用常规UIImageView放在播放器上方。需要时隐藏/显示它。

示例项目:随意使用我编写的支持答案的代码


1
谢谢madmw,我们能否在暂停状态下强制AVPlayer继续缓冲? - Omer Waqas Khan
据我所知,目前没有公共API可以处理AVPlayer缓冲区。如果您想在暂停点之后继续缓冲,可以模拟暂停:保持播放但关闭声音和隐藏视图,然后使用seekToTime来恢复播放。 - djromero
@JaiminPatel,你知道仅凭那么少的信息帮助你是困难的,甚至几乎不可能吗?请添加更详细的评论或考虑提出不同的问题。 - djromero
请使用 appDelegate.player.currentItem 替代 appDelegate.player 来添加和移除观察者。当然,应该将 forKeyPath:@"currentItem.loadedTimeRanges" 更改为 forKeyPath:@"loadedTimeRanges"。 - Borzh
请参考这个答案:https://dev59.com/1m855IYBdhLWcg3wp2J0#39036307 这可能对你有所帮助。 - iPatel
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接