【问题标题】:Get thumbail / preview image from a server video URL in Swift 3.0从 Swift 3.0 中的服务器视频 URL 获取缩略图/预览图像
【发布时间】:2017-06-27 01:21:09
【问题描述】:

我想要来自服务器底层视频的缩略图。视频文件不在本地。它在我的服务器上。视频文件的扩展名为 .m3u8

【问题讨论】:

    标签: ios swift swift3


    【解决方案1】:

    你可以做到的。

    第一步:你需要import AVFoundation

        import AVFoundation
    

    然后将以下代码添加到您的控制器中:

    func getThumbnailImage(forUrl url: URL) -> UIImage? {
        let asset: AVAsset = AVAsset(url: url)
        let imageGenerator = AVAssetImageGenerator(asset: asset)
    
        do {
            let thumbnailImage = try imageGenerator.copyCGImage(at: CMTimeMake(value: 1, timescale: 60), actualTime: nil)
            return UIImage(cgImage: thumbnailImage)
        } catch let error {
            print(error)
        }
    
        return nil
    }
    

    用法:

        let imageView = UIImageView()
        let url = URL(string: "your_video_url")
    
        if let thumbnailImage = getThumbnailImage(forUrl: url) {
            imageView.image = thumbnailImage
        }
    

    url 更改为您的视频链接。

    【讨论】:

    • 它对我不起作用..这是我得到的错误 Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x608000240870 {Error Domain=NSOSStatusErrorDomain Code=-12782 "(null)"}, NSLocalizedFailureReason=发生未知错误(-12782), NSLocalizedDescription=操作无法完成}
    • @MANCHIKANTIKRISHNAKISHORE 我也遇到了这个错误
    • 这确实适用于 firebase url。但它适用于其他网址
    • 注意:如果你的图片旋转了,试试imageGenerator.appliesPreferredTrackTransform = true
    【解决方案2】:

    在 Swift 5.1(也包括旧版本)中,您可以这样做:

    private func createVideoThumbnail(from url: URL) -> UIImage? {
    
        let asset = AVAsset(url: url)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true
        assetImgGenerate.maximumSize = CGSize(width: frame.width, height: frame.height)
    
        let time = CMTimeMakeWithSeconds(0.0, preferredTimescale: 600)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
            let thumbnail = UIImage(cgImage: img)
            return thumbnail
        }
        catch {
          print(error.localizedDescription)
          return nil
        }
    
    }
    

    注意,AVKit 需要导入。

    【讨论】:

      【解决方案3】:

      第 1 步

      import AVFoundation
      

      第 2 步

      在您的 ViewController 中添加以下函数:

      func getThumbnailImageFromVideoUrl(url: URL, completion: @escaping ((_ image: UIImage?)->Void)) {
          DispatchQueue.global().async { //1
              let asset = AVAsset(url: url) //2
              let avAssetImageGenerator = AVAssetImageGenerator(asset: asset) //3
              avAssetImageGenerator.appliesPreferredTrackTransform = true //4
              let thumnailTime = CMTimeMake(value: 2, timescale: 1) //5
              do {
                  let cgThumbImage = try avAssetImageGenerator.copyCGImage(at: thumnailTime, actualTime: nil) //6
                  let thumbNailImage = UIImage(cgImage: cgThumbImage) //7
                  DispatchQueue.main.async { //8
                      completion(thumbNailImage) //9
                  }
              } catch {
                  print(error.localizedDescription) //10
                  DispatchQueue.main.async {
                      completion(nil) //11
                  }
              }
          }
      }
      

      第 3 步

      self.getThumbnailImageFromVideoUrl(url: videoUrl) { (thumbNailImage) in
          self.yourImageView.image = thumbNailImage
      }
      

      如果您需要完整的解释,请参考Get a thumbnail from a video URL in the background in Swift

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-25
        • 2023-03-22
        • 2016-03-20
        • 2017-09-13
        • 2020-05-16
        • 1970-01-01
        • 2011-06-18
        • 2011-06-14
        相关资源
        最近更新 更多