【问题标题】:Display a preview image from a video swift快速显示视频中的预览图像
【发布时间】:2015-12-17 06:51:30
【问题描述】:

我的文档目录中有一个包含图像和视频的文件夹,在我的应用程序中,我有一个集合视图,用于显示每个单元格中的图像。

我已经通过一个返回 UIImage 的加载图像函数来实现这一点

    // Get the UI Image from the path passed in
    let image = UIImage(contentsOfFile: path)

    if image == nil
    {
        print("No Image at this path");
    }
    else
    {
        return image
    }

但是,我似乎找不到与视频等效的东西,理想情况下,我希望它显示为视频播放器,就像在相册中一样,您可以在其中看到带有小播放按钮的视频静止画面,单击该按钮即可播放该视频。

如果无法从指定路径的视频中获取静止图像,我必须将其返回为 UIImage 我可以显示就可以了。

我是 iOS 的新手,所以想知道是否有类似 UIImage 的视频等价类型,这意味着我可以将其加载并显示在集合视图上。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    您需要视频的快照并将其与播放按钮一起显示。这是我在Swift 2 中的func,它可以为您提供路径filePathLocal 的视频文件的视频快照:

    func videoSnapshot(filePathLocal: String) -> UIImage? {
    
        let vidURL = URL(fileURLWithPath:filePathLocal as String)
        let asset = AVURLAsset(url: vidURL)
        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)
            return UIImage(cgImage: imageRef)
        }
        catch let error as NSError
        {
            print("Image generation failed with error \(error)")
            return nil
        }
    }
    

    【讨论】:

    • 我按照你的方法生成了一张图片快照。但是方向是错误的,是我自己还是应该是正确的结果?如何更正快照方向?
    • 这个方向问题是新的。上次我检查时,这段代码运行良好。
    • 有没有办法获得新创建的 UIImage 的临时路径?
    • 您必须自己在本地保存新图像,然后使用路径。在这里检查这个答案。 stackoverflow.com/a/14532028/1463604
    • Still work on swift 5~~~酷~记得import AVKit
    【解决方案2】:

    Swift 3 版本

    func videoPreviewUiimage(fileName:String) -> UIImage? {
        let filePath = NSString(string: "~/").expandingTildeInPath.appending("/Documents/").appending(fileName)
    
        let vidURL = NSURL(fileURLWithPath:filePath)
        let asset = AVURLAsset(url: vidURL as URL)
        let generator = AVAssetImageGenerator(asset: asset)
        generator.appliesPreferredTrackTransform = true
    
        let timestamp = CMTime(seconds: 2, preferredTimescale: 60)
    
        do {
            let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil)
            return UIImage(cgImage: imageRef)
        }
        catch let error as NSError
        {
            print("Image generation failed with error \(error)")
            return nil
        }
    }
    

    根据上面的 Nishant 回答。

    【讨论】:

      【解决方案3】:

      使用 URL 作为路径比使用字符串更好:

      func videoPreviewImage(url: URL) -> UIImage? {
          let asset = AVURLAsset(url: url)
          let generator = AVAssetImageGenerator(asset: asset)
          generator.appliesPreferredTrackTransform = true
          if let cgImage = try? generator.copyCGImage(at: CMTime(seconds: 2, preferredTimescale: 60), actualTime: nil) {
              return UIImage(cgImage: cgImage)
          }
          else {
              return nil
          }
      }
      

      【讨论】:

      【解决方案4】:

      对于 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)
          return UIImage(cgImage: imageRef)
      }
      catch let error as NSError
      {
          print("Image generation failed with error \(error)")
          return nil
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-20
        相关资源
        最近更新 更多