最近用芒果tv看视频 发现用芒果tv看视频时有些视频可以预览 就是滑动下面的进度条 进度条上绘跟出个小部件 显示改视频滑动到的时间截图 觉得这个功能挺不错的 就准备写个demo。
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;
用这种方法取缓冲区的图片不需要下载,而没有缓冲到的就会有一定的延长。这个就需要第二种方法。