Выберите видео из 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)
}