Jerky playback from avplayer on Applying Rate greater than 2x

后端 未结 4 654
难免孤独
难免孤独 2021-01-07 00:15

I want to tweak Avplayer rate , I able to do with help of

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

Also disabled audio tracks , it is ru

相关标签:
4条回答
  • 2021-01-07 00:43

    Thanks to Kshitij Godara.

    Converted to Swift 4.

    let timeRange = CMTimeRangeMake(kCMTimeZero, CMTime(seconds: videoDuration, preferredTimescale: 1))
    let composition = AVMutableComposition()
    try composition.insertTimeRange(timeRange,
                                   of: asset,
                                   at: kCMTimeZero)
    composition.scaleTimeRange(timeRange, toDuration: CMTimeMultiplyByFloat64(asset.duration, Float64(1.0 / rate)))
    let playerItem = AVPlayerItem(asset: composition)
    let player = AVPlayer(playerItem: playerItem)
    player.play()
    
    0 讨论(0)
  • 2021-01-07 00:45

    You could try a few things:

    1. lower the framerate of your video
    2. add more I-frames to your video (this may be slightly perverse, considering QA-1772's advice)
    3. decode (or better? encode) the video at a lower resolution
    4. lower the bitrate of the video
    5. measure how much faster than realtime AVAssetReader can decode at & replace AVPlayer with your own Metal + AVAssetReader path if you think that some performance has gotten lost in transit. Don't forget to consider audio, too, if you take this path.
    0 讨论(0)
  • 2021-01-07 00:47

    This seems to be a bug in AVFoundation. It can play smoothly at fast rates for many videos where, under most circumstances, it doesn't. For example, one can use AVPlayerView's floating controller style to expose a fast-forward button. Clicking this button repeatedly results in smooth, fast playback where simply setting AVPlayer.rate does not.

    In my answer to this question I explain a workaround for this problem.

    0 讨论(0)
  • 2021-01-07 00:48

    As @Rhythmic suggested these ways can be implemented but these all are kind of hassle . I googled it more and found a way and it is working very fine no jerk or choppy .

    Just do not set rate , set Rate like this . First create instance of AVPlayer , AVPlayerItem and 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];
    

    this code can even support more than 2x or 4x speed easily .

    0 讨论(0)
提交回复
热议问题