应用率大于2倍的avplayer播放

ksh*_*ara 1 video objective-c playback ios avplayer

我想调整Avplayer率,我可以帮忙

[_avplayer play];
[_avplayer setRate:1.5];
Run Code Online (Sandbox Code Playgroud)

同样禁用音轨,当它小于2.0时运行良好.但是当我们应用它大于2X时,会导致Choppy或jerky视频.

当我搜索这个 - 我发现这一个链接暗示相同的行为

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

当以指定速率播放的数据速率或其他处理要求超过AVFoundation跟上的能力时,以大于2.0的速率播放可能导致回放不稳或不稳定.在这些情况下,AVPlayer会自动降低播放质量以便跟上,采用一系列后备策略,具体取决于主要条件.一层退化是在视频子流内仅解码和显示I帧,这确实看起来很不稳定.

任何人都可以帮忙,如果是这样的话,我应该用什么方法来达到目的?

ksh*_*ara 7

正如@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];
Run Code Online (Sandbox Code Playgroud)

此代码甚至可以轻松支持超过2倍或4倍的速度.