swift 获取网络视频生成视频截图
生成视频截图代码:
DispatchQueue.global().async { //获取网络视频 let url = self.videoImgUrlData[i] let videoURL = URL(string: url) let avAsset = AVURLAsset.init(url: videoURL!, options: nil) ///生成视频截图 let generator = AVAssetImageGenerator(asset: avAsset) generator.appliesPreferredTrackTransform = true generator.apertureMode = AVAssetImageGenerator.ApertureMode.encodedPixels let time = CMTimeMakeWithSeconds(0.0, preferredTimescale: 600) var actualTime:CMTime = CMTimeMake(value: 10, timescale: 10) var imageRef:CGImage? var imageUIs:UIImage? do{ imageRef = try generator.copyCGImage(at: time, actualTime: &actualTime) if let cgimage = imageRef{ imageUIs = UIImage(cgImage: imageRef!) } print("应该数据请求成功了\(imageRef)") }catch let err as NSError{ imageUIs = UIImage(named: "cover.jpg") print("出现错误!\(err)") } //在主线程中显示截图 DispatchQueue.main.async { self.videoImgData.append(imageUIs!) self.reloadData() } }
这里遇到了问题,刚开始是直接用try!的,其实不建议用try!,如果遇到了错误程序会直接崩溃,所以改为了do{ try }catch{ },在错误处理中,如果遇到了错误,就直接指定一张图片。
还有一点是关于CGImage与UIImage之间的转换:
如果是UIImage转为CGImage用到了强转,一般这里会遇到错误,其他的方法尚未找到
//imageRef是CGImage imageRef = UIImage(named: "cover.jpg") as! CGImage
如果是CGImage转为UIImage则比较简单
//imageRef是CGImage let imageUIs = UIImage(cgImage: imageRef!)
由于我写的项目是把视频截图放在collectionview里,所以,在以下函数里设置cell数目的时候,设置为视频截图的数目,不然会出现数组越界。当然,也可以有其他的处理方法。
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { }
以上