在应用速率大于2倍的情况下,从avplayer进行干活播放
我想调整Avplayer的速度,我可以做的帮助
[_avplayer play]; [_avplayer setRate:1.5];
还禁用了音轨,当它低于2.0时运行良好。 但是,如果我们将其应用于2X以上,则会导致video粗糙或不平整。
当我search这个 – 我发现这个链接暗示相同的行为
https://developer.apple.com/library/content/qa/qa1772/_index.html
以超过2.0的速率播放可能会导致数据速率或其他以特定速率播放的处理要求超出AVFoundation的能力跟上时的抖动或断断续续播放。 在这些情况下,AVPlayer会自动降低播放质量,以便跟上stream行情况,采用一系列后备策略。 一层劣化是在video子stream内只解码和显示I帧,这确实看起来是波涛汹涌的。
任何人都可以帮助,如果是这样,比我用什么办法来实现呢?
作为@Rhythmicbuild议这些方法可以实施,但这些都是一种麻烦。 我search了更多,find了一个方法,它工作得很好,没有混蛋或波涛汹涌。
只是不要设定费率,这样设定费率。 首先创buildAVPlayer,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倍以上的速度。
你可以尝试几件事情:
- 降低video的帧率
- 在video中添加更多的I帧(考虑到QA-1772的build议 ,这可能会稍微不正确)
- 以更低的分辨率解码(或更好地编码)video
- 降低video的比特率
- 测量比实时
AVAssetReader
更快的速度,如果您认为某些性能在传输过程中已经丢失,则可以用自己的Metal
+AVAssetReader
pathreplaceAVPlayer
并进行replace。 不要忘了考虑audio,如果你走这条路。
这似乎是AVFoundation中的一个错误。 它可以在许多video中快速播放,在大多数情况下,它不会。 例如,可以使用AVPlayerView的浮动控制器样式来显示一个快进button。 重复单击此button会导致平滑,快速的播放,只需设置AVPlayer.rate
不会。
在我对这个问题的回答中,我解释了这个问题的解决办法。