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?
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%.
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)
}
}
@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()
}
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)
}
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.
Pour utiliser ImageVideoPicker, vous avez besoin de cocoapodes et d’un projet xCode déjà créé.
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é Podfile
Ouvrir 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
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)
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
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
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
}
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()
}
})
})
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)
}
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
}