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}
載せてもらったコードは意図的に1秒毎に画像を生成していると思いますが、そこを細かい秒数(0.1秒単位とか)で指定しても反映されないということですか?
以下のコードで、動画の任意のコマの時間を取得したのですが、一秒間隔でしか、画像は生成されませんでした。
time = player.currentTime()
if let image = try? generator.copyCGImage(at: time, actualTime: nil){
let image1:UIImage = UIImage(cgImage: image)
images.append(image1)
}
0.1秒単位とかで指定することは可能なんでしょうか?
copyCGImage(at: で時間を渡していると思いますが、そこでは1秒単位というような制限はありません。
実際にどの時間帯の静止画が取れるかはactualTime引数の方にCMTime型のポインタを渡せばもどしてくれると思うので、printしてみてtimeと比較してみてはどうでしょう。
すでにAVPlayerでどこかのviewやレイヤーに動画が再生または表示されていて、そこと同等の画像がほしいのでしたら、画質に拘らなければそのビューやレイヤのスクショを取るという手もあるにはあります(もしかしたら動画再生の部分はスクショで取れないかもしれませんが)。
一コマ間隔のtimeを渡しても、一秒間隔でしか画像は生成されてませんでした。
AVassetから、画像を生成する方法で、コマごとの画像が生成できました。
ご意見ありがとうございました。
回答1件
あなたの回答
tips
プレビュー