【问题标题】:How do I implement AVAssetImageGenerator.copyCGImageAtTime in swift如何快速实现 AVAssetImageGenerator.copyCGImageAtTime
【发布时间】:2015-01-03 12:49:44
【问题描述】:

到目前为止,我有以下内容

  let assetUrl = NSURL.URLWithString(self.targetVideoString)
  let asset: AVAsset = AVAsset.assetWithURL(assetUrl) as AVAsset
  let imageGenerator = AVAssetImageGenerator(asset: asset);
  let time : CMTime = CMTimeMakeWithSeconds(1.0, 1)
  let actualTime : CMTime
  let myImage: CGImage =imageGenerator.copyCGImageAtTime(requestedTime: time, actualTime:actualTime, error: <#NSErrorPointer#>)

最后一行是我迷路的地方......我只是想在 1.0 秒的时间抓取一张图片

【问题讨论】:

    标签: swift avasset avassetimagegenerator


    【解决方案1】:

    函数声明为

    func copyCGImageAtTime(requestedTime: CMTime, actualTime: UnsafeMutablePointer<CMTime>, error outError: NSErrorPointer) -> CGImage!
    

    您必须将(初始化的)CMTimeNSError? 变量作为“输入输出表达式”与&amp; 一起传递:

    let assetUrl = NSURL(string: ...)
    let asset: AVAsset = AVAsset.assetWithURL(assetUrl) as AVAsset
    let imageGenerator = AVAssetImageGenerator(asset: asset);
    let time = CMTimeMakeWithSeconds(1.0, 1)
    
    var actualTime : CMTime = CMTimeMake(0, 0)
    var error : NSError?
    let myImage = imageGenerator.copyCGImageAtTime(time, actualTime: &actualTime, error: &error)
    

    还要注意你的第一行

    let assetUrl = NSURL.URLWithString(self.targetVideoString)
    

    不再使用当前的 Xcode 6.1 进行编译。

    【讨论】:

      【解决方案2】:

      使用 Swift2.0 imageGenerator.copyCGImageAtTime 现在标记为 throws,因此您必须在 do - try - catch 块中处理错误。

          let asset : AVAsset = AVAsset(URL: yourNSURLtoTheAsset )
          let imageGenerator = AVAssetImageGenerator(asset: asset)
          let time = CMTimeMakeWithSeconds(0.5, 1000)
          var actualTime = kCMTimeZero
          var thumbnail : CGImageRef?
          do {
              thumbnail = try imageGenerator.copyCGImageAtTime(time, actualTime: &actualTime)
          }
          catch let error as NSError {
              print(error.localizedDescription)
          }
      

      【讨论】:

        【解决方案3】:

        Swift 3、4 中接受的答案:

        let asset = AVURLAsset(url: URL(fileURLWithPath: "YOUR_URL_STRING_HERE"))
        let imgGenerator = AVAssetImageGenerator(asset: asset)
        var cgImage: CGImage?
        do {
            cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil)
        } catch let error as NSError {
            // Handle the error
            print(error)
        }
        // Handle the nil that cgImage might be
        let uiImage = UIImage(cgImage: cgImage!)
        

        【讨论】:

        • 这可以用于在视频的当前时间捕获视频,而不是仅设置手动秒来捕获它吗?
        【解决方案4】:

        至少从 Xcode 7.0.1 和 Swift 2 开始,assetwithURL 现在是:let asset = AVAsset(URL: assetURL)。 Xcode 错误是“'assetWithURL' 不可用:使用对象构造 'AVAsset(URL:)'”

        【讨论】:

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