【问题标题】:Create a thumbnail or image of an AVPlayer at current time在当前时间创建 AVPlayer 的缩略图或图像
【发布时间】:2013-02-27 22:28:05
【问题描述】:

我已经实现了AVPlayer,我想在单击工具栏按钮时拍摄图像或缩略图,并在带有UIImageView 的新UIViewController 中打开。图像应该像AVPlayer 一样缩放。 segue 已经在工作,我只需要实现我在当前播放时间获取图像。

谢谢!

【问题讨论】:

    标签: objective-c xcode ipad


    【解决方案1】:

    试试这个

     - (UIImage*)takeScreeenShot {
    
     AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidURL
     options:nil];
    
     AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    
     imageGenerator.appliesPreferredTrackTransform = YES;
    
     NSError *err = NULL;
    
     CMTime time = CMTimeMake(1, 60); // time range in which you want
     screenshot
    
     CGImageRef imgRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL
     error:&err];
    
     return [[UIImage alloc] initWithCGImage:imgRef];
    
     }
    

    希望对你有帮助!!!

    【讨论】:

    • 因为“imageGenerator”而出现错误。它说它是未声明的。
    【解决方案2】:

    Objective-C

    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
    

    斯威夫特

    var asset = AVAsset.assetWithURL(sourceURL)
    var imageGenerator = AVAssetImageGenerator(asset: asset!)
    var time = CMTimeMake(1, 1)
    var imageRef = try! imageGenerator!.copyCGImageAtTime(time, actualTime: nil)
    var thumbnail = UIImage.imageWithCGImage(imageRef)
    CGImageRelease(imageRef) // CGImageRef won't be released by ARC 
    

    Swift 3.0

    var sourceURL = URL(string: "Your Asset URL")
    var asset = AVAsset(url: sourceURL!)
    var imageGenerator = AVAssetImageGenerator(asset: asset)
    var time = CMTimeMake(1, 1)
    var imageRef = try! imageGenerator.copyCGImage(at: time, actualTime: nil)
    var thumbnail = UIImage(cgImage:imageRef)
    

    注意:根据您的 swift 版本解释 Swift 代码。

    【讨论】:

    • 截取屏幕截图本身可以使用这两种方法,但问题是,屏幕截图被缩放为全屏,而不是像我的视频那样采用相同的格式。是否可以调整“缩略图”的大小?
    • 给我 AVErrorOperationNotSupportedForAsset 错误代码。我正在尝试加载 m3u8 服务器 url。请帮忙
    • 加载 m3u8 文件需要AVPlayer,它能够播放 .m3u8 流文件。尝试使用AVPlayer玩。
    • 添加:#import
    • 这很有效,但是你如何改变时间?我一直在玩时间变量和 CMTime 但似乎无法弄清楚关系,以及如何截取屏幕截图让我们说 10 秒内 5 秒
    【解决方案3】:

    斯威夫特 2.x:

    let asset = AVAsset(...)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1)
    if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) {
    
        let image = UIImage(CGImage: imageRef)
    
        // do something with your image
    }
    

    【讨论】:

    • 这可行,但会得到一个旋转的缩略图。添加 imageGenerator.appliesPreferredTrackTransform = true
    【解决方案4】:

    添加以下代码以从视频生成缩略图。

    AVURLAsset *assetURL = [[AVURLAsset alloc] initWithURL:partOneUrl options:nil]; 
    
    AVAssetImageGenerator *assetGenerator = [[AVAssetImageGenerator alloc] initWithAsset:assetURL]; 
    
    assetGenerator.appliesPreferredTrackTransform = YES;  
    
    NSError *err = NULL; 
    
    CMTime time = CMTimeMake(1, 2);     
    
    CGImageRef imgRef = [assetGenerator copyCGImageAtTime:time actualTime:NULL error:&err]; 
    
    UIImage *one = [[UIImage alloc] initWithCGImage:imgRef];    
    

    【讨论】:

      【解决方案5】:

      这就是我在 Swift 中拍摄当前场景中当前可见帧的方式:

      关键是

      1. 获取CMTime类型的玩家当前时间
      2. 将该时间转换为Float64 类型的秒数
      3. 使用CMTimeMake 将秒数切换回CMTime。第一个参数应该是秒数应该转换为Int64

      代码:

      var myImage: UIImage?
      
      guard let player = player else { return }
      
      let currentTime: CMTime = player.currentTime() // step 1.
      let currentTimeInSecs: Float64 = CMTimeGetSeconds(currentTime) // step 2.
      let actionTime: CMTime = CMTimeMake(Int64(currentTimeInSecs), 1) // step 3.
      
      let asset = AVAsset(url: fileUrl)
      let imageGenerator = AVAssetImageGenerator(asset: asset)
      imageGenerator.appliesPreferredTrackTransform = true // prevent image rotation
      
      do{
          let imageRef =  try imageGenerator.copyCGImage(at: actionTime, actualTime: nil)
      
           myImage = UIImage(cgImage: imageRef)
      }catch let err as NSError{
          print(err.localizedDescription)
      }
      

      【讨论】:

        【解决方案6】:

        用于从视频生成缩略图的 Swift 扩展

        extension AVPlayer {
            func generateThumbnail(time: CMTime) -> UIImage? {
                guard let asset = currentItem?.asset else { return nil }
                let imageGenerator = AVAssetImageGenerator(asset: asset)
        
                do {
                    let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
                    return UIImage(cgImage: cgImage)
                } catch {
                    print(error.localizedDescription)
                }
        
                return nil
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-04-19
          • 2018-10-31
          • 2014-11-25
          • 1970-01-01
          • 2011-02-09
          • 1970-01-01
          • 2010-09-27
          • 2016-07-02
          • 1970-01-01
          相关资源
          最近更新 更多