Skip to content

Instantly share code, notes, and snippets.

@maxcampolo
Last active November 26, 2023 15:24
Show Gist options
  • Save maxcampolo/2d1e6b84b76d646a95978a80789bf200 to your computer and use it in GitHub Desktop.
Save maxcampolo/2d1e6b84b76d646a95978a80789bf200 to your computer and use it in GitHub Desktop.
Generate images from AVAsset with AVAssetImageGenerator and from AVPlayerItem with AVPlayerItemVideoOutput
/// Generate thumbnail with AVAssetImageGenerator
func generateThumbnailFromAsset(asset: AVAsset, forTime time: CMTime) -> UIImage {
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
var actualTime: CMTime = kCMTimeZero
do {
let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: &actualTime)
let image = UIImage(CGImage: imageRef)
return image
} catch let error as NSError {
print("\(error.description). Time: \(actualTime)")
}
}
/// Generate thumbnail with pixel buffer
func generateThumbnailFromPlayerItem(item: AVPlayerItem) -> UIImage {
let videoOutput = AVPlayerItemVideoOutput(pixelBufferAttributes: [kCVPixelBufferPixelFormatTypeKey as String : NSNumber(unsignedInt: kCVPixelFormatType_32BGRA)])
item.addOutput(videoOutput)
if let pixelBuffer = videoOutput.copyPixelBufferForItemTime(item.currentTime(), itemTimeForDisplay: nil) {
let ciImage = CIImage(CVPixelBuffer: pixelBuffer)
let tempContext = CIContext(options: nil)
let videoImage = tempContext.createCGImage(ciImage, fromRect: CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(pixelBuffer), height: CVPixelBufferGetHeight(pixelBuffer)))
let image = UIImage(CGImage: videoImage)
return image
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment