从本地video快速创build缩略图

如何从本地video文件快速创build缩略图?

例如,如果video文件path位于此处:

file:///Users/Dev/Library/Developer/CoreSimulator/Devices/F33222DF-D8F0-448B-A127-C5B03C64D0DC/data/Containers/Data/Application/4BC62DBF-0108-453C-9324-5BC0E356FE24/tmp/trim.059D11E6-F0EF-43DB-9E97-CA4F1F95D6B6.MOV

谢谢。

翻译了一些来自:

使用AVFoundation的video的第一帧

  var err: NSError? = nil let asset = AVURLAsset(URL: NSURL(fileURLWithPath: "/that/long/path"), options: nil) let imgGenerator = AVAssetImageGenerator(asset: asset) let cgImage = imgGenerator.copyCGImageAtTime(CMTimeMake(0, 1), actualTime: nil, error: &err) // !! check the error before proceeding let uiImage = UIImage(CGImage: cgImage) let imageView = UIImageView(image: uiImage) // lay out this image view, or if it already exists, set its image property to uiImage 

BaseZen的回答翻译了Swift 3 / Swift 4

您需要将要制作缩略图的video的位置设置为url资源path,例如:

不要忘记import AVFoundation

 func getThumbnailFrom(path: URL) -> UIImage? { do { let asset = AVURLAsset(url: path , options: nil) let imgGenerator = AVAssetImageGenerator(asset: asset) imgGenerator.appliesPreferredTrackTransform = true let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil) let thumbnail = UIImage(cgImage: cgImage) return thumbnail } catch let error { print("*** Error generating thumbnail: \(error.localizedDescription)") return nil } } 

对于有这个问题的人,我在Github上创build了下面这个例子

BaseZen的答案翻译成Swift 2:

 import UIKit import AVFoundation do { let asset = AVURLAsset(URL: NSURL(fileURLWithPath: "/that/long/path"), options: nil) let imgGenerator = AVAssetImageGenerator(asset: asset) imgGenerator.appliesPreferredTrackTransform = true let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 1), actualTime: nil) let uiImage = UIImage(CGImage: cgImage) let imageView = UIImageView(image: uiImage) // lay out this image view, or if it already exists, set its image property to uiImage } catch let error as NSError { print("Error generating thumbnail: \(error)") } 

编写更less,更简单的代码是更好的理解。 这是我在Swift 3.1中转换的解决scheme

 import AVFoundation func videoPreviewUIImage(moviePath: URL) -> UIImage? { let asset = AVURLAsset(url: moviePath) let generator = AVAssetImageGenerator(asset: asset) generator.appliesPreferredTrackTransform = true let timestamp = CMTime(seconds: 2, preferredTimescale: 60) if let imageRef = try? generator.copyCGImage(at: timestamp, actualTime: nil) { return UIImage(cgImage: imageRef) } else { return nil } } 

希望它能帮助别人。

这是David的答案的清理版本,并针对iOS 11 / Swift 4.0进行了testing:

 func generateThumbnail(url: URL) -> UIImage? { do { let asset = AVURLAsset(url: url) let imageGenerator = AVAssetImageGenerator(asset: asset) imageGenerator.appliesPreferredTrackTransform = true let cgImage = try imageGenerator.copyCGImage(at: kCMTimeZero, actualTime: nil) return UIImage(cgImage: cgImage) } catch { print(error.localizedDescription) return nil } } 
  1. 从提供的URL创build一个AVURLAsset
  2. 使用新创build的AVURLAsset创buildAVURLAsset ,负责制作缩略图
  3. appliedPreferredTrackTransform通知生成器将matrix应用于缩略图生成。 默认值是false。
  4. 尝试在video轨道的第一帧创build一个CGImage
  5. 使用新创build的CGImage创build一个UIImage并返回它
  6. 如果图像生成步骤失败,则会捕获一个错误,并将其与一个无UIImage一起呈现给控制台