avplayer缓冲预览功能

本文通过实现AVPlayer的缓冲预览功能,介绍了如何在滑动视频进度条时展示对应时间点的截图。利用AVAssetImageGenerator,可以在不完全下载视频的情况下获取缓冲区内的图像,提供流畅的预览体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近用芒果tv看视频  发现用芒果tv看视频时有些视频可以预览 就是滑动下面的进度条 进度条上绘跟出个小部件 显示改视频滑动到的时间截图 觉得这个功能挺不错的  就准备写个demo。


      我用的是avplayer,有个类叫AVAssetImageGenerator,可以取出视频的每一帧,关键代码如下:


    NSArray *loadedTimeRanges = [_currentItem loadedTimeRanges];

    CMTimeRange timeRange     = [loadedTimeRanges.firstObject CMTimeRangeValue];

     // 获取缓冲区域

    float startSeconds        = CMTimeGetSeconds(timeRange.start) + _urlModel.backBeginTime;

    float durationSeconds     = CMTimeGetSeconds(timeRange.duration) + startSeconds;

    if (time > startSeconds && time < durationSeconds) {

        if (_generator.asset != _currentItem.asset) {

            _generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:_currentItem.asset];

            _generator.appliesPreferredTrackTransform = YES;

            _generator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;

            _generator.maximumSize = CGSizeMake(300, 400);

        }

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            

        CGImageRef thumbnailImageRef = NULL;

        CFTimeInterval thumbnailImageTime = time - _urlModel.backBeginTime;

        thumbnailImageRef = [_generator copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 1) actualTime:NULL error:nil];

        

        UIImage *thumbnailImage = thumbnailImageRef ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] : nil;

        CGImageRelease(thumbnailImageRef);

            

        [self performSelectorOnMainThread:@selector(changeImgWithImage:) withObject:thumbnailImage waitUntilDone:NO];

            

        });

    }




下面这个方法可以取出视频某个时间点的图片

- (nullable CGImageRef)copyCGImageAtTime:(CMTime)requestedTime actualTime:(nullable CMTime *)actualTime error:(NSError * __nullable * __nullable)outError CF_RETURNS_RETAINED;


还有另一个方法

- (void)generateCGImagesAsynchronouslyForTimes:(NSArray<NSValue *> *)requestedTimes completionHandler:(AVAssetImageGeneratorCompletionHandler)handler;



用这种方法取缓冲区的图片不需要下载,而没有缓冲到的就会有一定的延长。这个就需要第二种方法。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值