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

Posted

技术标签:

【中文标题】如何快速生成 1 秒视频的拇指图像?【英文标题】:How to generate thumb image for 1 second video in swift? 【发布时间】:2021-04-14 12:46:47 【问题描述】:

我无法生成 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()

【问题讨论】:

【参考方案1】:

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

来自文档:

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


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

【讨论】:

【参考方案2】:

这对我有用。

    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)
        
    

【讨论】:

以上是关于如何快速生成 1 秒视频的拇指图像?的主要内容,如果未能解决你的问题,请参考以下文章

Fusuma相册查看视频拇指交换

如何将另一个图像添加到滑块的拇指或如何添加两个拇指图像?

如何从 Photolibrary 图像中获取拇指图像?

在“点击”时重置 addClass 函数

如何读取 UISlider 拇指图像的大小

在 ffmpeg 中从单个图像创建特定持续时间的视频