フレームワークと Swift 3.0を使用するソリューションのAVFoundation
コード (コメント付きのコードは必要ありません。コードの下で説明します。必要かどうかを判断する必要があります):
import AVFoundation
func generateThumbnailForVideo(at url: URL) -> UIImage? {
let kPreferredTimescale: Int32 = 1000
let asset = AVURLAsset(url: url)
let generator = AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform = true
//generator.requestedTimeToleranceBefore = kCMTimeZero
//generator.requestedTimeToleranceAfter = kCMTimeZero
//generator.maximumSize = CGSize(width: 100, height: 100)
var actualTime: CMTime = CMTime(seconds: 0, preferredTimescale: kPreferredTimescale)
//generates thumbnail at first second of the video
let cgImage = try? generator.copyCGImage(at: CMTime(seconds: 1, preferredTimescale: kPreferredTimescale), actualTime: &actualTime)
return cgImage.flatMap() { return UIImage(cgImage: $0, scale: UIScreen.main.scale, orientation: .up) }
}
サムネイルの作成にはコストがかかる可能性があるため、このコードをバックグラウンド スレッドで実行することを検討してください。
AVAssetImageGenerator
また、クラスのプロパティのいくつかを見てください。
requestedTimeToleranceBefore
( Apple のドキュメント):
画像が生成される可能性がある、要求された時間までの最大時間。
デフォルト値は kCMTimePositiveInfinity です。
requestedTimeToleranceBefore と requestedTimeToleranceAfter の値を kCMTimeZero に設定して、フレーム精度の画像生成を要求します。これにより、追加のデコード遅延が発生する可能性があります。
requestedTimeToleranceAfter
( Apple のドキュメント):
要求された時間からイメージが生成されるまでの最大時間。
デフォルト値は kCMTimePositiveInfinity です。
requestedTimeToleranceBefore と requestedTimeToleranceAfter の値を kCMTimeZero に設定して、フレーム精度の画像生成を要求します。これにより、追加のデコード遅延が発生する可能性があります。
maximumSize
( Apple のドキュメント):
生成された画像の最大サイズを指定します。
デフォルト値は CGSizeZero で、アセットのスケーリングされていない寸法を指定します。
AVAssetImageGenerator は、定義された境界ボックス内に収まるように画像をスケーリングします。画像が拡大されることはありません。スケーリングされた画像の縦横比は、アパーチャモード プロパティによって定義されます。