映像ファイルのフレーム画像を
抜き出す

画像を取り出して NSImageView に表示したり、ファイルに保存する方法も、ちょっとメモっておく。

まずは、AVAsset オブジェクトから、AVAssetImageGeneratorassetImageGeneratorWithAsset(asset) を使って、AVAssetImageGenerator オブジェクトをつくる。次に、copyCGImageAtTime(time,actualTime:actualTime,error:error) でイメージとして取り出す。このときの返り値は CGImageRef オブジェクト。

imageGenerator = AVAssetImageGenerator.assetImageGeneratorWithAsset(asset)

imageRef = imageGenerator.copyCGImageAtTime(currentTime,actualTime:nil,error:nil)

ここでできた CGImageRef を表示させたりするのに、NSBitmapImageRepinitWithCGImage で NSBitmapImageRep オブジェクトに変換してから、representationUsingType(type,properties:properties) で、PNG (NSPNGFileType) もしくは JPEG (NSJPEGFileType) の image data に変換する。jpeg の場合は、properties で圧縮度合い (NSImageCompressionFactor) を 0 ~ 1.0 で指定する。返り値は NSData オブジェクト。

bitmapRep = NSBitmapImageRep.alloc.initWithCGImage(imageRef)

imageData = bitmapRep.representationUsingType(NSPNGFileType,properties:nil)

imageData = bitmapRep.representationUsingType(NSJPEGFileType,properties:{NSImageCompressionFactor => 0.8})

これを、NSImageinitWithDataNSImage オブジェクトにして、NSImageViewsetImage で表示させたり、データのまま、writeToFile(filename,atomically:bool) でファイルに保存する。この際は、指定した type によって、ファイル名で .png もしくは .jpg を指定することを忘れないように。

image = NSImage.alloc.initWithData(imageData)

imageView.setImage(image)

imageData.writeToFile(filename,atomically:true)