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 抓取时这些帧可能会显得模糊。对于这个罕见问题,我找到的唯一解决方案是在模糊帧之前或之后抓取另一帧。