如何从 iOS 中的 ALAsset 获取视频的缩略图?
Posted
技术标签:
【中文标题】如何从 iOS 中的 ALAsset 获取视频的缩略图?【英文标题】:How to get thumbnail image of video from ALAsset in iOS? 【发布时间】:2015-07-07 07:42:40 【问题描述】:我想从视频中获取每一帧的缩略图,然后将这些图像保存在可变图像数组中。
我想用这些图片作为动画播放。
NSURL* assetURL = [self.asset valueForProperty:ALAssetPropertyAssetURL];
NSDictionary* assetOptions = nil;
AVAsset* myAsset = [[AVURLAsset alloc] initWithURL:assetURL options:assetOptions];
self.imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:myAsset];
int duration = CMTimeGetSeconds([myAsset duration]);
for(int i = 0; i<duration; i++)
CGImageRef imgRef = [self.imageGenerator copyCGImageAtTime:CMTimeMake(i, duration) actualTime:NULL error:nil];
UIImage* thumbnail = [[UIImage alloc] initWithCGImage:imgRef scale:UIViewContentModeScaleAspectFit orientation:UIImageOrientationUp];
[thumbnailImages addObject:thumbnail];
我使用上面的代码来获取缩略图,但问题是如果有一个 2 秒的视频,我只会得到 2 个缩略图,但我想要 20 个缩略图(每秒 10 个缩略图)。
那么,如何使用 CMTimeMake 获取每 0.1 秒的缩略图
【问题讨论】:
【参考方案1】:代码表格参考网站:Thumbnail image from Video
目标 - C
-(UIImage *)generateThumbImage : (NSString *)filepath
NSURL *url = [NSURL fileURLWithPath:filepath];
AVAsset *asset = [AVAsset assetWithURL:url];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
self.imageGenerator.appliesPreferredTrackTransform = YES;
CMTime time = [asset duration];
time.value = 0;
Float duration = CMTimeGetSeconds([myAsset duration]);
for(Float i = 0.0; i<duration; i=i+0.1)
CGImageRef imgRef = [self.imageGenerator copyCGImageAtTime:CMTimeMake(i, duration) actualTime:NULL error:nil];
UIImage* thumbnail = [[UIImage alloc] initWithCGImage:imgRef scale:UIViewContentModeScaleAspectFit orientation:UIImageOrientationUp];
[thumbnailImages addObject:thumbnail];
斯威夫特
func generateThumbImage(url : NSURL) -> UIImage
var asset : AVAsset = AVAsset.assetWithURL(url) as! AVAsset
var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
var error : NSError? = nil
var time : CMTime = CMTimeMake(1, 30)
var img : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error)
var frameImg : UIImage = UIImage(CGImage: img)!
return frameImg
【讨论】:
嘿,您的代码只返回一张图片。我想要所有缩略图的数组。谢谢 那么它不是称为拇指图像。 就像您在任何给定时间生成一个图像一样,我想要来自 diff 的多个图像。时间并显示为动画 嘿,我根据你的代码更新了我的问题,但有一点逻辑问题。你能帮我吗? @lalit Kumar ,改变你的 for 循环 for(float i = 0.0,i@Kirit Modi 在 Swift 3 中的解决方案有一些小的改动:
func generateThumbImage(url : URL) -> UIImage?
let asset = AVAsset(url: url)
let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
let time = CMTimeMake(1, 30)
let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil)
guard let cgImage = img else return nil
let frameImg = UIImage(cgImage: cgImage)
return frameImg
【讨论】:
【参考方案3】:以下代码用于从0.41
的视频中获取拇指图像
NSString *str = [[self.videoArray objectAtIndex:i] valueForKey:@"vName"];
NSURL *videoURL = [NSURL URLWithString:str] ;
MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage *thumbnail = [player thumbnailImageAtTime:0.41 timeOption:MPMovieTimeOptionNearestKeyFrame];
player = nil;
【讨论】:
我想要资产(视频类型)中的所有缩略图,而不是单个图像。 你需要更改thumbnailImageAtTime:0.41
的值
我也在尝试你的代码。但我正在使用 ALAsset。那么,您能否编辑关于 ALAsset 的答案【参考方案4】:
extension UIImageView
func getImageThumnail(forLink link: String)
let asset = AVAsset(url: URL(string: link)!)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
let time = CMTimeMakeWithSeconds(Float64(50), 100)
DispatchQueue.global(qos: .userInteractive).async
do
let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
let thumbnail = UIImage(cgImage: img)
DispatchQueue.main.async
self.image = thumbnail
catch
【讨论】:
以上是关于如何从 iOS 中的 ALAsset 获取视频的缩略图?的主要内容,如果未能解决你的问题,请参考以下文章
如何将视频从 ALAsset 显示到 UICollectionview ios
iOS 在 UITableView 中显示来自 ALAsset 的图像