MPMovieplayerController playableDuration为m3u8文件波动

时间:2013-01-14 05:43:59

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

我正在缓存一个m3u8格式的视频,我将此网址设置为MPMovieplayerController的内容

我正在运行一个每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

正如您所看到的,某些情况下缓冲进度正在减少

对此问题的任何帮助将不胜感激

谢谢,

1 个答案:

答案 0 :(得分: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%

再转发......