如何快速生成 1 秒视频的拇指图像?

问题描述

我无法生成 1 秒视频的缩略图。我试过下面的代码,但它每次都会生成黑色图像。我试过将时间刻度传递为 (0,30),(0,1)。如果视频超过 1.5 秒,它就可以工作。

static func thumbnailFromVideo(videoUrl: URL,time: CMTime) -> UIImage {
    let asset: AVAsset = AVAsset(url: videoUrl) as AVAsset
    let imgGenerator = AVAssetimageGenerator(asset: asset)
    imgGenerator.appliesPreferredTrackTransform = true
    do {
        let cgImage = try imgGenerator.copyCGImage(at: time,actualTime: nil)
        let uiImage = UIImage(cgImage: cgImage)
        return uiImage
    } catch {
        
    }
    return UIImage()
}

解决方法

如果您需要帧精确缩略图,则需要将请求的前后时间容差设置为零:

来自文档:

将requestedTimeToleranceBefore 和requestedTimeToleranceAfter 的值设置为零以请求帧精确图像生成;这可能会导致额外的解码延迟。


imgGenerator.requestedTimeToleranceBefore = .zero
imgGenerator.requestedTimeToleranceAfter = .zero
,

这对我有用。

    func getvideosnapshot(url : URL,completion : @escaping ((UIImage?) ->())){
    DispatchQueue.global().async {
        let asset: AVAsset = AVAsset(url: url)
        let imageGenerator = AVAssetImageGenerator(asset: asset)
        imageGenerator.appliesPreferredTrackTransform = true
        let timestamp = CMTime(value: 1,timescale: 600)
        do {
            let thumbnail = try imageGenerator.copyCGImage(at: timestamp,actualTime: nil)
            DispatchQueue.main.async {
                completion(UIImage(cgImage: thumbnail))
            }
        } catch let err as NSError {
           // print(err)
            completion(nil)
        }
    }
}