【问题标题】:How to get thumbnail image of video from ALAsset in iOS?如何从 iOS 中的 ALAsset 获取视频的缩略图?
【发布时间】: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 秒的缩略图

【问题讨论】:

    标签: ios objective-c avplayer alassetslibrary cmtime


    【解决方案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 {
          }
          }
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-01
        • 2023-03-28
        • 2014-11-20
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 2010-11-19
        • 2012-03-28
        相关资源
        最近更新 更多