【问题标题】:Buffer size for AVPlayer / AVPlayerItemAVPlayer / AVPlayerItem 的缓冲区大小
【发布时间】:2014-01-28 08:40:13
【问题描述】:

我正在为 iOS 创建一个流式广播应用程序,我想调整 AVPlayer 和 AVPlayerItem 的属性,以便在有损连接条件下提供更可靠的播放。 我想增加缓冲区大小。

我能找到的唯一答案是here

有没有办法在不使用 OpenAL 的情况下实现这一目标?

【问题讨论】:

标签: ios objective-c avaudioplayer avplayer


【解决方案1】:

在您的观察者方法中添加以下代码。

NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey];
CMTimeRange timerange = [timeRanges[0] CMTimeRangeValue];

CGFloat smartValue = CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration));
CGFloat duration   = CMTimeGetSeconds(self.player.currentTime);
if(smartValue - duration > 5 || smartValue == duration) {
      // Change the value "5" to your needed secs, its the buffer size.
      // Play the video
}

我已经实施并且效果很好。

引用自:https://stackoverflow.com/a/7730708/2315453

【讨论】:

  • 我无法理解更改“5”会如何改变播放器的实际缓冲量?请解释
  • 你能解释一下吗?您要更新哪个值?
  • stackoverflow.com/questions/4495433/… 这可能会有所帮助。
  • totalDuration = avplayerItem.duration;是总视频持续时间。持续时间 = 玩家头顶当前位置。 smartValue = 我们在缓冲区中的视频总秒数。 smartValue - duration > 5 = 这表明我们在缓冲区中有 5 秒以上的视频。
  • smartValue 如何表示它包含 CMTimeRange.start 的加载持续时间? CMTimeRange.start 可能是 300 秒,CMTimeRange.duration 可能是 20 秒。您确定总缓冲区大小为 320 秒吗?
【解决方案2】:

请看这里:AVPlayer streaming progress

在这里:How to get file size and current file size from NSURL for AVPlayer iOS4.0

您可以观察播放器的属性“currentitem.loadedTimeRanges”,当事件被抛出时,您可以在开始播放之前检查缓冲了多少。这是我如何使用它的示例:

#define VIDEO_BUFFER_READY_PERCENT      0.3

- (void)viewDidLoad{
    [super viewDidLoad];
    [self.player addObserver:self forKeyPath:@"currentItem.loadedTimeRanges" options:NSKeyValueObservingOptionNew context:&kTimeRangesKVO];
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (context == &kTimeRangesKVO) {

    float percent = CMTimeGetSeconds(timerange.duration) / CMTimeGetSeconds(self.player.currentItem.duration);
                if (percent > VIDEO_BUFFER_READY_PERCENT) {
                    NSLog(@" . . . %.5f -> %.5f, %f percent", CMTimeGetSeconds(timerange.duration), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration)), percent);
                    [self.player prerollAtRate:0.0 completionHandler:^(BOOL finished) {
                    [self.player seekToTime:kCMTimeZero];
                }

    }
    else{
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }

【讨论】:

  • 你的回答告诉我如何观察/检索缓冲区,但它没有告诉我如何增加缓冲区大小。
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 2020-09-05
  • 2014-06-10
  • 2015-06-05
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多