使用 x264 与 libvpx-vp9 的 FFmpeg CRF 控制
FFmpeg CRF control using x264 vs libvpx-vp9
我有一些将 ffmpeg 与 x264 结合使用的经验,我想与 libvpx-vp9 进行比较。我仔细测试了原始 video, varying the crf settings and presets both with x264 and libvpx-vp9. I am new to libvpx and I followed this and this 的简单单通道编码,但我可能仍然指定了错误的参数组合,因为我得到的结果对我来说意义不大。
对于 x264 我做了:
ffmpeg -i test_video.y4m -c:v libx264 -threads 1 -crf <crf> -preset <preset> -y output.mkv
得到如下结果:
codec , settings , time , PSNR ,bitrate
libx264,['-crf', '20', '-preset', 'fast'],13.1897280216, 42.938337 ,15728
libx264,['-crf', '20', '-preset', 'medium'],16.80494689, 42.879753 ,15287
libx264,['-crf', '20', '-preset', 'slow'],25.1142120361, 42.919206 ,15400
libx264,['-crf', '30', '-preset', 'fast'],8.79047083855, 37.975141 ,4106
libx264,['-crf', '30', '-preset', 'medium'],9.936599016, 37.713778 ,3749
libx264,['-crf', '30', '-preset', 'slow'],13.0959510803, 37.569511 ,3555
这对我来说很有意义,给定一个 crf 值,你会得到一个 PSNR 值,更改预设可以降低比特率,但会增加编码时间。
对于 libvpx-vp9 我做了:
ffmpeg -i test_video.y4m -c:v libvpx-vp9 -threads 1 -crf <crf> -cpu-used <effort> -y output.mkv
首先我从网上的教程中想到 -cpu-used
选项等同于 x264 中的 -preset
。那是对的吗?如果是这样,与 -quality
有什么区别?此外,由于 运行ge 从 -8 变为 8,我假设负值是快速选项,而正值是最慢的。我得到的结果非常混乱:
codec , settings , time , PSNR ,bitrate
libvpx-vp9,['-crf', '20', '-cpu-used', '-2'],19.6644911766,32.54317,571
libvpx-vp9,['-crf', '20', '-cpu-used', '0'],176.670887947,32.69899,564
libvpx-vp9,['-crf', '20', '-cpu-used', '2'],20.0206270218,32.54317,571
libvpx-vp9,['-crf', '30', '-cpu-used', '-2'],19.7931578159,32.54317,571
libvpx-vp9,['-crf', '30', '-cpu-used', '0'],176.587754965,32.69899,564
libvpx-vp9,['-crf', '30', '-cpu-used', '2'],19.8394429684,32.54317,571
比特率非常低,PSNR 似乎不受 crf
设置的影响(与 x264 相比非常低)。 -cpu-used
设置的影响非常小,而且 -2 和 2 似乎是相同的选项。我错过了什么?我预计 libvpx 需要更多时间来编码(这绝对是真的)但同时更高质量的 t运行scodes。我应该使用什么参数
与 x264 有公平的比较吗?
编辑: 感谢@mulvya 和这个 doc 我认为要使用 libvpx 在 crf 模式下工作,我必须添加 -b:v 0
。我重新 运行 我的测试,我得到:
codec , settings , time , PSNR ,bitrate
libvpx-vp9,['-crf', '20', '-b:v', '0', '-cpu-used', '-2'],57.6835780144,45.111158,17908
libvpx-vp9,['-crf', '20', '-b:v', '0', '-cpu-used', '0'] ,401.360313892,45.285367,17431
libvpx-vp9,['-crf', '20', '-b:v', '0', '-cpu-used', '2'] ,57.4941239357,45.111158,17908
libvpx-vp9,['-crf', '30', '-b:v', '0', '-cpu-used', '-2'],49.175855875,42.588178,11085
libvpx-vp9,['-crf', '30', '-b:v', '0', '-cpu-used', '0'] ,347.158324957,42.782194,10935
libvpx-vp9,['-crf', '30', '-b:v', '0', '-cpu-used', '2'] ,49.1892938614,42.588178,11085
通过添加 -b:v 0
,PSNR 和比特率显着提高
-speed
的负值表示截止日期,但在接近零的速度设置下,这没有任何效果。为了更快的编码,使用离零更远的 -speed
值(例如 4 或 6)。您也可以考虑使用线程。
-quality
已弃用,不应使用(根据代码注释)。
我有一些将 ffmpeg 与 x264 结合使用的经验,我想与 libvpx-vp9 进行比较。我仔细测试了原始 video, varying the crf settings and presets both with x264 and libvpx-vp9. I am new to libvpx and I followed this and this 的简单单通道编码,但我可能仍然指定了错误的参数组合,因为我得到的结果对我来说意义不大。
对于 x264 我做了:
ffmpeg -i test_video.y4m -c:v libx264 -threads 1 -crf <crf> -preset <preset> -y output.mkv
得到如下结果:
codec , settings , time , PSNR ,bitrate
libx264,['-crf', '20', '-preset', 'fast'],13.1897280216, 42.938337 ,15728
libx264,['-crf', '20', '-preset', 'medium'],16.80494689, 42.879753 ,15287
libx264,['-crf', '20', '-preset', 'slow'],25.1142120361, 42.919206 ,15400
libx264,['-crf', '30', '-preset', 'fast'],8.79047083855, 37.975141 ,4106
libx264,['-crf', '30', '-preset', 'medium'],9.936599016, 37.713778 ,3749
libx264,['-crf', '30', '-preset', 'slow'],13.0959510803, 37.569511 ,3555
这对我来说很有意义,给定一个 crf 值,你会得到一个 PSNR 值,更改预设可以降低比特率,但会增加编码时间。
对于 libvpx-vp9 我做了:
ffmpeg -i test_video.y4m -c:v libvpx-vp9 -threads 1 -crf <crf> -cpu-used <effort> -y output.mkv
首先我从网上的教程中想到 -cpu-used
选项等同于 x264 中的 -preset
。那是对的吗?如果是这样,与 -quality
有什么区别?此外,由于 运行ge 从 -8 变为 8,我假设负值是快速选项,而正值是最慢的。我得到的结果非常混乱:
codec , settings , time , PSNR ,bitrate
libvpx-vp9,['-crf', '20', '-cpu-used', '-2'],19.6644911766,32.54317,571
libvpx-vp9,['-crf', '20', '-cpu-used', '0'],176.670887947,32.69899,564
libvpx-vp9,['-crf', '20', '-cpu-used', '2'],20.0206270218,32.54317,571
libvpx-vp9,['-crf', '30', '-cpu-used', '-2'],19.7931578159,32.54317,571
libvpx-vp9,['-crf', '30', '-cpu-used', '0'],176.587754965,32.69899,564
libvpx-vp9,['-crf', '30', '-cpu-used', '2'],19.8394429684,32.54317,571
比特率非常低,PSNR 似乎不受 crf
设置的影响(与 x264 相比非常低)。 -cpu-used
设置的影响非常小,而且 -2 和 2 似乎是相同的选项。我错过了什么?我预计 libvpx 需要更多时间来编码(这绝对是真的)但同时更高质量的 t运行scodes。我应该使用什么参数
与 x264 有公平的比较吗?
编辑: 感谢@mulvya 和这个 doc 我认为要使用 libvpx 在 crf 模式下工作,我必须添加 -b:v 0
。我重新 运行 我的测试,我得到:
codec , settings , time , PSNR ,bitrate
libvpx-vp9,['-crf', '20', '-b:v', '0', '-cpu-used', '-2'],57.6835780144,45.111158,17908
libvpx-vp9,['-crf', '20', '-b:v', '0', '-cpu-used', '0'] ,401.360313892,45.285367,17431
libvpx-vp9,['-crf', '20', '-b:v', '0', '-cpu-used', '2'] ,57.4941239357,45.111158,17908
libvpx-vp9,['-crf', '30', '-b:v', '0', '-cpu-used', '-2'],49.175855875,42.588178,11085
libvpx-vp9,['-crf', '30', '-b:v', '0', '-cpu-used', '0'] ,347.158324957,42.782194,10935
libvpx-vp9,['-crf', '30', '-b:v', '0', '-cpu-used', '2'] ,49.1892938614,42.588178,11085
通过添加 -b:v 0
-speed
的负值表示截止日期,但在接近零的速度设置下,这没有任何效果。为了更快的编码,使用离零更远的 -speed
值(例如 4 或 6)。您也可以考虑使用线程。
-quality
已弃用,不应使用(根据代码注释)。