【问题标题】:Create thumbnail from a video url in IPhone SDK从 iPhone SDK 中的视频 url 创建缩略图
【发布时间】:2011-11-22 00:26:54
【问题描述】:

我正在尝试从视频网址获取缩略图。视频是 m3u8 格式的流 (HLS)。 我已经尝试过 MPMoviePlayerController 中的 requestThumbnailImagesAtTimes,但这没有用。有没有人有解决这个问题的方法?如果有,你是怎么做到的?

【问题讨论】:

标签: ios objective-c video thumbnails


【解决方案1】:

如果你不想使用MPMoviePlayerController,你可以这样做:

    AVAsset *asset = [AVAsset assetWithURL:sourceURL];
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
    CMTime time = CMTimeMake(1, 1);
    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);  // CGImageRef won't be released by ARC

以下是 Swift 中的示例:

func thumbnail(sourceURL sourceURL:NSURL) -> UIImage {
    let asset = AVAsset(URL: sourceURL)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    let time = CMTime(seconds: 1, preferredTimescale: 1)

    do {
        let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
        return UIImage(CGImage: imageRef)
    } catch {
        print(error)
        return UIImage(named: "some generic thumbnail")!
    }
}

我更喜欢使用AVAssetImageGenerator 而不是MPMoviePlayerController,因为它是线程安全的,并且一次可以实例化多个。

【讨论】:

  • 你从 -copyCGImageAtTime:actualTime:error: 得到的 CGImageRef 需要用 CGImageRelease() 释放;
  • 给我错误 AVErrorOperationNotSupportedForAsset 。请帮助
  • 顺便说一句... AV 需要 AVFoundationFramework 而 CMTime 需要 CoreMediaFramework(对这个有点头疼)干杯!
  • 不错的方法,但它可能会像我的情况一样错过视频方向。
  • 完美...这是 iOS 7 的不错选择,因为 thumbnailImageAtTime 现在已弃用。
【解决方案2】:

从视频网址获取缩略图。

    NSString *strVideoURL = @"http://www.xyzvideourl.com/samplevideourl";
    NSURL *videoURL = [NSURL URLWithString:strVideoURL] ;
    MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
    UIImage  *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
    player = nil;

将您的视频 URL 字符串替换为 strVideoURL。 您将从video 获得缩略图作为输出。 而缩略图是UIImage 类型数据!

【讨论】:

  • 我正在使用此代码作为来自 youtube 网址的视频缩略图,但它没有给我图像。我正在使用将缩略图放在表格视图中,所以你能帮我吗跨度>
  • 我认为您无法从 Youtube URL 获取视频,例如 www.youtube.com/watch?v=xxxxxxx
  • 我正在使用这个网址 sciencentral.com/news/image_db/2024515/… 我得到零缩略图。请帮忙
【解决方案3】:
-(UIImage *)loadThumbNail:(NSURL *)urlVideo
{    
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:urlVideo options:nil];
    AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generate.appliesPreferredTrackTransform=TRUE;
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 60);
    CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
    NSLog(@"err==%@, imageRef==%@", err, imgRef);
    return [[UIImage alloc] initWithCGImage:imgRef];
}

在您的项目中添加AVFoundation框架,不要忘记导入<AVFoundation/AVFoundation.h>,您必须将保存在文档目录中的视频路径作为参数传递并以UIImage接收图像。

【讨论】:

  • 我没有将视频保存在文档目录中,也不想保存。我想从 URL 生成图像。有可能吗?
  • 您好@ArpitBParekh,无法在线生成缩略图,即不保存在文档目录中。如果它适合你,请接受我的回答:)
  • 感谢您的回复。但搜索后我做到了。让我发布链接。
  • stackoverflow.com/questions/37343358/… 我不知道,但它有效。
  • UI 卡住了几秒钟。但是如果 Ic NSTimer (Another thread) 上的所有以下代码, ?Ui des 不会卡住。
【解决方案4】:

您可以使用以下代码从视频网址中获取缩略图

MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage  *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

【讨论】:

  • 在 iOS 7 中技术上已弃用,但它仍然有效,我永远无法弄清楚如何使用 – requestThumbnailImagesAtTimes:timeOption: 正确
  • ios7推荐使用什么?
【解决方案5】:

也许这对面临同样问题的其他人有用。我需要一个简单的解决方案来为图像、PDF 和视频创建缩略图。为了解决这个问题,我创建了以下库(在 Swift 中)。

https://github.com/prine/ROThumbnailGenerator

用法很简单: var thumbnailImage = ROThumbnail.getThumbnail(url)

它在内部具有三种不同的实现,并根据文件扩展名创建缩略图。如果您需要另一个文件扩展名的缩略图创建器,您可以轻松添加自己的实现。

【讨论】:

    【解决方案6】:

    Swift 3 版本:

    func createThumbnailOfVideoFromFileURL(videoURL: String) -> UIImage? {
        let asset = AVAsset(url: URL(string: videoURL)!)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true
        let time = CMTimeMakeWithSeconds(Float64(1), 100)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
            let thumbnail = UIImage(cgImage: img)
            return thumbnail
        } catch {
            // Set a default image if Image is not acquired
            return UIImage(named: "ico_placeholder")
        }
    }
    

    【讨论】:

    • 为什么要使用preferredTimeScale的硬编码值100?
    【解决方案7】:

    对于 Swift 3.0:

      func generateThumbnailForVideoAtURL(filePathLocal: NSString) -> UIImage? {
        let vidURL = NSURL(fileURLWithPath:filePathLocal as String)
        let asset = AVURLAsset(url: vidURL as URL)
        let generator = AVAssetImageGenerator(asset: asset)
        generator.appliesPreferredTrackTransform = true
    
        let timestamp = CMTime(seconds: 1, preferredTimescale: 60)
    
        do {
            let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil)
            let frameImg    : UIImage = UIImage(cgImage: imageRef)
            return frameImg
        } catch let error as NSError {
            print("Image generation failed with error ::\(error)")
            return nil
        }
    }
    

    【讨论】:

      【解决方案8】:

      对于 Swift 5,您可以这样获取:

      第一个import AVKit or AVFoundationViewController

      import AVKit
      

      代码:

      // Get Thumbnail Image from URL
      private func getThumbnailFromUrl(_ url: String?, _ completion: @escaping ((_ image: UIImage?)->Void)) {
      
          guard let url = URL(string: url ?? "") else { return }
      
          DispatchQueue.main.async {
              let asset = AVAsset(url: url)
              let assetImgGenerate = AVAssetImageGenerator(asset: asset)
              assetImgGenerate.appliesPreferredTrackTransform = true
      
              let time = CMTimeMake(value: 2, timescale: 1)
              do {
                  let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
                  let thumbnail = UIImage(cgImage: img)
                  completion(thumbnail)
              } catch {
                  print("Error :: ", error.localizedDescription)
                  completion(nil)
              }
          }
      }
      

      用法

      @IBOutlet weak imgThumbnail: ImageView! 
      

      然后调用getThumbnailFromUrl方法并将URL作为Sting传递

      self.getThumbnailFromUrl(videoURL) { [weak self] (img) in
      
          guard let `self` = self else { return }
      
          if let img = img {
              self.imgThumbnail.image = img
          }
      }
      

      谢谢

      【讨论】:

        【解决方案9】:

        带有 AVAssetImageGenerator 的 Swift 2 代码:

        func thumbnailImageForVideo(url:NSURL) -> UIImage?
        {
            let asset = AVAsset(URL: url)
            let imageGenerator = AVAssetImageGenerator(asset: asset)
            imageGenerator.appliesPreferredTrackTransform = true
        
            var time = asset.duration
            //If possible - take not the first frame (it could be completely black or white on camara's videos)
            time.value = min(time.value, 2)
        
            do {
                let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
                return UIImage(CGImage: imageRef)
            }
            catch let error as NSError
            {
                print("Image generation failed with error \(error)")
                return nil
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-30
          • 2018-05-15
          • 1970-01-01
          • 1970-01-01
          • 2011-09-03
          • 2018-05-27
          • 1970-01-01
          相关资源
          最近更新 更多