Ios 无法为视频生成缩略图
我正在尝试为使用imagePicker选择的视频生成缩略图,但是我收到了这个错误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
"[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)
}