gpt4 book ai didi

iphone - 从视频中获取缩略图总是返回 null

转载 作者:可可西里 更新时间:2023-11-01 04:07:27 24 4
gpt4 key购买 nike

我正在尝试从视频中获取第一个缩略图。

我尝试了以下方法:

一个

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:_moviePath] options:nil];
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0.0, 600);
NSError *error = nil;
CMTime actualTime;

CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage *thumb = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
NSLog(@"the error is %@: image is %@: url is %@: ",error,_mainThumbnail,[NSURL fileURLWithPath:_moviePath] );

但是,我的日志是:

the error is (null): image is (null): 
url is file:///private/var/mobile/Applications/D1293BDC-EA7E-4AC7-AD3C-1BA3548F37D6/tmp/trim.6F0C4631-E5E8-43CD-BF32-9B8F09D4ACF1.MOV:

两个

AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:_moviePath] options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;

CMTime thumbTime = CMTimeMakeWithSeconds(0,30);

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
if (result != AVAssetImageGeneratorSucceeded) {
NSLog(@"couldn't generate thumbnail, error:%@", error);
}
_mainThumbnail.image = [UIImage imageWithCGImage:im];
NSLog(@"thumbnails %@ ",_mainThumbnail.image);
};

CGSize maxSize = CGSizeMake(320, 180);
generator.maximumSize = maxSize;
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

日志缩略图为空。

为什么图像为空?我查看了其他论坛,他们建议使用我已经在使用的 fileURLWithPath。

我用的是ios7

最佳答案

你可以试试这个方法。它获取给定 URL 处视频的第一帧并将其作为 UIImage 返回。

- (UIImage *)thumbnailFromVideoAtURL:(NSURL *)url
{
AVAsset *asset = [AVAsset assetWithURL:url];

// Get thumbnail at the very start of the video
CMTime thumbnailTime = [asset duration];
thumbnailTime.value = 0;

// Get image from the video at the given time
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

CGImageRef imageRef = [imageGenerator copyCGImageAtTime:thumbnailTime actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

return thumbnail;
}

该方法不检查错误,因为我的代码使用它是可以的,如果有任何失败,只返回 nil


编辑:CMTime 值的说明

CMTime

  • timescale - 将其视为视频的 FPS(每秒帧数)(25 FPS -> 视频的 1s 有 25 个视频帧)
  • value - 混凝土框架的标识。在上面的代码中,这表示您要拍摄哪一帧的缩略图。

要计算精确时间的帧数,您必须进行以下计算:

value = timescale * seconds_to_skip

相当于

"Frame of the video to take" = "FPS" * "Number of seconds to skip"

如果您想以视频第 2 秒的第 1 帧为例,您实际上想要跳过视频的第 1 秒。所以你会使用:

CMTime thumbnailTime = [asset duration];
thumbnailTime.value = thumbnailTime.timescale * 1;

再看一下:您想跳过视频的前 1 秒而不是截取缩略图。 IE。在 25 FPS 上,你想跳过 25 帧。所以 CMTime.value = 25(跳过 25 帧)。

关于iphone - 从视频中获取缩略图总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212397/

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