使用 ffmpeg 进行慢速 VP8 和 VP9 编码



我看到了这个答案,但它有点旧了。也许情况发生了变化?

我想使用 ffmpeg 将流从 IP 摄像机重新编码为 WebM(VP8 或 VP9(格式。我需要实时速度,但我的CPU是Core i5(2017(并且太忙了(负载平均超过100%(。

  • 我可以购买更适合此类编码任务的硬件吗?

  • 对于实时转码,建议使用 ffmpeg 的哪些参数?

目前我正在使用这个命令(带有叠加色度键(:

./ffmpeg 
-i 
bg.jpg 
-thread_queue_size 512 
-rtsp_transport tcp -i rtsp://ip_cam:port/stream 
-codec:v libvpx -quality realtime -r 25 -crf 30 
-b:v 2M -qmin 10 -qmax 50 -maxrate 2.5M -bufsize 5M 
-speed 1 
-b:v 2M 
-cpu-used 0 -threads 4 
-auto-alt-ref 0 
-c:a libopus -b:a 96k 
-filter_complex "[1:v]chromakey=0x70de77:0.1:0.0[ckout];[0:v][ckout]overlay[out]" 
-map "[out]" 
-f webm udp://ip_destination:1935/name/stream

VP8/VP9 的速度/质量选项在文档中进行了说明。请注意,在 ffmpeg 中,您必须以不同的方式指定参数(请参阅ffmpeg -h encoder=libvpx-vp9(:

  • 中央处理器使用率:
    • FFMPEG:-cpu-used(旧版选项:-speed(
    • libvpx: --cpu-used
  • 质量/期限:
    • ffmpeg: -deadline realtime-deadline good (旧选项: -quality (
    • libvpx: --rt--good

-cpu-used应该是您的主控制旋钮。虽然默认值为 0 ,但文档指出:

设置--cpu-used=1--cpu-used=2将进一步显著提高编码速度,但将开始对质量产生更明显的影响,并且还可能开始影响数据速率控制的准确性。

将值设置为 4 或 5 将关闭"速率失真优化",这对质量有很大影响,但也大大加快了编码器的速度。

特别是对于实时编码,您需要设置-deadline realtime

--rt实时模式允许编码器自动调整速度与质量权衡,以尝试达到特定的 CPU 利用率目标。在此模式下,--cpu-used参数按如下方式控制 %cpu 目标:

target cpu utilisation = (100*(16-cpu-used)/16)%

--rt模式结合使用时,-cpu-used的合法值为 (0-15(。

值得注意的是,在--rt模式下,编码质量将取决于特定剪辑或剪辑部分的难度以及编码机的速度。因此,在这种模式下,结果将因机器而异,甚至因运行而异,具体取决于您正在执行的其他操作。

但是,当然,对于 i5 CPU,根据您有多少并行转码任务、您想要达到的质量水平以及最终延迟应该是多少,投资最新的英特尔 i7 系列的强大 CPU 是有意义的。

英特尔的Kaby Lake芯片显然支持通过Intel QuickSync进行硬件辅助编码,而ffmpeg则通过VA-API支持。

切换到vp9_vaapi如果可用 使用 libvpx-vp9,我在 3p 下获得了 5-1080fps,如果您尝试转换一个小时的视频,这非常慢。

如果您的 GPU 支持它,使用 vp9_vaapi 可能会快得多。在我的 HTPC 上,i7 8650u vaapi 的性能提高了大约 30 倍,我可以一次编码 4 个视频,每个视频 130-150fps。

示例 ffmpeg 行:

 ffmpeg -vaapi_device /dev/dri/renderD128 -i $infile -vf 'format=nv12,hwupload' -c:v vp9_vaapi -b:v 0  -c:a libvorbis $outfile

有一个选项loop_filter_level似乎等同于CRF,从0到63。但是,除了默认值为 16 之外,它在网上的记录很少。我在 1 和 63 上尝试过,文件大小和主观质量几乎相同,所以要么我用错了它,要么该选项被 ffmpeg 忽略。

使用默认设置,我看不到我的 1080p h264 源视频和 vp9 输出之间的任何视觉差异。

您需要检查您的 GPU 是否支持硬件编码。运行vainfo并查找:

  VAProfileVP9Profile0            : VAEntrypointEncSlice

vp9_vaapi vs libvpx-VP9

我尝试对相同的 50 分钟 1080p 视频进行编码,结果如下:

  • libvpx-VP9 花了将近 8 个小时,生成了一个 568.8MB 的文件
  • vp9_vaapi -loop_filter_level 1 只用了 7 分钟多一点,生成了一个 756.1MB 的文件
  • vp9_vaapi -loop_filter_level 63 工具只需 8 分钟多一点,就生成了一个 734.1MB 的文件

主观上,所有视频对我来说看起来都一样,我无法区分一个和另一个。

显然,libvpx-vp9 在压缩方面获胜,但除非您非常非常缺乏磁盘空间(如果您打算流式传输视频,则非常缺乏带宽(,否则绝对不值得不合理的编码时间。

我不知道为什么loop_filer_level会有这么小的差异,我建议将其保留为默认值 (16(,直到更好地记录它。

libvpx 无疑会随着时间的推移而成熟,您的硬件可能会产生不同的结果,并且硬件编码器的视觉质量通常比软件编码器差(尽管我在测试中无法分辨(。

最新更新