作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于AVAssetImageGenerator
的信息似乎很少,关于cancelAllCGImageGeneration
的信息则更少,所以我希望这不是一个错误。
我正在调用generateCGImagesAsynchronouslyForTimes
并成功获取帧,如果我让它处理整个文件,一切都很好。但是当我cancelAllCGImageGeneration
...
...需要一段时间才能取消-很奇怪,但没什么大不了的。
...它继续在每个请求的帧中调用的完成块,结果为AVAssetImageGeneratorCancelled
-这似乎是一个奇怪的设计选择,非常不便。
但是主要的问题是,在使用AVAssetImageGeneratorCancelled
进行了一系列调用之后,它再次开始使用AVAssetImageGeneratorSucceeded
进行调用。有任何想法吗?
(我可以通过在取消时设置一个标志来解决此问题,此后可以忽略图像,但是用户可以重新启动另一个视频的操作,因此逻辑变得混乱。而且我到处都遇到“内存不足”错误)
代码:
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:self.cameraSelection.movieURL options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]];
NSTimeInterval duration = CMTimeGetSeconds(asset.duration);
float fps = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0].nominalFrameRate;
int frames = duration * fps;
NSMutableArray* requestedTimes = [NSMutableArray array];
for( int i=0; i<frames; i++ )
{
[requestedTimes addObject:[NSValue valueWithCMTime:CMTimeMake(i, fps)]];
}
assetImageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
assetImageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
assetImageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
[assetImageGenerator generateCGImagesAsynchronouslyForTimes:requestedTimes completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error)
{
NSString* resultStr;
switch (result)
{
case AVAssetImageGeneratorSucceeded: resultStr = @"AVAssetImageGeneratorSucceeded"; break;
case AVAssetImageGeneratorFailed: resultStr = @"AVAssetImageGeneratorFailed"; break;
case AVAssetImageGeneratorCancelled: resultStr = @"AVAssetImageGeneratorCancelled"; break;
}
CFStringRef requestedTimeString = CMTimeCopyDescription(kCFAllocatorDefault, requestedTime);
CFStringRef actualTimeString = CMTimeCopyDescription(kCFAllocatorDefault, actualTime);
NSLog(@"%@ requestedTime:%@ actualTime:%@ error:%@", resultStr, (NSString*)requestedTimeString, (NSString*)actualTimeString, error);
CFRelease(requestedTimeString);
CFRelease(actualTimeString);
}];
最佳答案
我遇到了同样的问题,因为它们已经在队列中,所以它仍然处理一些问题。
尝试这样的事情:
__block BOOL hasErrors = NO;
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
if (!hasErrors) {
DDLogVerbose(@"ACTUAL GENERATION TIME %f", CMTimeGetSeconds(actualTime));
if (result != AVAssetImageGeneratorSucceeded) {
DDLogError(@"Failed to generate thumb: %@", error.localizedDescription);
hasErrors = YES;
[generator cancelAllCGImageGeneration];
finishBlock(images, YES);
} else {
[images addObject:[UIImage imageWithCGImage:im]];
if (CMTIME_COMPARE_INLINE(requestedTime, ==, ((NSValue *) timeIntervals.lastObject).CMTimeValue)) {
DDLogVerbose(@"Movie composition thumb generation complete");
finishBlock(images, NO);
}
}
}
};
关于iphone - AVAssetImageGenerator cancelAllCGImageGeneration不会取消AllCGImageGeneration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17396714/
我是一名优秀的程序员,十分优秀!