想要在 AVPlayer 中播放视频时逐帧提取视频中的所有图像
Posted
技术标签:
【中文标题】想要在 AVPlayer 中播放视频时逐帧提取视频中的所有图像【英文标题】:Want to extract all images frame by frame in video while video is getting played in AVPlayer 【发布时间】:2017-07-07 19:57:01 【问题描述】:在 AVPlayer 中播放视频时,逐帧提取视频中的所有图像。
例如,如果视频是 30 fps 并且视频持续时间是 10 秒,那么我应该能够从视频中获取 300 张图像。
目前我正在使用此代码提取图像:
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, fps) queue:dispatch_get_main_queue() usingBlock:
^(CMTime time)
[weakSelf readNextMovieFrame];
];
(void) readNextMovieFrame
CMTime outputItemTime = [[self playerItem] currentTime];
CMTime t = [[self playerItem] currentTime];
CMTime d = [[self playerItem] duration];
if ([_output hasNewPixelBufferForItemTime:outputItemTime])
CVPixelBufferRef buffer = [_output copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:nil];
CIImage *image = [CIImage imageWithCVPixelBuffer:buffer];
UIImage *imageUI = [self makeUIImageFromCIImage:image];
[self saveImage];
//CFRelease(sampleBuffer);
CVBufferRelease(buffer);
【问题讨论】:
【参考方案1】:我使用以下方法从 ios 上的视频中提取图像。
- (UIImage *)getVideoImageAtTime:(CMTime)time player:(AVPlayer *)player
NSError *error = nil;
AVAsset *asset = player.currentItem.asset;
AVAssetImageGenerator *ig = [[AVAssetImageGenerator alloc] initWithAsset:asset];
CGImageRef image = [ig copyCGImageAtTime:time actualTime:nil error:&error];
UIImage *screenShot = [UIImage imageWithCGImage:image];
CGImageRelease(image);
return error ? screenShot : nil;
【讨论】:
以上是关于想要在 AVPlayer 中播放视频时逐帧提取视频中的所有图像的主要内容,如果未能解决你的问题,请参考以下文章