Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios快速缩略图生成_Ios_Swift_Video Thumbnails - Fatal编程技术网

ios快速缩略图生成

ios快速缩略图生成,ios,swift,video-thumbnails,Ios,Swift,Video Thumbnails,我正在用swift 4开发ios视频剪辑器。我试图呈现一个视频缩略图的水平列表,这些缩略图分布在本地视频文件和远程URL的不同持续时间内。当我在模拟器中测试它时,缩略图在不到一秒钟的时间内生成,这是正常的。然而,当我在实际设备上测试这段代码时,缩略图生成非常缓慢,有时会崩溃。我尝试将实际生成的图像添加到背景线程中,然后在完成后更新主线程上的UI,但效果似乎不太好,并且在渲染屏幕几次后应用程序崩溃。我不确定这是否是因为我正在远离屏幕,而任务仍在试图完成。我试图解决这个问题,让应用程序生成缩略图更快

我正在用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()
}
func渲染缩略图(视图:UIView,视频URL:URL,持续时间:Float64){
变量偏移量:Float64=0
对于0..UIImage中的i{
将asset:AVAsset=AVAsset(url:videoUrl)设为AVAsset
让imgGenerator=AVAssetImageGenerator(资产:资产)
imgGenerator.appliesPreferredTrackTransform=true
做{
让cgImage=try imgGenerator.copyCGImage(at:time,actualTime:nil)
设uiImage=uiImage(cgImage:cgImage)
返回uiImage
}抓住{
}
返回UIImage()
}
文档的第一句话说不要做你正在做的事情!它甚至告诉你应该做什么

单独生成单个图像可能需要解码大量具有复杂相互依赖关系的视频帧。如果需要一系列图像,则可以使用异步方法,
generatecgimagesa同步(forTimes:completionHandler:)
,其解码效率与播放过程中使用的解码效率相似


(我的斜体。)

谢谢。我试过了,但没有意识到这是首选方法,因为性能没有明显提高。我希望找到一种同时获取图像的方法,以提供更好的用户体验。