ios - 无法为视频 iOS swift 生成缩略图

标签 ios swift uiimagepickercontroller

我正在尝试为使用 imagePicker 选择的视频生成缩略图,但我收到此错误

  "[discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled"

UserInfo={NSLocalizedDescription=查询已取消} ",谁能帮我弄清楚为什么?

下面是我的代码的一些片段。

let imagePickerController = UIImagePickerController()
var videoURL: NSURL?
@IBOutlet weak var videoImageTemp: UIImageView!

此函数用于启动实例化 imagePickerController 的过程

@IBAction func addVideo(_ sender: Any) {

    imagePickerController.sourceType = .photoLibrary
    imagePickerController.delegate = self
    imagePickerController.mediaTypes = ["public.movie"]

    present(imagePickerController, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
     let asset = AVAsset(url: info["UIImagePickerControllerReferenceURL"] as! URL)
        let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true
        let time = CMTimeMake(1, 2)
        let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil)
        if img != nil {
            let frameImg  = UIImage(cgImage: img!)
                self.videoImageTemp.image = frameImg
                self.videoImageTemp.contentMode = .scaleAspectFit
                // assign your image to UIImageView
    }
    imagePickerController.dismiss(animated: true, completion: nil)
}

最佳答案

您的视频网址是一个临时文件网址。一旦 didFinishPickingMediaWithInfo 方法完成,该文件将被删除。顺便说一句,与您的问题无关,但自 Swift 3 以来,您应该使用 URL 而不是 NSURL。并且您需要在 didFinishPickingMediaWithInfo 方法 的主线程中执行此操作,更改 previewImageFromVideo 方法声明并使其返回同步生成图像并使其抛出 func previewImageFromVideo(url: URL) throws -> CGImage。您的代码应如下所示:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if #available(iOS 11.0, *) {
        if let url = info[UIImagePickerControllerMediaURL] as? URL {
            imageView.image = getVideoThumbFrom(url: url)
        }
    } else {
        if let url = info[UIImagePickerControllerReferenceURL] as? URL {
            imageView.image = getVideoThumbFrom(url: url)
        }
    }
    dismiss(animated: true) {
        print("picker dismissed")
    }
}

func getVideoThumbFrom(url: URL) -> UIImage? {
    do {
        return try UIImage(cgImage: previewImageFromVideo(url: url))
    } catch {
        print(error)
        return nil
    }
}

func previewImageFromVideo(url: URL) throws -> CGImage {
    let imageGenerator = AVAssetImageGenerator(asset: AVAsset(url: url))
    imageGenerator.appliesPreferredTrackTransform = true
    return try imageGenerator.copyCGImage(at: CMTimeMake(1, 2), actualTime: nil)
}

Sample project

关于ios - 无法为视频 iOS swift 生成缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48388429/

相关文章:

ios - 有没有更有效的方法来检测 UIScrollView 偏移量?

ios - 从字符串中获取 NSDate 对象

ios - 如何将 long 存储在 Swift 数组中?

ios - 在 iphone 模拟器上使用 UIImagePickerController

ios - 将 UIImagePickerController 与自定义相机控件一起使用时,如何在音量增大事件上拍照?

iphone - 有关如何将 revmob 本地通知集成到 iOS 应用程序所需的分步指南

ios - [AnyObject] 数组的 swift indexOf

swift - 如何解决图像处理的内存问题?

swift - 带页眉和页脚的 NSCollectionView

ios - 模棱两可的 "use of unresolved identifier"错误?