从本地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 } }
- 从提供的
URL
创build一个AVURLAsset
- 使用新创build的
AVURLAsset
创buildAVURLAsset
,负责制作缩略图 - appliedPreferredTrackTransform通知生成器将matrix应用于缩略图生成。 默认值是false。
- 尝试在video轨道的第一帧创build一个
CGImage
- 使用新创build的CGImage创build一个
UIImage
并返回它 - 如果图像生成步骤失败,则会捕获一个错误,并将其与一个无UIImage一起呈现给控制台