我想在特定时间从视频中抓取帧。我用一个指定为秒的时间作为Float64来调用我的抓帧功能。 问题是它没有抓住当前帧。它似乎忽略了小数。如果我用例如1.22和1.70调用该函数,它将返回相同的帧。对于Swift来说,我是一个很新的人,所以我猜我没有把CMTime对象弄好。那么有人能看出这个有什么问题吗?
func generateThumnail(url : NSURL, fromTime:Float64) -> UIImage {
var asset :AVAsset = AVAsset.assetWithURL(url) as! AVAsset
var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
var error : NSError? = nil
var time : CMTime = CMTimeMakeWithSeconds(fromTime, 600)
var img : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error)
var frameImg : UIImage = UIImage(CGImage: img)!
return frameImg
}
var grabTime = 1.22
img = generateThumnail(urlVideo, fromTime: Float64(grabTime))
答案 0 :(得分:12)
感谢@ eric-d发现这篇文章: iOS Take Multiple Screen Shots
我设法找出添加:
assetImgGenerate.requestedTimeToleranceAfter = kCMTimeZero;
assetImgGenerate.requestedTimeToleranceBefore = kCMTimeZero;
...对我的功能来说会有所作为。
我的更新功能如下:
func generateThumnail(url : NSURL, fromTime:Float64) -> UIImage {
var asset :AVAsset = AVAsset.assetWithURL(url) as! AVAsset
var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
assetImgGenerate.requestedTimeToleranceAfter = kCMTimeZero;
assetImgGenerate.requestedTimeToleranceBefore = kCMTimeZero;
var error : NSError? = nil
var time : CMTime = CMTimeMakeWithSeconds(fromTime, 600)
var img : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error)
var frameImg : UIImage = UIImage(CGImage: img)!
return frameImg
}
var grabTime = 1.22
img = generateThumnail(urlVideo, fromTime: Float64(grabTime))
答案 1 :(得分:1)
我将arpo的答案纳入了我的项目,并针对Swift 3进行了更新:
fileprivate func generateThumnail(url : URL, fromTime:Float64) -> UIImage? {
let asset :AVAsset = AVAsset(url: url)
let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
assetImgGenerate.requestedTimeToleranceAfter = kCMTimeZero;
assetImgGenerate.requestedTimeToleranceBefore = kCMTimeZero;
let time : CMTime = CMTimeMakeWithSeconds(fromTime, 600)
if let img = try? assetImgGenerate.copyCGImage(at:time, actualTime: nil) {
return UIImage(cgImage: img!)
} else {
return nil
}
}
答案 2 :(得分:1)
快速4.2
fileprivate func generateThumnail(url : URL, fromTime:Float64) -> UIImage? {
let asset :AVAsset = AVAsset(url: url)
let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
assetImgGenerate.requestedTimeToleranceAfter = CMTime.zero;
assetImgGenerate.requestedTimeToleranceBefore = CMTime.zero;
let time : CMTime = CMTimeMakeWithSeconds(fromTime, preferredTimescale: 600)
if let img = try? assetImgGenerate.copyCGImage(at:time, actualTime: nil) {
return UIImage(cgImage: img)
} else {
return nil
}
}