【问题标题】:MPMovieplayerController playableDuration fluctuating for m3u8 filesMPMovieplayerController playableDuration 为 m3u8 文件波动
【发布时间】:2012-12-28 03:18:31
【问题描述】:

我正在缓冲一个 m3u8 格式的视频,并将此 url 设置为 MPMovieplayerController 的 contenturl

我正在运行一个每 0.3 秒运行一次的后台线程,我用它来检查缓冲和播放的持续时间并相应地执行检查

if(!mPlaybackProgressTimer)
    mPlaybackProgressTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(didPlayback:) userInfo:nil repeats:YES] retain];

在didplayback中

..

- (void)didPlayback:(id)sender {

    NSTimeInterval totalDuration = [mVideoPlayerController duration];

    NSTimeInterval playbackTime = [mVideoPlayerController currentPlaybackTime];
    float playbackProgress = 0.0;

   if(playbackTime > 0.0 && totalDuration > 0.0)
       playbackProgress = playbackTime / totalDuration;

   mPercentWatched = round(100 * playbackProgress);

   NSTimeInterval bufferedTime = [mVideoPlayerController playableDuration];
   float bufferProgress = 0.0;

   if(playbackTime > 0.0 && totalDuration > 0.0)
       bufferProgress = bufferedTime / totalDuration;

   [self setProgress:bufferProgress forProgressType:eProgressTypeBuffer];
   [self setProgress:playbackProgress forProgressType:eProgressTypePlay];
}

问题是 bufferedTime 在某些情况下会波动:-
- 我将 m3u8 文件分成不同的文件,用于不同的分辨率和比特率
- 我有一个 index.m3u8 文件,它决定了哪个 m3u8 文件服务于什么带宽
- 当然,它不会提供整个 m3u8 文件,而是提供单个 *.ts 文件,这取决于用户如何在没有任何延迟的情况下获得最佳体验(所有这些都在内部管理) - 我也按照apple developer guidelines 遵循了这一切

我不确定为什么会发生波动,但对我来说似乎有意义的是 .. 缓冲了一定数量的数据,但我认为数据可能被丢弃(只是一个理论)

注意:我正在使用 encoding.com 来分割媒体

更新:日志

2013-01-14 11:46:57.731 IronStudios[7724:c07] 缓冲进度:0.139779
2013-01-14 11:46:57.930 IronStudios[7724:c07] 缓冲进度:0.139779
2013-01-14 11:46:58.130 IronStudios[7724:c07] 缓冲进度:0.139790
2013-01-14 11:46:58.331 IronStudios[7724:c07] 缓冲进度:0.139790
2013-01-14 11:46:58.530 IronStudios[7724:c07] 缓冲进度:0.125042
2013-01-14 11:46:58.730 IronStudios[7724:c07] 缓冲进度:0.126391
2013-01-14 11:46:58.930 IronStudios[7724:c07] 缓冲进度:0.124450
2013-01-14 11:46:59.130 IronStudios[7724:c07] 缓冲进度:0.125799

如您所见,某些实例的缓冲区进度正在减少。

【问题讨论】:

  • 您为什么希望 playableDuration 保持固定?播放器正在预读并同时播放。
  • 您能否添加一些 NSLog 来显示一段时间内的 bufferedTime,并将其包含在您的问题中?
  • @danh 对不起,我不清楚 .. 通过波动我真正的意思是持续时间正在减少 ..

标签: ios objective-c video-streaming mpmovieplayercontroller http-live-streaming


【解决方案1】:

时长可以根据下载量得出,而 playableDuration 可以根据可以播放的内容得出。

iOS 只会在整个块下载完成后开始播放 mpeg2-ts 块。

假设您使用 10 秒的块。

Downloaded: 2.2 chunks (22 seconds)
Playable:   2   chunks (20 seconds)
Progress bar = 2 / 2.2 = ~91%

几秒钟后......

Downloaded: 2.9 chunks (29 seconds)
Playable:   2   chunks (20 seconds)
Progress bar = 2 / 2.9 = ~69%

你的进度条倒退了...

几秒钟后......

Downloaded: 3.1 chunks (31 seconds)
Playable:   3   chunks (30 seconds)
Progress bar = 3 / 3.1 = ~97%

然后再次转发...

【讨论】:

  • 好吧,我在尝试计算缓冲时间时正在考虑 playableDuration,正如您所看到的,只有在下载了整个块后才会增加 .. 我是对的 .. 吗?
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2011-08-08
  • 2021-02-26
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多