在 ffmpeg 中以高质量进行 VP8 单次转换

在 ffmpeg 中以高质量进行 VP8 单次转换

我正在开发一个原始到延时拍摄程序,并使用 ffmpeg 从我的程序输出的一系列 JPG 中生成视频。

用户可以从不同的编解码器中进行选择,例如 libx264、mjpeg、vp8、vp9。

我使用 h264 和 mjpeg 获得了良好的效果,但是 vp8 给了我一些非常视频质量很差,尽管我将质量设置得很高,但文件大小与 h264 视频相当。

我使用以下设置:

ffmpeg.exe -framerate 12 -i "./output/img_%05d.jpg" -dst_range 1 -color_range 2 -c:v libvpx -b:v 0 -threads 8 -speed 2 -crf 8 "./output/video.webm"

您可以在此处观看示例视频:https://www.youtube.com/watch?v=eG2jxzR3Uxs(编码问题大多在 9 秒后显现)。

Stack Overflow 上有人说 VP8 需要两次传递,但这不切实际。有没有办法在一次传递中获得良好的结果?在大小/质量方面可以与 h264 媲美?

答案1

虽然感知质量是主观的,但您可以使用-quality变量调整整体质量,例如-quality good。比特率会影响您设置为 0 的质量,我认为这只是一个错误。

答案2

一次性获得高质量结果的唯一方法是使用恒定速率因子(慢性肾衰竭)模式。请阅读VP8VP9指南以获取更多信息。

当设置 时-crf X,每帧都以目标质量等级 进行编码X。但是,编码器会应用额外的约束,具体取决于 设置的比特率-b:v

  • 如果-b:v 0使用,比特率可以根据源序列和设定的目标质量自由变化。这是“正常 CRF 模式”所需的选项,相当于-crf X使用x264

  • 如果-b:v设置为正比特率,则该约束将用作最大比特率。

    例如,对于 VP8,使用-crf 10-b:v 500K来处理 1080p 视频肯定会将比特率降低到 500 kBit/s,而不是让质量自由变化,这会使输出看起来相当糟糕,因为 1080p 视频需要的比特率远远超过 500 kBit/s。-crf 10 -b:v 5M对于 VP8,设置会更有意义。对于 VP9,您通常需要较低的比特率值,因为这样效率更高。

  • 如果-b:v根本没有设置,ffmpeg 将选择默认值 200 kBit/s,这很可能会导致质量不佳(除非您有一个低分辨率、易于编码的序列)。因此,使用时不要这样做-crf

您可以通过查看 ffmpeg 使用该设置运行时产生的输出来验证编码器设置-loglevel debug

就您的具体情况而言,我认为这些选项没有任何问题,但可能除外-speed 2。设置此选项将禁用某些编码器功能,但会牺牲速率控制精度。删除此选项,看看是否能提高质量。

请注意,该-quality选项具有误导性;它是一个旧选项,现在称为-deadlineffmpeg -h encoder=libvpx有关详细信息,请参阅)。 唯一可行的设置是-qualitygoodbestrealtime,但这是用于实时流式传输)。good是默认值,因此您不必明确指定它。best将导致非常长的编码时间。

相关内容