iOS - 从短视频中提取图片给我相同的图片

时间:2014-04-06 15:19:11

标签: ios objective-c avfoundation video-capture

我正在开发一个iOS项目,用于捕获视频并从该视频中提取图像(例如每500毫秒拍摄10张图片)。我的问题是短视频(几秒钟)。我正在提取相同的图片2或3次。视频长度大约为10秒甚至更长时间我没有这个问题。

在与朋友讨论时,他告诉我这可能是视频中关键帧号的问题。 我正在使用AVCaptureDeviceInput,AVCaptureSession和AVCaptureMovieFileOutput来拍摄视频。

所以,我的问题是: 我怎么能弄清楚为什么我多次提取相同的图片? 这是一个关键帧数问题,是否可以增加此值(来自捕获会话?来自捕获设备?)。

编辑: 以下是图片提取的代码:

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoUrl options:nil];
AVAssetImageGenerator *generateImg = [[AVAssetImageGenerator alloc] initWithAsset:asset];

NSMutableArray *pictList = [NSMutableArray array];
for (int i = 0; i < timeList.count; i++) {
    NSError *error = NULL;
    CMTime time = CMTimeMake([[timeList objectAtIndex:i] intValue], 1000);
    CGImageRef refImg = [generateImg copyCGImageAtTime:time actualTime:NULL error:&error];
    //NSLog(@"error==%@, Refimage==%@", error, refImg);

    [pictList addObject:[[UIImage alloc] initWithCGImage:refImg]];
}

这是timeList打印出来的:

(lldb) po timeList
<__NSArrayM 0x175afab0>(
0,
131,
262,
393,
524
)

提前致谢!

2 个答案:

答案 0 :(得分:1)

根据文档,AVAssetImageGenerator上有2个属性。这些属性允许定义获取最近帧的容差。但是,如果我将此容差设为零,则会生成我请求的帧。 以下是AVAssetImageGenerator的更正实例:

AVAssetImageGenerator *generateImg = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generateImg.requestedTimeToleranceBefore = kCMTimeZero;
generateImg.requestedTimeToleranceAfter = kCMTimeZero;

大视频可能会慢一些,但在我的情况下,我没有时间赌注,所以它很完美。

答案 1 :(得分:0)

如果你每500毫秒要求最多10帧,我猜你会遇到帧速率问题。这可能是由于帧速率较低的源数据,或者可能是由于计算问题导致请求的帧太靠近。

考虑获取资产nominalFrameRate的{​​{1}}并使用该帧速率的倍数。