web-dev-qa-db-fra.com

Sélectionnez une vidéo de PhotoLibrary dans iOS avec Swift

J'essaie de sélectionner une vidéo de PhotoLibrary en utilisant le code suivant

imageController.mediaTypes = [kUTTypeMovie: NSString]

Après avoir sélectionné la vidéo, lorsqu’elle se compresse, le tableau sort du problème.

J'ai cherché en ligne et trouvé la ligne suivante. Je suis incapable de le convertir en version Swift ( link ) imageController.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]

S'il vous plaît laissez-nous savoir la version Swift pour la ligne ci-dessus. C'est très utile si quelqu'un peut fournir la version Swift de this .

Question 2:

Je veux montrer une vidéo sélectionnée dans l'application et je dois jouer quand elle est tapée. Peut-on le faire sans plugins externes et en utilisant des bibliothèques intégrées?

16
NKurapati

Basé sur Swift 2.2

Supposons que vous ayez un imagePickerController et que vous souhaitiez sélectionner des images et des vidéos:

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)    
}

Puis, une fois la vidéo sélectionnée, imprimez son NSURL.

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
  videoURL = info["UIImagePickerControllerReferenceURL"] as? NSURL
  print(videoURL)
  imagePickerController.dismissViewControllerAnimated(true, completion: nil)
}

Pour la question 2:

Oui, vous pouvez le faire via AVPlayer, vous devez importer AVKit et AVFoundation, et votre code peut ressembler à ceci:

if let videoURL = videoURL{
  let player = AVPlayer(URL: videoURL)

  let playerViewController = AVPlayerViewController()
  playerViewController.player = player

  presentViewController(playerViewController, animated: true) {
    playerViewController.player!.play()
  }
}

J'ai fait une démo ici, vous pouvez vous y référer, peut-être pas à 100%.

22
XueYu

Swift 3

import MobileCoreServices

var imagePickerController = UIImagePickerController()
var videoURL: URL?

private func openImgPicker() {
    imagePickerController.sourceType = .savedPhotosAlbum
    imagePickerController.delegate = self
    imagePickerController.mediaTypes = ["public.movie"]
    present(imagePickerController, animated: true, completion: nil)
}

extension YourViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        videoURL = info[UIImagePickerControllerMediaURL] as? URL
        print("videoURL:\(String(describing: videoURL))")
        self.dismiss(animated: true, completion: nil)
    }
}
9
Giang
@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)
}

Pour la question 2:

let player = AVPlayer(url: videoURL)
let playerController = AVPlayerViewController()
playerController.player = player
self.present(playerController, animated: true) {
    player.play()

}
8
Aayushi
func openCamera() {
  if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
    println("captureVideoPressed and camera available.")

    var imagePicker = UIImagePickerController()

    imagePicker.delegate = self
    imagePicker.sourceType = .Camera
    imagePicker.mediaTypes = [kUTTypeMovie!]
    imagePicker.allowsEditing = false

    imagePicker.showsCameraControls = true

    self.presentViewController(imagePicker, animated: true, completion: nil)   
  } else {
    println("Camera not available.")
  }  
}

func imagePickerController(  didFinishPickingMediaWithInfo info:NSDictionary!) {
  videoUrl = info[UIImagePickerControllerMediaURL] as! NSURL!
  let pathString = videoUrl.relativePath
  self.dismissViewControllerAnimated(true, completion: nil)
}
2
bluemobi

essayez ce pod que j'ai fait:

https://github.com/jhonyourangel/ImagePickerWhatsApp

Je cherchais un sélecteur d'images et de vidéos similaire pour un projet et je n'ai pas réussi à en trouver un qui soit capable de: 1. Prendre une photo 2. Obtenir une image de la bibliothèque 3. Enregistrer une vidéo 4. Obtenir une vidéo de la bibliothèque

Tandis que je cherchais, j’ai envie de Facebook ou de Google google avoir un pod pour ce genre de besoins, j’ai vraiment aimé le sélecteur Whatsapp, j’ai donc créé celui-ci semblable à celui de Whatsapp.

Conditions préalables

Pour utiliser ImageVideoPicker, vous avez besoin de cocoapodes et d’un projet xCode déjà créé.

L'installation

installer cocoapods devrait suffire à exécuter Sudo gem install cocoapods dans le terminal Si cela ne fonctionne pas, allez à cocoapods

Puis naviguez le terminal dans votre dossier de projet, où se trouve l’extension de fichier .xcodeproj, puis exécutez pod init Ceci créera un fichier appelé PodfileOuvrir le fichier dans un éditeur (sublimeText, xCode, atom, vim, etc.). ) et ajoutez la ligne ci-dessous après use_frameworks!

pod 'ImagePickerWhatsApp'

ou pod 'ImagePickerWhatsApp',: chemin => '/ Utilisateurs/aiu/Documents/cocoapods/ImagePickerWhatsApp'

il suffit ensuite de lancer pod install dans le terminal et d'attendre la fin de l'installation de la lib

Comment l'utiliser

ajoutez import ImagePickerWhatsApp à votre classe viewcontroller

alors vous pouvez appeler le sélecteur en appelant: Soit mp = ImageVideoPicker.makeVCFromStoryboard () self.present (mp, animé: vrai, achèvement: nul)

Déléguer

pour implémenter le délégué, ajoutez mp.delegate = self et l'étendue de la classe de contrôleur de visualisation en outre, vous devez importer le cadre iOS Photos import Photos

extension ViewController: ImageVideoPickerDelegate {
    func onCancel() {
        print("no picture selected")
    }

    func onDoneSelection(assets: [PHAsset]) {
       print("selected \(assets.count) assets")
    }
}

func onDoneSelection renvoie un tableau d'actifs contenant les informations sur l'emplacement de l'actif: sur le périphérique, la bibliothèque iTunes ou iCloud.

si vous avez juste besoin d'afficher les images, vous pouvez utiliser ce code dans une vue de collection ou quelque chose de similaire, implémentez cette paix de code

var representedAssetIdentifier: String!

func getImageFrom(asset: Phasset) {
     representedAssetIdentifier = asset?.localIdentifier
    let imageManager = PHCachingImageManager()

    imageManager.requestImage(for: asset!, targetSize: self.frame.size, contentMode: .default, options: nil) { (image, _) in

        if(self.representedAssetIdentifier == self.asset?.localIdentifier &&
             image != nil) {
             self.imageView.image = image
        }
    }
}

cela montrera juste la vignette, mais c'est génial car montre aussi la vignette pour les photos en direct et les vidéos

Images et vidéos en tant que données

La lib est destinée à être utilisée pour envoyer des images ou des vidéos sur le réseau et non pour éditer des images ou des vidéos. Mais cela ne veut pas dire que vous ne pouvez pas. Vous pouvez faire à peu près n'importe quoi puisqu'il renvoie un tableau d'actifs, mais vous devez mettre en œuvre ce dont vous avez besoin.

afin d’obtenir les données de l’actif, ImageVideoPicker dispose d’une méthode qui renvoie un gestionnaire de complétion avec les données. 

ImageVideoPicker.getDataFrom(asset: asset) { (data) in
    if data == nil {
        print(data as Any, asset.mediaType, asset.localIdentifier)
    } else {
        print(data!.count as Any, asset.mediaType, asset.localIdentifier)
    }
}

ce sera tout amusez-vous

1
AiU
func startMediaBrowserFromViewController(viewController: UIViewController!, usingDelegate delegate : protocol<UINavigationControllerDelegate, UIImagePickerControllerDelegate>!) -> Bool {
  if UIImagePickerController.isSourceTypeAvailable(.SavedPhotosAlbum) == false {
    return false
  }
  let mediaUI = UIImagePickerController()
  mediaUI.sourceType = .SavedPhotosAlbum
  mediaUI.mediaTypes = [kUTTypeMovie as String]
  mediaUI.allowsEditing = true
  mediaUI.delegate = delegate
  presentViewController(mediaUI, animated: true, completion: nil)
  return true
}
0
force1Jai

Mise à jour pour la version actuelle de Swift:

// Check if the asset is of video media type.
guard (asset.mediaType == PHAssetMediaType.video)   else {
    print("Not a valid video media type")
    return
}

// Obtain the URL of the video.
PHCachingImageManager().requestAVAsset(forVideo: asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
    let asset = asset as! AVURLAsset
    print("asset.url: ", asset.url) // Here is video URL
    // Play the video.
    DispatchQueue.main.async(execute: {

        let player = AVPlayer(url: asset.url)
        let playerViewController = AVPlayerViewController()
        playerViewController.player = player
        self.present(playerViewController, animated: true) {
            playerViewController.player!.play()
        }
    })
})
0
Gokila Dorai

Sélectionnez une vidéo de la galerie à l'aide de Swift 4

    // Put this code where you want to pick the video from gallery
    Let imagePickerController = UIImagePickerController ()
    imagePickerController.sourceType = .photoLibrary
    imagePickerController.delegate = self
    imagePickerController.mediaTypes = ["public.movie"]
    present(imagePickerController, animated: true, completion: nil)

    // UIImagePickerController Delegate Method
    func imagePickerController (_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) 
    {
         let videoURL = info[UIImagePickerControllerMediaURL] as? NSURL
         print(videoURL!)
         self.dismiss(animated: true, completion: nil)
    }
0
V.Kumar
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
  println("Camera Available")
  var imagePicker = UIImagePickerController()
  imagePicker.delegate = self
  imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
  imagePicker.allowsEditing = false
  self.presentViewController(imagePicker, animated: true, completion: nil)
}

Méthode déléguée 

func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {
  self.dismissViewControllerAnimated(true, completion: nil)
  imageView.image = image
}