我正在开发一个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
)
提前致谢!
答案 0 :(得分:1)
根据文档,AVAssetImageGenerator上有2个属性。这些属性允许定义获取最近帧的容差。但是,如果我将此容差设为零,则会生成我请求的帧。 以下是AVAssetImageGenerator的更正实例:
AVAssetImageGenerator *generateImg = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generateImg.requestedTimeToleranceBefore = kCMTimeZero;
generateImg.requestedTimeToleranceAfter = kCMTimeZero;
大视频可能会慢一些,但在我的情况下,我没有时间赌注,所以它很完美。
答案 1 :(得分:0)
如果你每500毫秒要求最多10帧,我猜你会遇到帧速率问题。这可能是由于帧速率较低的源数据,或者可能是由于计算问题导致请求的帧太靠近。
考虑获取资产nominalFrameRate
的{{1}}并使用该帧速率的倍数。