gpt4 book ai didi

iOS AVFoundation - 以 60 fps 的速度将视频转换为图像

转载 作者:可可西里 更新时间:2023-11-01 04:36:21 25 4
gpt4 key购买 nike

我正在尝试以 60fps 的速率将整个视频转换为一系列图像,这意味着视频每秒生成 60 张图像...

为此,我使用了 AVAssetImageGenerator 和 generateCGImagesAsynchronouslyForTimes 方法 ...

一切进展顺利,只是我在批处理执行时间方面遇到了严重的性能问题(13 秒视频大约需要 5 分钟)...

此外,超过以下大小 CGSizeMake(512, 324),我遇到崩溃......

有没有人已经有过这种处理的经验并且知道如何减少执行时间以及能够以更高分辨率提取图像?

下面是我正在测试的代码......

NSURL *movieURL = [NSURL fileURLWithPath:getCaptureMoviePath()];

AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:movieURL options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;
generator.requestedTimeToleranceAfter=kCMTimeZero;
generator.requestedTimeToleranceBefore=kCMTimeZero;
NSMutableArray *thumbTimes=[NSMutableArray arrayWithCapacity:asset.duration.value];

for(int t=0;t < asset.duration.value;t=t+2) {
CMTime thumbTime = CMTimeMake(t, asset.duration.timescale);
NSLog(@"Time Scale : %d ", asset.duration.timescale);
NSValue *v=[NSValue valueWithCMTime:thumbTime];
[thumbTimes addObject:v];
}
NSLog(@"thumbTimes array contains %d objects : ", [thumbTimes count]);
[asset release];
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
if (result != AVAssetImageGeneratorSucceeded) {
NSLog(@"couldn't generate thumbnail, error:%@", error);
} else {
NSLog(@"actual time: %lld/%d (requested: %lld/%d)",actualTime.value,actualTime.timescale,requestedTime.value,requestedTime.timescale);
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMdd-HHmmss"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filename = [NSString stringWithFormat:@"%@.png", [formatter stringFromDate:[NSDate date]]];
NSString *filepath = [documentsDirectory stringByAppendingPathComponent:filename];
CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:filepath];
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
CGImageDestinationAddImage(destination, im, nil);
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"Failed to write image to %@", filepath);
}
CFRelease(destination);
}
//[generator release];
};
CGSize maxSize = CGSizeMake(512, 324);
generator.maximumSize = maxSize;

[generator generateCGImagesAsynchronouslyForTimes:thumbTimes completionHandler:handler];

提前致谢

j.

最佳答案

嘿@Sooriah Joel 尝试使用以下代码。它对我来说工作正常。

- (void)generateCMTimesArrayOfAllFramesUsingAsset:(AVURLAsset *)asset
{
if (cmTimeArray.count>0) {
[cmTimeArray removeAllObjects];
}
//Generate all frames present in video
for(int t=0;t < asset.duration.value;t++) {
CMTime thumbTime = CMTimeMake(t,asset.duration.timescale);
NSValue *v=[NSValue valueWithCMTime:thumbTime];
[cmTimeArray addObject:v];
}
NSLog(@"Array of time %@ count = %d",cmTimeArray, cmTimeArray.count);
//NSLog(@"Array count = %d",cmTimeArray.count);
}


- (void)generateCMTimesArrayOfFrames:(int)framesInterval UsingAsset:(AVURLAsset *)asset
{
int videoDuration = ceilf(((float)asset.duration.value/asset.duration.timescale));
NSLog(@"Video duration %lld seconds timescale = %d",asset.duration.value,asset.duration.timescale);
if (cmTimeArray.count>0) {
[cmTimeArray removeAllObjects];
}
//Generate limited frames present in video
for (int i = 0; i<videoDuration; i++)
{
int64_t tempInt = i;
CMTime tempCMTime = CMTimeMake(tempInt,1);
int32_t interval = framesInterval;
for (int j = 1; j<framesInterval+1; j++)
{
CMTime newCMtime = CMTimeMake(j,interval);
CMTime addition = CMTimeAdd(tempCMTime, newCMtime);
[cmTimeArray addObject:[NSValue valueWithCMTime:addition]];
}
}
NSLog(@"Array of time %@ count = %d",cmTimeArray, cmTimeArray.count);
//NSLog(@"Array count = %d",cmTimeArray.count);
}


- (void)generateThumbnailsFromVideoURL:(AVURLAsset *)videoAsset
{
//Generate CMTimes Array of required frames
//1.Generate All Frames
//[self generateCMTimesArrayOfAllFramesUsingAsset:asset];

//2.Generate specific frames per second
[self generateCMTimesArrayOfFrames:30 UsingAsset:videoAsset];

__block int i = 0;
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
if (result == AVAssetImageGeneratorSucceeded) {
[framesArray addObject:[UIImage imageWithCGImage:im]];
}
if (result == AVAssetImageGeneratorFailed) {
NSLog(@"Failed with error: %@ code %d", [error localizedDescription],error.code);
}
if (result == AVAssetImageGeneratorCancelled) {
NSLog(@"Canceled");
}

i++;
imageIndex = i;

if(i == cmTimeArray.count) {
//Thumbnail generation completed
}
};

// Launching the process...
self.generator = [[AVAssetImageGenerator alloc] initWithAsset:videoAsset];
self.generator.apertureMode = AVAssetImageGeneratorApertureModeCleanAperture;
self.generator.appliesPreferredTrackTransform=TRUE;
self.generator.requestedTimeToleranceBefore = kCMTimeZero;
self.generator.requestedTimeToleranceAfter = kCMTimeZero;
self.generator.maximumSize = CGSizeMake(40, 40);
[self.generator generateCGImagesAsynchronouslyForTimes:cmTimeArray completionHandler:handler];
}

关于iOS AVFoundation - 以 60 fps 的速度将视频转换为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10946534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com