次のコードを使用してPhotoLibraryからビデオを選択しようとしています
_imageController.mediaTypes = [kUTTypeMovie: NSString]
_
ビデオを選択した後、圧縮すると、配列の境界外の問題が発生します。
オンラインで検索したところ、次の行が見つかりました。 Swiftバージョンに変換できません( link )imageController.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]
上記の行のSwiftバージョンをお知らせください。誰でも this のSwiftバージョンを提供できる場合に非常に便利です。
質問2:
選択したビデオをアプリに表示し、タップしたときに再生する必要があります。外部プラグインなしで、組み込みライブラリを使用してそれを行うことはできますか?
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%を望むわけではありません。
スイフト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)
}
質問2の場合
let player = AVPlayer(url: videoURL)
let playerController = AVPlayerViewController()
playerController.player = player
self.present(playerController, animated: true) {
player.play()
}
Swift 5&Swift 4ピッキングのためにギャラリーにビデオのみを表示したい場合は非常に簡単です
//MARK:- Call this function only
func openVideoGallery()
{
picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .savedPhotosAlbum
picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum)!
picker.mediaTypes = ["public.movie"]
picker.allowsEditing = false
present(picker, animated: true, completion: nil)
}
Swift 4.
あなたのクラスは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)
}
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)
}
私が作ったこのポッドを試してください:
https://github.com/jhonyourangel/ImagePickerWhatsApp
プロジェクトの類似の画像とビデオのピッカーを探していましたが、次のことができるものを見つけることができませんでした。図書館
私はfacebookまたはmabe googleのwhatsupにこの種のニーズのポッドがあることを期待していましたが、whatsappピッカーが本当に好きだったので、whatsappの1つに似たものを作成しました。
ImageVideoPickerを使用するには、ココアポッドとxCodeプロジェクトが既に作成されている必要があります
cocoapodsをインストールするだけでうまくいかない場合は、ターミナルでSudo gem install cocoapods
を実行するだけで十分です cocoapods
次に、ファイル拡張子.xcodeproj
があるプロジェクトフォルダーにターミナルを移動し、pod init
を実行します。これにより、Podfile
というファイルが作成されます。エディターでファイルを開きます(sublimeText、xCode、 atom、vim ...など)use_frameworks!
の後に次の行を追加します
pod 'ImagePickerWhatsApp'
またはポッド 'ImagePickerWhatsApp'、:path => '/ Users/aiu/Documents/cocoapods/ImagePickerWhatsApp'
次に、ターミナルでpod install
を実行し、libのインストールが完了するまで待ちます
import ImagePickerWhatsApp
をViewControllerクラスに追加します
次に、呼び出すことでピッカーを呼び出すことができます:let mp = ImageVideoPicker.makeVCFromStoryboard()self.present(mp、animated:true、completion: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
}
}
}
これはサムネイルだけを表示しますが、ライブ写真やビデオのサムネイルも表示するので素晴らしいです
Libは、画像やビデオをネットワーク経由で送信するために使用することを目的としており、派手な画像やビデオの編集を行うためのものではありません。しかし、これは不可能ではありません。アセットの配列を返すため、ほぼ何でもできますが、必要なものを実装するのはあなたの仕事です。
アセットからデータを取得するために、ImageVideoPickerには、データを含む完了ハンドラーを返すメソッドが1つあります。
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)
}
}
それはすべて楽しいでしょう
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
}
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()
}
})
})
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)
}
デリゲートメソッド
func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {
self.dismissViewControllerAnimated(true, completion: nil)
imageView.image = image
}