web-dev-qa-db-ja.com

Swiftを使用してiOSのPhotoLibraryからビデオを選択します

次のコードを使用してPhotoLibraryからビデオを選択しようとしています

_imageController.mediaTypes = [kUTTypeMovie: NSString]
_

ビデオを選択した後、圧縮すると、配列の境界外の問題が発生します。

オンラインで検索したところ、次の行が見つかりました。 Swiftバージョンに変換できません( linkimageController.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]

上記の行のSwiftバージョンをお知らせください。誰でも this のSwiftバージョンを提供できる場合に非常に便利です。

質問2

選択したビデオをアプリに表示し、タップしたときに再生する必要があります。外部プラグインなしで、組み込みライブラリを使用してそれを行うことはできますか?

16
NKurapati

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%を望むわけではありません。

25
XueYu

スイフト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)
    }
}
11
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)
}

質問2の場合

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

}
10
Aayushi

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)
}
2
Shakeel Ahmed

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)
}
2
V.Kumar
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

私が作ったこのポッドを試してください:

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

それはすべて楽しいでしょう

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

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

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

デリゲートメソッド

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