注意:添加AVFountion.Framework
网络请求比较耗时,所以要写在异步线程里。
import Foundation
import AVFoundation
extension UIImageView{
//获取网络视频截图
func getNetWorkVidoeImage(url:String){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), {
//需要长时间处理的代码
letasset =AVURLAsset(URL:NSURL(string: url)!)
letgenerator =AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform=true
lettime =CMTimeMakeWithSeconds(0.0,600)
varactualTime:CMTime=CMTimeMake(0,0)
varimage:CGImageRef!
do{
image =try generator.copyCGImageAtTime(time, actualTime: &actualTime)
}catch let error as NSError{
print(error)
}
dispatch_async(dispatch_get_main_queue(), {
//需要主线程执行的代码
self.image = UIImage(CGImage: image)
})
})
}
}
CMTimeMake和CMTimeMakeWithSeconds 详解
CMTimeMake(a,b) a当前第几帧, b每秒钟多少帧.当前播放时间a/b
CMTimeMakeWithSeconds(a,b) a当前时间,b每秒钟多少帧
CMTimeMake CMTime CMTimeMake ( int64_t value, int32_t timescale);
time指的就是时间(不是秒)
而时间要换算成秒就要看第二個参数timeScale了.
timeScale指的是1秒需要由几个frame构成(可以视为fps),
因此真正要表达的时间就会是 time / timeScale 才會是秒.
简单举个🌰
CMTimeMake(60, 30);
CMTimeMake(30, 15);
在这两个例子中所表示在影片中的时间都皆为2秒钟,
但是影隔播放速率则不同, 相差了有两倍.