前提・実現したいこと
Swiftを使って読み込んだ動画から全フレームのキャプチャ画像を生成して表示させようとしているのですが,下記のコードでは1秒毎にしか画像を生成できません.
訂正すべき箇所等ご教授お願いいたします。
該当のソースコード
swift
1 2 3import UIKit 4import AVKit 5 6class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 7 8 var picker = UIImagePickerController() 9 var scrollView = UIScrollView() 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height) 15 view.addSubview(scrollView) 16 17 // フォトライブラリーから動画を取得 18 picker.sourceType = UIImagePickerController.SourceType.photoLibrary 19 picker.mediaTypes = ["public.movie"] 20 picker.delegate = self 21 present(picker, animated: true, completion: nil) 22 } 23 24 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 25 dismiss(animated: true, completion: nil) 26 27 guard let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL else { 28 return 29 } 30 31 var images = [UIImage]() 32 33 let asset = AVAsset(url: videoURL) 34 let duration = CMTimeGetSeconds(asset.duration) 35 let generator = AVAssetImageGenerator(asset: asset) 36 generator.appliesPreferredTrackTransform = true 37 generator.requestedTimeToleranceAfter = CMTime.zero 38 generator.requestedTimeToleranceBefore = CMTime.zero 39 // 1秒毎にUIImageを生成 40 for index: Int in 0 ..< Int(duration) { 41 let floatTime = Float64(index) 42 let time = CMTimeMakeWithSeconds(floatTime, preferredTimescale: 600) 43 if let image = try? generator.copyCGImage(at: time, actualTime: nil) { 44 images.append(UIImage(cgImage: image)) 45 } 46 } 47 48 // UIImageを画面に表示 49 var y: CGFloat = 0 50 let marginX: CGFloat = 50 51 let marginY: CGFloat = 10 52 53 for index: Int in 0 ..< images.count { 54 55 let image = images[index] 56 let width = view.frame.width - marginX*2 57 let ratio = width / image.size.width 58 let height = image.size.height * ratio 59 60 let imageView = UIImageView(image: image) 61 imageView.frame = CGRect(x: marginX, y: y, width: width, height: height) 62 63 scrollView.addSubview(imageView) 64 scrollView.contentSize = CGSize(width: view.frame.width, height: y + height) 65 66 y = y + height + marginY 67 } 68 } 69} 70 71
補足情報(FW/ツールのバージョンなど)
Xcode 10.2.1
Swift 5.0.1
コードは ``` で囲って下さい。 https://teratail.com/help#about-markdown
で、質問は何なんでしょう?
全フレームの画像を生成できないのでしょうか?
すみません修正しました.
動画から全フレームのキャプチャ画像を生成しようとして上記のコードをビルドしても,1秒毎でしか画像を生成できませんでした.
直すべき箇所や他にも画像を生成する方法があれば教えていただきたいです.
1秒毎であれ、全フレーム生成出来るのでしたら、質問が成立していません。
誤解を生む表現すみませんでした.
1秒ごとにではなく,動画の単位フレームごとに画像を生成したいという意味です.
すみません。本気で勘違いしてました。
回答1件
あなたの回答
tips
プレビュー