Swift:即使视频看起来很清晰,但从视频中提取图像却很模糊?
Swift: extracting image from video comes out blurry even though video looks sharp?
下面的代码受到 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 {
...
}
}
您的代码运行正常,没有错误或问题。我试过视频,抓取的图像不模糊。
我会尝试使用 CMTime
的不同时间尺度来调试它。
对于CMTimeMake
,第一个参数是值,第二个参数是时间刻度。
您的时间刻度为 1,因此该值以秒为单位。值0表示第一秒,值1表示第二秒,依此类推。实际上它表示时间轴中指定位置之后的第一帧。
使用您当前的 CMTime,它会抓取第一秒的第一帧:那是视频的第一帧(即使视频小于 1 秒)。
时间刻度为 4 时,该值为 1/4 秒。等等
尝试找到一个恰好落在稳定帧上的 CMTime(这取决于您的视频帧率,您必须进行测试)。
例如,如果您的视频是 24 fps,那么要准确地抓取一帧视频,时间刻度应该是 24(这样每个值单元将代表一整帧):
let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 24), actualTime: nil)
另一方面,您提到只有视频的第一帧和最后一帧模糊。正如您猜对的那样,这可能是您问题的真正原因,并且是由于设备稳定性不足造成的。
注意:视频的编码可能也有影响。某些 MPG 编码器会创建不完整的插值帧,在播放视频时这些帧为 "recreated",但在使用 copyCGImageAtTime
抓取时这些帧可能会显得模糊。对于这个罕见问题,我找到的唯一解决方案是在模糊帧之前或之后抓取另一帧。
下面的代码受到 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 {
...
}
}
您的代码运行正常,没有错误或问题。我试过视频,抓取的图像不模糊。
我会尝试使用 CMTime
的不同时间尺度来调试它。
对于CMTimeMake
,第一个参数是值,第二个参数是时间刻度。
您的时间刻度为 1,因此该值以秒为单位。值0表示第一秒,值1表示第二秒,依此类推。实际上它表示时间轴中指定位置之后的第一帧。
使用您当前的 CMTime,它会抓取第一秒的第一帧:那是视频的第一帧(即使视频小于 1 秒)。
时间刻度为 4 时,该值为 1/4 秒。等等
尝试找到一个恰好落在稳定帧上的 CMTime(这取决于您的视频帧率,您必须进行测试)。
例如,如果您的视频是 24 fps,那么要准确地抓取一帧视频,时间刻度应该是 24(这样每个值单元将代表一整帧):
let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 24), actualTime: nil)
另一方面,您提到只有视频的第一帧和最后一帧模糊。正如您猜对的那样,这可能是您问题的真正原因,并且是由于设备稳定性不足造成的。
注意:视频的编码可能也有影响。某些 MPG 编码器会创建不完整的插值帧,在播放视频时这些帧为 "recreated",但在使用 copyCGImageAtTime
抓取时这些帧可能会显得模糊。对于这个罕见问题,我找到的唯一解决方案是在模糊帧之前或之后抓取另一帧。