2017-12-03 287 views
0

我正在Swift3中开发基于视频的应用程序。根据视频持续时间,我有一个视频网址和一个范围滑块,用户可以从滑块中选择任何最小值和最大值。如果假设用户选择了最小值3秒和最大值7秒,那么在这段时间内,我需要生成一个视频缩略图。对于这个我使用AVAssetImageGenerator生成这个,我都尝试下面的代码来实现这一目标:每次从Swift的Url获取相同的视频缩略图iOS

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值?

回答

-1

假设您修剪过的视频网址是videoURL。成功修剪视频后,添加此代码段。实际上,这段代码将帮助您在每一秒钟从裁剪的视频中提取图像(也就是说,如果您的裁剪视频的持续时间为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 
     } 
    } 
+0

感谢您的回复,在这里我没有修剪视频Url ..我只有一个主视频网址和一个范围滑块,用户将从滑块中选择最小值和最大值。使用该范围值我需要生成缩略图图像。任何建议......你明白吗? –

+0

好的...您需要将滑块的最小值和最大值转换为CMTimeMakeWithSeconds,并将这些值传递给上述函数。 fromTime:Float64是这里的参数。 –

+0

你可以在代码中显示我吗,我更改了CMTimeMake值,但每次都是相同的缩略图。 –