AVAssetImageGenerator有时会从2个连续的帧中返回相同的图像 [英] AVAssetImageGenerator returns sometimes same image from 2 successive frames
问题描述
我目前正在使用AVAssetImageGenerator
从视频中提取每一帧,但有时它会连续两次向我返回几乎相同的图像(它们没有相同的帧时间").有趣的是,它总是每5帧发生一次(在我的测试视频中).
I'm currently extracting every frame from a video with AVAssetImageGenerator
, but sometimes it returns me successively 2 times almost the same image (they do not have the same "frame time"). The funny thing is it always happen (in my test video) each 5 frames.
此处和
Here and here are the two images (open each in new tab then switch the tabs to see the differences).
这是我的代码:
//setting up generator & compositor
self.generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
generator.appliesPreferredTrackTransform = YES;
self.composition = [AVVideoComposition videoCompositionWithPropertiesOfAsset:asset];
NSTimeInterval duration = CMTimeGetSeconds(asset.duration);
NSTimeInterval frameDuration = CMTimeGetSeconds(composition.frameDuration);
CGFloat totalFrames = round(duration/frameDuration);
NSMutableArray * times = [NSMutableArray array];
for (int i=0; i<totalFrames; i++) {
NSValue * time = [NSValue valueWithCMTime:CMTimeMakeWithSeconds(i*frameDuration, composition.frameDuration.timescale)];
[times addObject:time];
}
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
// If actualTime is not equal to requestedTime image is ignored
if(CMTimeCompare(actualTime, requestedTime) == 0) {
if (result == AVAssetImageGeneratorSucceeded) {
NSLog(@"%.02f %.02f", CMTimeGetSeconds(requestedTime), CMTimeGetSeconds(actualTime));
// Each log have differents actualTimes.
// frame extraction is here...
}
}
};
generator.requestedTimeToleranceBefore = kCMTimeZero;
generator.requestedTimeToleranceAfter = kCMTimeZero;
[generator generateCGImagesAsynchronouslyForTimes:times completionHandler:handler];
有人知道它可能来自哪里吗?
Any idea where it could come from?
推荐答案
请参阅AVAssetImageGenerator的以下属性. 您应该为这两个属性设置kCMTimeZero以获得准确的帧.
Please see the following properties of AVAssetImageGenerator. You should set kCMTimeZero for both properties to get the exact frames.
/* The actual time of the generated images will be within the range [requestedTime-toleranceBefore, requestedTime+toleranceAfter] and may differ from the requested time for efficiency.
Pass kCMTimeZero for both toleranceBefore and toleranceAfter to request frame-accurate image generation; this may incur additional decoding delay.
Default is kCMTimePositiveInfinity. */
@property (nonatomic) CMTime requestedTimeToleranceBefore NS_AVAILABLE(10_7, 5_0);
@property (nonatomic) CMTime requestedTimeToleranceAfter NS_AVAILABLE(10_7, 5_0);
在为这两个属性设置kCMTimeZero之前,您会遇到一些针对不同请求时间的相同图像. 只需尝试以下代码即可.
Before I set kCMTimeZero for both properties, I got some same images for different request time as you experienced. Just try the following code.
self.imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:myAsset];
self.imageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
self.imageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
这篇关于AVAssetImageGenerator有时会从2个连续的帧中返回相同的图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!