Select video from PhotoLibrary in iOS using Swift
Based on Swift 2.2
Suppose you have a imagePickerController and when you want to select both images and videos:
let imagePickerController = UIImagePickerController()var videoURL: NSURL? @IBAction func selectImageFromPhotoLibrary(sender: UIBarButtonItem) { imagePickerController.sourceType = .PhotoLibrary imagePickerController.delegate = self imagePickerController.mediaTypes = ["public.image", "public.movie"] presentViewController(imagePickerController, animated: true, completion: nil) }
Then after the video is selected, print out its NSURL.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { videoURL = info["UIImagePickerControllerReferenceURL"] as? NSURL print(videoURL) imagePickerController.dismissViewControllerAnimated(true, completion: nil)}
For question 2:
Yes, you can do it through AVPlayer, you need import AVKit and AVFoundation, and you code may look like this:
if let videoURL = videoURL{ let player = AVPlayer(URL: videoURL) let playerViewController = AVPlayerViewController() playerViewController.player = player presentViewController(playerViewController, animated: true) { playerViewController.player!.play() }}
I made a demo here you can refer, maybe not 100% what you want.
@IBOutlet weak var imgView: UIImageView!var imagePickerController = UIImagePickerController()var videoURL : NSURL?@IBAction func btnSelectVideo_Action(_ sender: Any) { imagePickerController.sourceType = .savedPhotosAlbum imagePickerController.delegate = self imagePickerController.mediaTypes = [kUTTypeMovie as String] present(imagePickerController, animated: true, completion: nil)}func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { videoURL = info[UIImagePickerControllerMediaURL]as? NSURL print(videoURL!) do { let asset = AVURLAsset(url: videoURL as! URL , options: nil) let imgGenerator = AVAssetImageGenerator(asset: asset) imgGenerator.appliesPreferredTrackTransform = true let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil) let thumbnail = UIImage(cgImage: cgImage) imgView.image = thumbnail } catch let error { print("*** Error generating thumbnail: \(error.localizedDescription)") } self.dismiss(animated: true, completion: nil)}
For question 2:
let player = AVPlayer(url: videoURL)let playerController = AVPlayerViewController()playerController.player = playerself.present(playerController, animated: true) { player.play()}
Swift 5+ solution:
func openVideoGallery() { picker = UIImagePickerController() picker.delegate = self picker.sourceType = .savedPhotosAlbum picker.mediaTypes = ["public.movie"] picker.allowsEditing = false present(picker, animated: true, completion: nil)}