質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1045閲覧

Swift 動画からフレーム分割した画像を生成したい

160445092

総合スコア7

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/07/23 05:17

編集2019/07/23 05:41

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/07/23 05:31 編集

で、質問は何なんでしょう? 全フレームの画像を生成できないのでしょうか?
160445092

2019/07/23 05:39

すみません修正しました. 動画から全フレームのキャプチャ画像を生成しようとして上記のコードをビルドしても,1秒毎でしか画像を生成できませんでした. 直すべき箇所や他にも画像を生成する方法があれば教えていただきたいです.
fuzzball

2019/07/23 05:43

1秒毎であれ、全フレーム生成出来るのでしたら、質問が成立していません。
160445092

2019/07/23 06:17

誤解を生む表現すみませんでした. 1秒ごとにではなく,動画の単位フレームごとに画像を生成したいという意味です.
fuzzball

2019/07/23 06:38

すみません。本気で勘違いしてました。
guest

回答1

0

ベストアンサー

過去に同じような質問がありました。
https://teratail.com/questions/178334


追記:
1秒毎に取れているのでしたら、動画のFPSを取得して、1秒から更に細かく時間を指定して画像を取ってみれば良いとは思います。

うまく取れるかは試してみてください。

投稿2019/07/23 07:43

編集2019/07/23 07:47
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

160445092

2019/07/24 02:47

ありがとうごさいます. 一度試してみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問