Swift:即使video看起来很锐利,从video中提取图像也很模糊。

下面的代码受到SO上的其他post的启发,并从video中提取图像。 不幸的是,即使video看上去很锐利并且完全对焦,图像看起来也很模糊。

代码是否有问题,或者这是从video中提取图像的自然困难?

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 { ... } } 

你的代码工作没有错误或问题。 我试过了一个video,抓取的图像并不模糊。

我会尝试通过为CMTime使用不同的时间刻度来进行CMTime

使用CMTimeMake ,第一个参数是值,第二个参数是时间表。

你的时间刻度是1,所以这个值是以秒为单位的。 值0表示第一秒,值1表示第二秒等。实际上,它表示在时间线中指定位置之后的第一帧。

使用当前的CMTime,可以抓取第一帧的第一帧:这是video的第一帧(即使video小于1秒)。

以4的时间刻度,该值将是1/4秒。 等等。

尝试find一个稳定的框架下的CMTime(这取决于你的video帧率,你将不得不进行testing)。

例如,如果你的video是24 fps,那么要抓取一个video帧,时间尺度应该是24(这样每个值单位将代表整个帧):

 let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 24), actualTime: nil) 

另一方面,你提到只有video的第一帧和最后一帧是模糊的。 正如你正确的猜测,这可能是你的问题的实际原因,是由于缺乏设备稳定。

注意:video的编码也可能起作用。 一些MPG编码器会创build不完整和内插的帧,在video播放时会“重新创build”,但在使用copyCGImageAtTime抓取时,这些帧可能会显得模糊。 我发现这个罕见问题的唯一解决scheme就是在模糊的之前或之后抓住另一个框架。