每次从Swift iOS的Url获取相同的video缩略图

我正在Swift3中开发基于video的应用程序。 根据video持续时间,我有一个videourl和一个范围滑块,用户可以从滑块中select任何最小值和最大值。 如果假设用户select了最小值3秒和最大值7秒,那么在这段时间内,我需要生成一个video缩略图。 为此,我正在使用AVAssetImageGenerator来生成这个,我尝试了下面的代码来实现这一点:

 func createThumbnailOfVideoFromFileURL(_ strVideoURL: URL) -> UIImage?{ let asset = AVAsset(url: strVideoURL) let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true let time = CMTimeMake(1, 30) let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) guard let cgImage = img else { return nil } let frameImg = UIImage(cgImage: cgImage) return frameImg } 

 func generateThumbnailForUrl(vidUrl:URL) -> UIImage { let asset = AVURLAsset(url: vidUrl, options: nil) let imgGenerator = AVAssetImageGenerator(asset: asset) var thmbnlImg = UIImage() do{ let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil) thmbnlImg = UIImage(cgImage: cgImage) thmbnlImg = thmbnlImg.imageRotatedByDegrees(degrees: 90.0, flip: false) } catch{ print(error) } // !! check the error before proceeding return thmbnlImg } 

但问题是我得到同样的缩略图使用上述方法,bcos我不是在这两个方法设置持续时间。 如何添加最小和最大持续时间来为每个不同的持续时间生成不同的缩略图图像。 请帮我解决我的问题。 谢谢!

编辑:我试图设置持续时间,如:

let time: CMTime = CMTimeMakeWithSeconds(rangeSlider!.lowerValue, 1)

然后我得到不同的缩略图图像,但对于一些滑块范围,我也得到零缩略图图像。 任何人都可以有一些想法如何设置CMTimeMakeWithSeconds preferredTimeScale值?

假设您的剪辑videourl是videoURL 。 成功修剪video后,添加此代码段。 其实这个代码片段将帮助你在每一秒提取修剪后的video图像(也就是说,如果你的修剪video的持续时间是10秒,这段代码将在每秒提取10个图像,所有这些图像保存在一个数组中,名为videoFrames )。 最后,你可以做任何你想要的这些图像。 您也可以在此过程正在进行时添加活动指示器。 希望这可以帮助。

 var videoFrames = [UIImage]() let asset : AVAsset = AVAsset(url: videoURL as URL) let videoDuration = CMTimeGetSeconds(asset.duration) let integerValueOFVideoDuration = Int(videoDuration) //start activity indicator here for index in 0..<integerValueOFVideoDuration + 1 { self.generateFrames(url: videoURL, fromTime: Float64(index)) } func generateFrames(url: NSURL, fromTime: Float64) { if videoFrames.count == integerValueOFVideoDuration { //end activity indicator here return } let asset: AVAsset = AVAsset(url: url as URL) let assetImgGenerate: AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.maximumSize = CGSize(width: 300, height: 300) assetImgGenerate.appliesPreferredTrackTransform = true let time: CMTime = CMTimeMakeWithSeconds(fromTime, 600) var img: CGImage? do { img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil) } catch { } if img != nil { let frameImg: UIImage = UIImage(cgImage: img!) videoFrames.append(frameImg) } else { //return nil } }