Edited at

Swift3で動画をカメラから選択してきて描画して再生まで

More than 1 year has passed since last update.

on.gif


実装

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
let imagePickerController = UIImagePickerController()
var videoURL: URL?

@IBOutlet weak var imageView: UIImageView!
@IBAction func selectImage(_ sender: Any) {

print("UIBarButtonItem。カメラロールから動画を選択")
imagePickerController.sourceType = .photoLibrary
imagePickerController.delegate = self
//imagePickerController.mediaTypes = ["public.image", "public.movie"]
//動画だけ
imagePickerController.mediaTypes = ["public.movie"]
//画像だけ
//imagePickerController.mediaTypes = ["public.image"]
present(imagePickerController, animated: true, completion: nil)
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

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

videoURL = info["UIImagePickerControllerReferenceURL"] as? URL
print(videoURL!)
imageView.image = previewImageFromVideo(videoURL!)!
imageView.contentMode = .scaleAspectFit
imagePickerController.dismiss(animated: true, completion: nil)

}

func previewImageFromVideo(_ url:URL) -> UIImage? {

print("動画からサムネイルを生成する")
let asset = AVAsset(url:url)
let imageGenerator = AVAssetImageGenerator(asset:asset)
imageGenerator.appliesPreferredTrackTransform = true
var time = asset.duration
time.value = min(time.value,2)
do {
let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil)
return UIImage(cgImage: imageRef)
} catch {
return nil
}
}

@IBAction func playMovie(_ sender: Any) {

if let videoURL = videoURL{
let player = AVPlayer(url: videoURL)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
present(playerViewController, animated: true){
print("動画再生")
playerViewController.player!.play()
}
}
}
}


ソース

GitHub

Swift3で動画をカメラから選択してきて描画して再生まで


参考

KrisYu/stackoverflow