Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法为视频生成缩略图_Ios_Swift_Uiimagepickercontroller - Fatal编程技术网

Ios 无法为视频生成缩略图

Ios 无法为视频生成缩略图,ios,swift,uiimagepickercontroller,Ios,Swift,Uiimagepickercontroller,我正在尝试为使用imagePicker选择的视频生成缩略图,但是我收到了这个错误 "[discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=查询已取消} “,有人能帮我找出原因吗 下面是我代码中的一些片段 let imagePickerController = U

我正在尝试为使用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)
}

您的视频url是一个临时文件url。didFinishPickingMediaWithInfo方法完成后,该文件将被删除。顺便说一句,与您的问题无关,但您应该使用url而不是NSURL,因为Swift 3。您需要在
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")
    }
}




您的视频url是一个临时文件url。didFinishPickingMediaWithInfo方法完成后,该文件将被删除。顺便说一句,与您的问题无关,但您应该使用
url
而不是
NSURL
,因为Swift 3如何修复此问题?临时文件url?在该方法内的主线程中执行或保存/mov我尝试在主线程上使用DispatchQueue.main.async来执行此操作,但仍然不起作用。我是否遗漏了什么?我也更新了问题,根本不需要使用
DispatchQueue
,只需将代码添加到您的
didFinishPickingMediaWithInfo
方法中即可dy在主线程中自然运行
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)
}