Crea una miniatura o un’immagine di un AVPlayer al momento attuale

Ho implementato un AVPlayer e voglio prendere un’immagine o una miniatura quando clicco su un pulsante della barra degli strumenti e aperto in un nuovo UIViewController con UIImageView . L’immagine dovrebbe essere ridimensionata esattamente come l’ AVPlayer . Il seguito sta già funzionando, devo solo implementare che ottengo l’immagine al tempo di riproduzione corrente.

Grazie!

Objective-C

 AVAsset *asset = [AVAsset assetWithURL:sourceURL]; AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; CMTime time = CMTimeMake(1, 1); CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); // CGImageRef won't be released by ARC 

veloce

 var asset = AVAsset.assetWithURL(sourceURL) var imageGenerator = AVAssetImageGenerator(asset: asset!) var time = CMTimeMake(1, 1) var imageRef = try! imageGenerator!.copyCGImageAtTime(time, actualTime: nil) var thumbnail = UIImage.imageWithCGImage(imageRef) CGImageRelease(imageRef) // CGImageRef won't be released by ARC 

Swift 3.0

 var sourceURL = URL(string: "Your Asset URL") var asset = AVAsset(url: sourceURL!) var imageGenerator = AVAssetImageGenerator(asset: asset) var time = CMTimeMake(1, 1) var imageRef = try! imageGenerator.copyCGImage(at: time, actualTime: nil) var thumbnail = UIImage(cgImage:imageRef) 

Nota: Interpreta il codice Swift in base alla tua versione rapida.

Prova questo

  - (UIImage*)takeScreeenShot { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidURL options:nil]; AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; imageGenerator.appliesPreferredTrackTransform = YES; NSError *err = NULL; CMTime time = CMTimeMake(1, 60); // time range in which you want screenshot CGImageRef imgRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:&err]; return [[UIImage alloc] initWithCGImage:imgRef]; } 

Spero che questo ti aiuti !!!

Swift 2.x:

 let asset = AVAsset(...) let imageGenerator = AVAssetImageGenerator(asset: asset) let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1) if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) { let image = UIImage(CGImage: imageRef) // do something with your image } 

Aggiungi sotto il codice per generare una miniatura dal video.

 AVURLAsset *assetURL = [[AVURLAsset alloc] initWithURL:partOneUrl options:nil]; AVAssetImageGenerator *assetGenerator = [[AVAssetImageGenerator alloc] initWithAsset:assetURL]; assetGenerator.appliesPreferredTrackTransform = YES; NSError *err = NULL; CMTime time = CMTimeMake(1, 2); CGImageRef imgRef = [assetGenerator copyCGImageAtTime:time actualTime:NULL error:&err]; UIImage *one = [[UIImage alloc] initWithCGImage:imgRef]; 

Ecco come ottengo uno scatto del fotogramma visibile attuale sulla scena in Swift:

La chiave è di

  1. ottenere l’ora corrente del giocatore che è di tipo CMTime
  2. convertire quel tempo in secondi di tipo Float64
  3. reinserire i secondi in CMTime usando CMTimeMake . Il primo parametro che sarebbe dove vanno i secondi dovrebbe essere lanciato su Int64

Codice:

 var myImage: UIImage? guard let player = player else { return } let currentTime: CMTime = player.currentTime() // step 1. let currentTimeInSecs: Float64 = CMTimeGetSeconds(currentTime) // step 2. let actionTime: CMTime = CMTimeMake(Int64(currentTimeInSecs), 1) // step 3. let asset = AVAsset(url: fileUrl) let imageGenerator = AVAssetImageGenerator(asset: asset) imageGenerator.appliesPreferredTrackTransform = true // prevent image rotation do{ let imageRef = try imageGenerator.copyCGImage(at: actionTime, actualTime: nil) myImage = UIImage(cgImage: imageRef) }catch let err as NSError{ print(err.localizedDescription) }