0

I am using an objective-c image picker image picker to pick a time lapse but I am doing it in swift. I only had access to the objective-c code so I used a objective-c to swift converter and I have an error.

func qb_imagePickerController(imagePickerController: QBImagePickerController, didFinishPickingAssets assets: [AnyObject]) {
    for asset in assets as! [PHAsset] {
        PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(avAsset: AVAsset, audioMix: AVAudioMix, info: [NSObject : AnyObject]) -> Void in
            var url: NSURL = NSURL(string: "\(asset)")!
            var avAsset: AVURLAsset = AVURLAsset(URL: url, options: nil)
            var playerItem: AVPlayerItem = AVPlayerItem(asset: avAsset)
            var videoPlayer: AVPlayer = AVPlayer(playerItem: playerItem)
            videoPlayer.play()
        })
    }
    self.dismissViewControllerAnimated(true, completion: { _ in })
}

This is the code I have currently. The error I am receiving is below.

Cannot convert value of type '(AVAsset, AVAudioMix, [NSObject : AnyObject]) -> Void' to expected argument type '(AVAsset?, AVAudioMix?, [NSObject : AnyObject]?) -> Void'

Cœur
  • 37,241
  • 25
  • 195
  • 267
Tom Fox
  • 897
  • 3
  • 14
  • 34

2 Answers2

3

Look at the docs for requestAVAssetForVideo:options:resultHandler: The resultHandler you have doesn't match the required signature.

Change this line:

PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(avAsset: AVAsset, audioMix: AVAudioMix, info: [NSObject : AnyObject]) -> Void in

to:

PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(avAsset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) -> Void in

Note the addition of the ? in the expected places.

rmaddy
  • 314,917
  • 42
  • 532
  • 579
  • Glad I could help. Please don't forget to accept the answer if it solve your problem. – rmaddy Dec 18 '15 at 21:42
  • I am using your code to get a video asset from Photo Library and playing it using AVPlayerViewController. The video is fine, but there is no audio. Do you have any ideas? – cora Sep 15 '20 at 21:28
0

Get video URL from PHAsset in Swift 4.2 from didFinishPickingAssets in QBImagePickerController

let imagePicker = QBImagePickerController()
imagePicker.delegate = self
imagePicker.numberOfColumnsInPortrait = 2
imagePicker.maximumNumberOfSelection = 2
imagePicker.allowsMultipleSelection = true
imagePicker.mediaType = .video

self.present(imagePicker, animated: true, completion: nil)

func qb_imagePickerController(_ imagePickerController: QBImagePickerController!, didFinishPickingAssets assets: [Any]!) {
     for asset in assets
     {
        PHCachingImageManager().requestAVAsset(forVideo: asset as! PHAsset, options: nil, resultHandler: {(asset, audioMix, info) -> Void in
        if asset != nil {
            let avasset = asset as! AVURLAsset
            let urlVideo = avasset.url
            yourarray.add(urlVideo as URL)
        }

       })

    }


   imagePickerController.dismiss(animated: true) {
       //You can access video urls here
       print("Total Videos:\(yourarray.count)")
   }

}
Community
  • 1
  • 1