Выберите видео из PhotoLibrary в iOS, используя Swift

Я пытаюсь выбрать видео из PhotoLibrary, используя следующий код

imageController.mediaTypes = [kUTTypeMovie: NSString]

После выбора видео, когда оно сжимается, я получаю массив из пограничной проблемы.

Я искал в Интернете и нашел следующую строку. Я не могу преобразовать его в версию Swift (ссылка) imageController.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]

Пожалуйста, дайте нам знать версию Swift для вышеуказанной строки. Это очень полезно, если кто-нибудь может предоставить Swift-версию этого.

Вопрос2:

Я хочу показать выбранное видео в приложении, и мне нужно воспроизвести его, когда оно нажмете. Можем ли мы сделать это без внешних плагинов и используя встроенные библиотеки?

Ответ 1

На основе Swift 2.2

Предположим, что у вас есть ImagePickerController и когда вы хотите выбрать оба изображения и видео:

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

Затем, после выбора видео, распечатайте его NSURL.

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

Для вопроса 2:

Да, вы можете сделать это через AVPlayer, вам нужно импортировать AVKit и AVFoundation, и код может выглядеть так:

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

  let playerViewController = AVPlayerViewController()
  playerViewController.player = player

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

Я сделал демонстрацию здесь, на которую вы можете ссылаться, возможно, не на 100%, что вы хотите.

Ответ 2

Свифт 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)
    }
}

Ответ 3

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

На вопрос 2:

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

}

Ответ 4

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

Ответ 5

попробуй этот стручок, который я сделал:

https://github.com/jhonyourangel/ImagePickerWhatsApp

Я искал похожее средство выбора изображений и видео для проекта и не смог найти тот, который смог бы: 1. Сделать снимок 2. Получить изображение из библиотеки 3. Зарегистрировать видео 4. Получить видео от библиотека

В то время как я искал, я надеюсь, что у Whatsup на Facebook или Mabe Google есть стручок для такого рода потребностей, мне действительно понравился сборщик WhatsApp, поэтому я создал этот аналог для одного в WhatsApp.

Предпосылки

Чтобы использовать ImageVideoPicker, вам нужны cocoapods и проект xCode, уже созданный

Установка

для установки cocoapods должно быть достаточно просто запустить sudo gem install cocoapods в терминале, если это не работает, перейдите к cocoapods

Затем перейдите к терминалу в папке вашего проекта, где находится расширение файла .xcodeproj и запустите pod init Это создаст файл с именем Podfile Откройте файл в редакторе (sublimeText, xCode, atom, vim... и т.д.) И добавьте линия ниже после use_frameworks!

pod 'ImagePickerWhatsApp'

или pod 'ImagePickerWhatsApp',: path => '/Users/aiu/Documents/cocoapods/ImagePickerWhatsApp'

затем просто запустите pod install в терминале и дождитесь окончания установки lib

Как это использовать

добавьте import ImagePickerWhatsApp в ваш класс viewcontroller

затем вы можете вызвать сборщик, вызвав: let mp = ImageVideoPicker.makeVCFromStoryboard() self.present(mp, animated: true, завершение: nil)

делегат

для реализации делегата добавьте mp.delegate = self и степень, в которой вы просматриваете контроллер, также вам нужно импортировать фреймворк iOS Photos для import Photos

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

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

func onDoneSelection возвращает массив ресурсов, которые содержат информацию о том, где находится ресурс: на устройстве, в библиотеке iTunes или iCloud.

если вам просто нужно отобразить изображения, вы можете использовать этот код в виде коллекции или что-то подобное, просто реализуйте этот мир кода

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

это покажет только миниатюру, но это здорово, потому что также показывает миниатюру для живых фотографий и видео

Изображения и видео как данные

Библиотека предназначена для отправки изображений или видео по сети, а не для редактирования изображений или видео. Но это не значит, что ты не можешь. Вы можете делать что угодно, так как он возвращает массив активов, но это ваша работа, чтобы реализовать то, что вам нужно.

Чтобы получить данные из ресурса, у ImageVideoPicker есть один метод, который возвращает обработчик завершения с данными.

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

это все будет весело

Ответ 6

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

Метод делегирования

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

Ответ 7

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
}

Ответ 8

Обновлено для текущей версии 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()
        }
    })
})

Ответ 9

Выберите видео из галереи с помощью 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)
    }

Ответ 10

Swift 5 & Swift 4 очень просто, если вы хотите показывать только видео в галерее для комплектации

//MARK:- Call this function only 
func openVideoGallery()
{
    picker = UIImagePickerController()
    picker.delegate = self
    picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum)!
    picker.mediaTypes = ["public.movie"]

    picker.allowsEditing = false
    present(picker, animated: true, completion: nil)
}

Ответ 11

Swift 4.0

Ваш класс принимает протокол UIImagePickerControllerDelegate

class classname: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

После этого вам нужно создать

let imagePickerController = UIImagePickerController()

Добавьте это в действие вашей кнопки: -

imagePickerController.sourceType = .photoLibrary

imagePickerController.delegate = self

imagePickerController.mediaTypes = ["public.image", "public.movie"]

present(imagePickerController, animated: true, completion: nil)

Метод делегата

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

 let videoURL = info["UIImagePickerControllerReferenceURL"] as? NSURL
 print(videoURL!)
 imagePickerController.dismiss(animated: true, completion: nil)
}