2016-11-09 54 views
1

我想调整Avplayer率越大,我能够做的生涩的播放上应用率超过2倍

[_avplayer play]; 
[_avplayer setRate:1.5]; 

也被禁止音轨的帮助下,它运行良好时,它小于2.0。 但是,当我们将其应用于2X以上时,会导致图像不稳定或不平整。

当我一派了解这个 - 我发现这个链接提示相同的行为

https://developer.apple.com/library/content/qa/qa1772/_index.html

在速率大于2.0会导致不平稳或断断续续播放播放时的数据速率或其它处理要求的 以指定的速度播放超过AVFoundation的能力,以 跟上。在这些情况下,AVPlayer会自动降低播放质量 以保持速度,并根据主要条件采用一系列的回退 策略。一层劣化 将解码并仅显示视频子流内的I帧,并且这确实可能看起来是波涛汹涌。

任何人都可以帮助,如果是这样,比我用什么方法实现相同?

回答

6

作为@Rhythmic建议这些方法可以实现,但这些都有点麻烦。我搜索了更多,并找到了一种方法,它工作得很好,没有混乱或波涛汹涌。

只要不设定费率,就这样设定费率。首先创建AVPlayer,AVPlayerItem和AVAsset的实例。

AVMutableComposition *composition = [AVMutableComposition composition]; 
     NSError *error = nil; 
     [composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
          ofAsset:asset 
           atTime:kCMTimeZero error:&error]; 
     [composition scaleTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
         toDuration:CMTimeMultiplyByFloat64(asset.duration, 1/rate)]; 
     AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:composition]; 
     self.avRefPlayer = [AVPlayer playerWithPlayerItem:playerItem]; 

     self.avRefPlayerLayer = [AVPlayerLayer layer]; 

     [self.avRefPlayerLayer setPlayer:self.avRefPlayer]; 
     [self.avRefPlayerLayer setFrame:_refrencedView.bounds]; 
     [self.avRefPlayerLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 

该代码甚至可以轻松支持2倍或4倍以上的速度。

+1

魔法!它是如何工作的?我印象深刻。 –

+1

FWIW,我创建的两个应用程序 - 一个在Objective-C中,另一个在Swift中 - 都表现出这个问题。值得注意的是,这个问题不是媒体文件:例如,Quicktime Player可以非常快速地播放它,而我的应用程序看起来不会超过大约1.5倍。我刚刚在Swift中实现了上面的内容,发现它确实有效。例如,我可以播放9x,没问题。 – Jamborino

+1

这很好。然而,通过调整时间尺度变化并进行正确的搜索,在播放视频的同时改变速度仍然非常困难,没有奇怪的帧跳跃。由于该框架显然能够以高速运行,我还是不明白'rate'属性不支持它... – deadbeef

1

你可以尝试一些事情:

  1. 下您的视频
  2. 添加更多的I帧到视频的帧率(这可能会稍微乖张,考虑QA-1772's advice
  3. 解码(或更好的编码)在较低分辨率的视频
  4. 降低视频的比特率
  5. 测量比实时AVAssetReader可以解码多快&用您自己的Metal替换AVPlayer + AVAssetReader如果您认为某些性能在运输过程中已经丢失,则路径为。不要忘记考虑音频,如果你走这条路。
0

这似乎是AVFoundation中的一个错误。它可以以很快的速度播放许多视频,在大多数情况下,它不会。例如,可以使用AVPlayerView的浮动控制器样式来显示快进按钮。重复单击此按钮会导致平滑,快速播放,只需设置AVPlayer.rate就不会。

在我的回答this question我解释了这个问题的解决方法。