Ios 从视频中捕获静止图像并添加到单独的viewcontroller Swift中的图像视图
我正在尝试从从图像选择器中选择的视频中获取缩略图,并将缩略图添加到单独视图控制器中的UIImageView中,但是,我遇到了错误: 线程1:致命错误:在第二个视图控制器中展开可选值时意外发现nilIos 从视频中捕获静止图像并添加到单独的viewcontroller Swift中的图像视图,ios,swift,Ios,Swift,我正在尝试从从图像选择器中选择的视频中获取缩略图,并将缩略图添加到单独视图控制器中的UIImageView中,但是,我遇到了错误: 线程1:致命错误:在第二个视图控制器中展开可选值时意外发现nil @IBOutlet weak var previewImage: UIImageView! var videourl: URL? override func viewDidLoad() { super.viewDidLoad() previewImage.image = th
@IBOutlet weak var previewImage: UIImageView!
var videourl: URL?
override func viewDidLoad() {
super.viewDidLoad()
previewImage.image = thumbnailImageForFileUrl(videourl!) Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
}
func thumbnailImageForFileUrl(_ fileUrl: URL) -> UIImage? {
let asset = AVAsset(url: fileUrl)
let imageGenerator = AVAssetImageGenerator(asset: asset)
do {
let thumbnailCGImage = try imageGenerator.copyCGImage(at: CMTimeMake(7, 1), actualTime: nil)
return UIImage(cgImage: thumbnailCGImage)
} catch let err {
print(err)
}
return nil
}
我知道错误的意思,只是不明白为什么缩略图没有传递到UIImageView中的下一个视图控制器
这是我的第一个视图控制器代码
@IBAction func upload(_ sender: Any) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.mediaTypes = ["public.movie"]
present(pickerController, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
self.vidurl = videoUrl
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toupload" {
let uploadvc = segue.destination as! UploadVC
uploadvc.videourl = vidurl
}
}
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage{
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toupload" {
let uploadvc = segue.destination as! UploadVC
uploadvc.previewImage.image = image
}
}
}
performSegue(withIdentifier: "toupload", sender: nil)
}
dismiss(animated: true, completion: nil)
}
下面是第二个视图控制器的代码
@IBOutlet weak var previewImage: UIImageView!
var videourl: URL?
override func viewDidLoad() {
super.viewDidLoad()
previewImage.image = thumbnailImageForFileUrl(videourl!) Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
}
func thumbnailImageForFileUrl(_ fileUrl: URL) -> UIImage? {
let asset = AVAsset(url: fileUrl)
let imageGenerator = AVAssetImageGenerator(asset: asset)
do {
let thumbnailCGImage = try imageGenerator.copyCGImage(at: CMTimeMake(7, 1), actualTime: nil)
return UIImage(cgImage: thumbnailCGImage)
} catch let err {
print(err)
}
return nil
}
当前,您将
prepareforsgue
函数嵌套在选择器的回调中,因此将其删除并在视图控制器的范围内声明,以便在调用performsgue时,将类的videoUrl分配给第二个VC的videoUrl,从而得到非nil。这应该是出来的,并调用performsgue
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
self.vidurl = videoUrl
}
else
{
}
performSegue(withIdentifier: "toupload", sender: nil)
}
///
贾斯汀,你在网上查过了吗。有大量的文章和教程解释如何通过控制器传递数据。@GuiDupas是的,我搜索过互联网和所有关于使用func prepare(对于segue:UIStoryboardSegue,sender:Any?)函数的内容。所以使用它吧。在类内而不是在方法内创建2个变量,使用方法保存变量上的值并使用
prepare(对于segue:UIStoryboardSegue,sender:Any?
@guidup,因为它起作用了!谢谢。这个很好用。谢谢