以下代码的灵感来自SO上的其他帖子,并从视频中提取图像。不幸的是,即使视频看起来很清晰并且完全聚焦,图像看起来也很模糊。
代码有问题,或者这是从视频中提取图像的自然困难吗?
func getImageFromVideo(videoURL: String) -> UIImage {
do {
let asset = AVURLAsset(URL: NSURL(fileURLWithPath: videoURL), options: nil)
let imgGenerator = AVAssetImageGenerator(asset: asset)
imgGenerator.appliesPreferredTrackTransform = true
let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 1), actualTime: nil)
let image = UIImage(CGImage: cgImage)
return image
} catch {
...
}
}
答案 0 :(得分:2)
您的代码正常运行,没有错误或问题。我尝试过一段视频,抓到的图像并不模糊。
我会尝试使用CMTime
的不同时间刻度来调试它。
使用CMTimeMake
,第一个参数是值,第二个参数是时间刻度。
您的时间刻度为1,因此该值以秒为单位。值0表示第1秒,值1表示第2秒,等等。实际上它表示时间轴中指定位置之后的第一帧。
使用当前的CMTime,它会抓取第一秒的第一帧:即视频的第一帧(即使视频小于1秒)。
时间刻度为4时,该值为1/4秒。等等。
尝试找到一个落在稳定帧上的CMTime(这取决于你的视频帧速率,你必须进行测试)。
例如,如果您的视频为24 fps,那么要准确抓取一帧视频,时间刻度应为24(这样每个值单位代表一个整帧):
let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 24), actualTime: nil)
另一方面,你提到只有视频的第一帧和最后一帧是模糊的。正如您所猜测的那样,它可能是您问题的真正原因,并且是由于缺乏设备稳定性造成的。
注意:视频的编码可能也起作用。一些MPG编码器创建了不完整和插补的帧,这些帧被重建并且#34;播放视频时,但使用copyCGImageAtTime
抓取时这些帧可能会显得模糊。我发现这个罕见问题的唯一解决方案是在模糊之前或之后抓住另一帧。