从视频中捕获静止图像,并在单独的视图控制器Swift中添加到图像视图

时间:2018-02-16 16:06:25

标签: ios swift

我正在尝试从图像选择器中选择的视频中获取缩略图,并将缩略图添加到单独的视图控制器中的UIImageView中,但是,我收到错误:

  

线程1:致命错误:在第二个视图控制器中展开Optional值时意外发现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
}

1 个答案:

答案 0 :(得分:0)

目前,您正在将prepareForSegue函数嵌套在选择器的回调中,因此将其删除并在视图控制器的范围内声明它,因此当您调用performSegue时,该类的videoUrl将分配给该视图的videUrl。 secondVC导致非零。这应该是out并调用performSegue

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
    self.vidurl = videoUrl
  }
  else
  {
   }
    performSegue(withIdentifier: "toupload", sender: nil)

 } 

///

   func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "toupload" {
                let uploadvc = segue.destination as! UploadVC
                uploadvc.videourl = vidurl
            }
        }