想要在 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 中播放视频时逐帧提取视频中的所有图像的主要内容,如果未能解决你的问题,请参考以下文章

MPMoviePlayer 或 AVPlayer 帧前进

opencv 提取avi视频中的帧,逐帧播放

怎么从视频中提取一张照片

在播放 iOS 时从 HLS 流(视频)中提取/录制音频

逐帧播放视频的组件

视频没有在 AVPlayer 中播放