我正在开发一个原始到延时拍摄程序,并使用 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
一次性获得高质量结果的唯一方法是使用恒定速率因子(慢性肾衰竭)模式。请阅读VP8和VP9指南以获取更多信息。
当设置 时-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
选项具有误导性;它是一个旧选项,现在称为-deadline
(ffmpeg -h encoder=libvpx
有关详细信息,请参阅)。 唯一可行的设置是-quality
或good
(best
和realtime
,但这是用于实时流式传输)。good
是默认值,因此您不必明确指定它。best
将导致非常长的编码时间。