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

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

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

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3813閲覧

swift 動画の任意のコマで画像を生成したい

sasakikik

総合スコア21

iPad

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

2クリップ

投稿2019/03/08 03:27

Swift上で、動画を読み込んだ後に、任意のコマで動画のキャプチャ画像を生成しようとしているのですが、1秒毎にしか画像が生成されません。
他に動画から画像を生成するすべがあればご教授下さい

swift

1 2// 生成 3let player = AVPlayer(url:url) 4 5playerViewController = AVPlayerViewController() 6playerViewController.player = player 7 8let asset = player.currentItem?.asset 9 10var images = [UIImage]() 11let duration = CMTimeGetSeconds(asset!.duration) 12let generator = AVAssetImageGenerator(asset: asset!) 13generator.appliesPreferredTrackTransform = true 14 15// 1秒毎にUIImageを生成 16for index: Int in 0 ..< Int(duration) { 17 let floatTime = Float64(index) 18 let time = CMTimeMakeWithSeconds(floatTime, preferredTimescale: 600) 19 if let image = try? generator.copyCGImage(at: time, actualTime: nil){ 20 21 let image1:UIImage = UIImage(cgImage: image) 22 23 images.append(image1) 24 } 25}

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

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

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

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

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

takabosoft

2019/03/08 04:58

載せてもらったコードは意図的に1秒毎に画像を生成していると思いますが、そこを細かい秒数(0.1秒単位とか)で指定しても反映されないということですか?
sasakikik

2019/03/08 05:31

以下のコードで、動画の任意のコマの時間を取得したのですが、一秒間隔でしか、画像は生成されませんでした。 time = player.currentTime() if let image = try? generator.copyCGImage(at: time, actualTime: nil){ let image1:UIImage = UIImage(cgImage: image) images.append(image1) }
sasakikik

2019/03/08 05:31

0.1秒単位とかで指定することは可能なんでしょうか?
takabosoft

2019/03/08 05:58

copyCGImage(at: で時間を渡していると思いますが、そこでは1秒単位というような制限はありません。 実際にどの時間帯の静止画が取れるかはactualTime引数の方にCMTime型のポインタを渡せばもどしてくれると思うので、printしてみてtimeと比較してみてはどうでしょう。
takabosoft

2019/03/08 06:11

すでにAVPlayerでどこかのviewやレイヤーに動画が再生または表示されていて、そこと同等の画像がほしいのでしたら、画質に拘らなければそのビューやレイヤのスクショを取るという手もあるにはあります(もしかしたら動画再生の部分はスクショで取れないかもしれませんが)。
sasakikik

2019/03/11 02:20

一コマ間隔のtimeを渡しても、一秒間隔でしか画像は生成されてませんでした。 AVassetから、画像を生成する方法で、コマごとの画像が生成できました。 ご意見ありがとうございました。
guest

回答1

0

ベストアンサー

秒単位で指定しているため、1秒ごとしか画像が生成できないのは当然です。
動画のフレームレートを取得して、時間に換算して指定すべきですが、
本来AVAssetImageGeneratorの用途はサムネイル生成用途となっており、

The actual time of a generated image is within the range [requestedTime-requestedTimeToleranceBefore, requestedTime+requestedTimeToleranceAfter] and may differ from the requested time for efficiency.

と誤差を許容しなければなりません。
もしそれが許容できない場合には、以下に示されたようにサンプル単位で取得する
方法をとる必要がありそうです(実際に試していない)
https://www.reddit.com/r/swift/comments/339wfy/loading_video_frame_by_frame/

AVAssetReaderVideoCompositionOutput を利用する場合、任意のコマを簡単に抽出するようには見えないので、実際に試してみて、どちらがご自身のニーズにマッチしているのかご確認されてからどちらを利用するか決めてはいかがかと思います。

投稿2019/03/08 05:36

t_obara

総合スコア5488

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

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

sasakikik

2019/03/11 02:18

ありがとうございます。 AVassetからCGimageにして解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問