iOS采取多个屏幕截图

我有一个包含video的NSURL ,并且我想每秒logging一次该video的一帧。 而且我的代码会捕捉到我的播放器的图像,但是我无法将其设置为每秒捕获10帧。 我正在尝试这样的事情,但它是返回相同的video初始帧,正确的次数? 这是我有什么:

AVAsset *asset = [AVAsset assetWithURL:videoUrl]; CMTime vidLength = asset.duration; float seconds = CMTimeGetSeconds(vidLength); int frameCount = 0; for (float i = 0; i < seconds;) { AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; CMTime time = CMTimeMake(i, 10); CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); NSString* filename = [NSString stringWithFormat:@"Documents/frame_%d.png", frameCount]; NSString* pngPath = [NSHomeDirectory() stringByAppendingPathComponent:filename]; [UIImagePNGRepresentation(thumbnail) writeToFile: pngPath atomically: YES]; frameCount++; i = i + 0.1; } 

但是,不是在video的当前时间获取帧,而只是获取最初的帧?

我怎样才能得到每秒10次的video帧?

谢谢您的帮助 :)

您正在获取初始框架,因为您正尝试使用浮点值创buildCMTime:

 CMTime time = CMTimeMake(i, 10); 

由于CMTimeMake函数将int64_t的值作为第一个参数,所以你的浮点值将被四舍五入为int,你将得到不正确的结果。

让我们稍微改变你的代码:

1)首先,你需要find你需要从video中获得的总帧数。 你写道,你需要每秒10帧,所以代码将是:

 int requiredFramesCount = seconds * 10; 

2)接下来,您需要find一个将在每个步骤中增加CMTime值的值:

 int64_t step = vidLength.value / requiredFramesCount; 

3)最后,你需要设置requestedTimeToleranceBefore和requestedTimeTolerance之后到kCMTimeZero,以获得一个精确的时间帧:

 imageGenerator.requestedTimeToleranceAfter = kCMTimeZero; imageGenerator.requestedTimeToleranceBefore = kCMTimeZero; 

以下是您的代码的外观:

 CMTime vidLength = asset.duration; float seconds = CMTimeGetSeconds(vidLength); int requiredFramesCount = seconds * 10; int64_t step = vidLength.value / requiredFramesCount; int value = 0; for (int i = 0; i < requiredFramesCount; i++) { AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; imageGenerator.requestedTimeToleranceAfter = kCMTimeZero; imageGenerator.requestedTimeToleranceBefore = kCMTimeZero; CMTime time = CMTimeMake(value, vidLength.timescale); CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); NSString* filename = [NSString stringWithFormat:@"Documents/frame_%d.png", i]; NSString* pngPath = [NSHomeDirectory() stringByAppendingPathComponent:filename]; [UIImagePNGRepresentation(thumbnail) writeToFile: pngPath atomically: YES]; value += step; } 

CMTimeMake(A, B)存储一个有理数,一个确切的分数A / B秒,这个函数的第一个参数取int值。 对于20秒的video,您将在循环的最后一次迭代中捕捉一个帧(时间((int)19.9)/ 10 = 1.9秒)。 使用CMTimeMakeWithSeconds(i, NSEC_PER_SEC)函数来解决这个时间问题。