【问题标题】:AVAssetImageGenerator fails at copying imageAVAssetImageGenerator 无法复制图像
【发布时间】:2017-02-17 12:22:48
【问题描述】:

我正在使用AVAssetImageGenerator 从视频的最后一帧创建图像。这通常工作正常,但时不时地copyCGImageAtTime 失败并出现错误

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

我正在验证 AVAsset 不是 nil 并且我直接从资产中提取 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 好像是相关的,但是并没有解决我的问题。

【问题讨论】:

  • 您是否有始终如一地重现此内容的电影文件?
  • 我在生成视频的时候只调用了一次这个方法。我使用它通过添加冻结最后一帧几秒钟来扩展视频,然后使用 AVMutableComposition 生成一个新视频
  • 媒体文件看起来太大

标签: ios avfoundation avassetimagegenerator


【解决方案1】:

无法保证您的资产的视频轨道存在于[asset duration]。它的持续时间可以短于整个资产。由于您将容差设置为kCMTimeZero,因此唯一可能的解决方案是失败。

编辑:澄清一下,当您的资产的音频轨道略长于视频轨道时,就会出现问题。

【讨论】:

  • 假设您有不同的时间用于音频和视频,而您正在使用kCMTimeZero,那么您将如何在设定的时间获取快照?或者在这种情况下,如果您的音频比视频稍长,解决方案是什么?
  • @impression7vx 您需要访问资产的视频 AVAssetTrack。可能不止一个,因此您需要决定哪个(或选择第一个)。然后使用它的timeRange 属性来找出它何时开始和何时结束。 developer.apple.com/documentation/avfoundation/avasset/…
  • 有趣,很棒。它在某种程度上起作用。我做了类似CMTime(seconds: audioTrackTime-videoTrackTime, preferredTimeScale: 600) 的操作,但是我仍然遇到错误,所以我做了CMTime(seconds: audioTrackTime-videoTrackTime+300, preferredTimeScale: 600) 给它半秒的缓冲;它有效,但似乎非常不精确
  • @impression7vx 我不确定我是否理解。为什么要从视频轨道时间中减去音轨时间?
  • videoTrackTime 会给我CMTime(seconds: 1250, preferredTimeScale: 600) 的持续时间,audioTrackTime 将是CMTime(second: 1270, preferredTimeScale: 600) 所以我会减去音频时间以保证如果音频在开头,并且视频对齐到末尾,然后视频将从 CMTime(seconds: 20, preferredTimeScale: 600) 开始。但是,这仍然不起作用,所以我添加了 0.5 秒的缓冲区。
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 2013-02-27
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多