1

我正在缓冲 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 文件,具体取决于用户如何立即获得最佳体验(所有这些都在内部进行管理) - 我也按照苹果开发者指南遵循了所有这些

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

注意:我使用 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]244 缓冲进度:0.1250
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

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

4

1 回答 1

0

持续时间可以从下载量得出,而 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%

并再次转发...

于 2013-01-14T06:43:29.243 回答