ios - 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()
}
解决方案
文档的第一句话说不要做你正在做的事情!它甚至会告诉你该怎么做。
单独生成单个图像可能需要对具有复杂相互依赖性的大量视频帧进行解码。如果您需要一系列图像,则可以使用异步方法获得更高的效率,该方法
generateCGImagesAsynchronously(forTimes:completionHandler:)
采用的解码效率与播放期间使用的解码效率相似。
(斜体是我的。)
推荐阅读
- terraform - 使用 terraform 0.11 创建 libvirt 网络后注入 iptables 规则
- azure - Azure 应用服务:WEBSITE_RUN_FROM_PACKAGE - 旧的 zip 文件会被删除吗?
- javascript - Safari 输入框错误 - 无法选择文本
- python - 如何在 concurrent.futures 中获取分析完成的未来的名称?
- html - 在媒体查询中移动文本
- java - 如何在Java中以非阻塞方式列出目录中的文件?
- java - HtmlUnit 可以覆盖 JavaScript 函数吗?
- android - 如何使 CardView 在图像上引人注目?
- java - MYSQL 8 JPA 2.0 mysql 在 JPA 保存后将 1 秒添加到当前日期
- jquery - 如何在 jQuery 中应用“选定”元素?