首页 > 解决方案 > ios 快速缩略图生成

问题描述

我正在使用 swift 4 开发一个 ios 视频修剪器。我正在尝试渲染一个水平的视频缩略图列表,这些缩略图分布在本地视频文件和远程 url 的不同持续时间。当我在模拟器中对其进行测试时,缩略图会在不到一秒的时间内生成,这没问题。但是,当我在实际设备上测试此代码时,缩略图的生成速度非常慢,有时还会崩溃。我尝试将实际的图像生成添加到后台线程,然后在完成后更新主线程上的 UI,但这似乎效果不佳,并且应用程序在渲染屏幕几次后崩溃。我不确定这是否是因为我在任务仍在尝试完成时离开屏幕。我正在尝试解决此问题并让应用程序更快地生成缩略图并且不会崩溃。这是我在下面使用的代码。对于这个问题,我非常感谢任何帮助。

func renderThumbnails(view: UIView, videoURL: URL, duration: Float64) {
 var offset: Float64 = 0

 for i in 0..<self.IMAGE_COUNT{

   DispatchQueue.global(qos: .userInitiated).async {
     offset = Float64(i) * (duration / Float64(self.IMAGE_COUNT))
     let thumbnail = thumbnailFromVideo(videoUrl: videoURL,
                                                   time: CMTimeMake(Int64(offset), 1))
     DispatchQueue.main.async {
       self.addImageToView(image: thumbnail, view: view, index: i)
     }
   }
 }
}


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()
}

标签: iosswiftvideo-thumbnails

解决方案


文档的第一句话说不要做你正在做的事情!它甚至会告诉你该怎么做。

单独生成单个图像可能需要对具有复杂相互依赖性的大量视频帧进行解码。如果您需要一系列图像,则可以使用异步方法获得更高的效率,该方法generateCGImagesAsynchronously(forTimes:completionHandler:)采用的解码效率与播放期间使用的解码效率相似。

(斜体是我的。)


推荐阅读