如何从 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【参考方案2】:

@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 PhotoKit框架如何获取视频文件大小

iOS 在 UITableView 中显示来自 ALAsset 的图像

如何将视频从 ALAsset 显示到 UICollectionview Cell

如何从 ALAsset 获取 exif 信息?

ALAsset 中缺少视频文件缩略图时间戳