AVAssetImageGenerator在复制图像时失败

时间:2016-10-08 17:25:48

标签: ios avfoundation avassetimagegenerator

我正在使用AVAssetImageGenerator从视频的最后一帧创建图片。这通常可以正常工作,但偶尔copyCGImageAtTime会因错误

而失败
NSLocalizedDescription = "Cannot Open";
NSLocalizedFailureReason = "This media cannot be used.";
NSUnderlyingError = "Error Domain=NSOSStatusErrorDomain Code=-12431";

我正在验证AVAsset不是零并且我直接从资产中提取CMTime,所以我不明白为什么会这样。只有在尝试获取最后一帧时才会发生这种情况,如果我使用kCMTimeZero代替它,它似乎可以正常工作。

- (void)getLastFrameFromAsset:(AVAsset *)asset completionHandler:(void (^)(UIImage *image))completion
{
    NSAssert(asset, @"Tried to generate last frame from nil asset");
    AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    gen.requestedTimeToleranceBefore = kCMTimeZero;
    gen.requestedTimeToleranceAfter = kCMTimeZero;
    gen.appliesPreferredTrackTransform = YES;
    CMTime time = [asset duration];
    NSError *error = nil;
    CMTime actualTime;

    CGImageRef imageRef = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
    UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
    NSAssert(image, @"Failed at generating image from asset's last frame");
    completion(image);
    CGImageRelease(imageRef);
}

This似乎有关系,但它并没有解决我的问题。

1 个答案:

答案 0 :(得分:2)

没有任何东西可以保证您资产的 video 轨道位于[asset duration]。它的持续时间可以短于整个资产。由于您将公差设置为kCMTimeZero,因此唯一可能的解决方法就是失败。

编辑:为澄清起见,当资产的音频轨道比视频轨道稍长时,就会出现此问题。