美文网首页
AVPlayer无缝切换源

AVPlayer无缝切换源

作者: 黑暗森林的歌者 | 来源:发表于2018-08-02 11:42 被阅读195次

AVPlayer无缝切换源

很多时候播放视频都有视频清晰度的需求,用户自己选择想要观看的分辨率.

一般切换清晰度就是切换NSURL,需要重新加载视频,如果不做处理就会出现没有图像的黑屏,其实这是不是bug。如下图这样:

没有过度图像

1、其实做出类似无缝切换的效果也不是难事,可以在切换的时候获取当前播放时间点的视频截图,然后用一个UIImageView覆盖到当前的view

- (void)showVideoShotImage {
    // 获取当前player的 sset
    AVAsset *currentPlayerAsset = self.player.currentItem.asset;

    if ([currentPlayerAsset isKindOfClass:AVURLAsset.class]) {
        // 判断是否是 AVURLAsset,并转成 AVURLAsset
        AVURLAsset *asset = (AVURLAsset *)currentPlayerAsset;

        AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

        generator.appliesPreferredTrackTransform = YES;
        // 获取当前播放到的时间点
        CMTime time = CMTimeMakeWithSeconds(self.playingTime, 600);

        NSError *error = nil;

        CMTime actualTime;
        // 获取当前时间点的视频截图
        CGImageRef image = [generator copyCGImageAtTime:time actualTime:&actualTime error:&error];

        UIImage *shotImage = [[UIImage alloc] initWithCGImage:image];

        CGImageRelease(image);
        
        self.ShotImageView.image = shotImage;
    }
}

2、当视频缓冲的进度大于等于当前播放的时间,就开始播放视频,同时隐藏覆盖的视频截图,这时候的效果就类似无缝切换。

/**
 处理观察到都播放器的状态数据
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    AVPlayerItem *item = object;
    if ([keyPath isEqualToString:@"status"]) {// 播放状态

    } else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {// 缓冲进度
        [self handleLoadedTimeRangesWithPlayerItem:item];
    } else if ([keyPath isEqualToString:@"playbackBufferEmpty"]) {// 跳转后没数据

    } else if ([keyPath isEqualToString:@"playbackLikelyToKeepUp"]) {// 跳转后有数据

    }
}
/** 处理缓冲进度 */
- (void)handleLoadedTimeRangesWithPlayerItem:(AVPlayerItem *)item {
    NSArray *loadArray = item.loadedTimeRanges;
    
    CMTimeRange range = [[loadArray firstObject] CMTimeRangeValue];
    
    float start = CMTimeGetSeconds(range.start);
    
    float duration = CMTimeGetSeconds(range.duration);
    
    NSTimeInterval totalTime = start + duration;// 缓存总长度
    
    
    if (totalTime >= self.playingTime) {
        // 隐藏视频截图
    }
}

相关文章

  • AVPlayer无缝切换源

    AVPlayer无缝切换源 很多时候播放视频都有视频清晰度的需求,用户自己选择想要观看的分辨率. 一般切换清晰度就...

  • NRM(切换nam源)

    安装 nrm 自由切换 npm 源 国内镜像提升下载速度 基于 npm ,全局安装以后,你开源无缝快速切换几个源,...

  • AVPlayer切换播放源与循环播放

    踩坑完毕:稍微总结一下使用方式: 第一步:把播放器做成一个单利类,方便外部的调用;毕竟一个APP一般同时就播放一个...

  • 无缝切换~

    今天度过了愉快而充实的一天,具体的行程是这样的: 睡到自然醒,大概快十点了吧,然后喝酸奶,吃全麦面包垫垫肚子,做个...

  • 无缝切换

    我来到机场,这里虽不是人声鼎沸,却也是各色人等形色匆匆,背包的,推车的,客服优雅的声音,标准的手势,招牌式微笑,让...

  • 无缝切换

    大家好,今天想跟大家分享一个特别有意思的现象,就是如标题所说,一个人的思维方式居然可以做到无缝切换。 具体是怎样一...

  • AVPlayer网络、本地视频播放(音乐也可以直接传入即可播放)

    横竖屏切换方法整理横竖屏参考链接 1. AVPlayer播放原理整个播放视频的步骤。 2,AVPlayer相关概念...

  • jQuery封装组件

    Tab切换组件 原生js封装预览效果查看源码 jquery 封装预览效果查看源码 无缝滚动的轮播图 预览效果查看源...

  • npm默认源 淘宝源切换

    切换为默认源 切换为淘宝源

  • 无缝轮播

    无缝细解过程 html css js 无缝轮播js切换动画 css代码 JS代码 循环无缝轮播 CSS js1.首...

网友评论

      本文标题:AVPlayer无缝切换源

      本文链接:https://www.haomeiwen.com/subject/onyjvftx.html