【问题标题】:Slow VP8 and VP9 encoding with ffmpeg使用 ffmpeg 进行慢速 VP8 和 VP9 编码
【发布时间】:2017-12-04 15:19:40
【问题描述】:

我看到this 的回答,但是有点老了。也许情况已经改变了?

我想使用 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

【问题讨论】:

  • 显而易见的问题:您是否尝试过改变-speed 参数?

标签: video ffmpeg stream transcoding


【解决方案1】:

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

  • CPU 使用率:
    • 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)%

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

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

当然,使用 i5 CPU,取决于您有多少并行转码任务以及您想要达到的质量水平,以及最终延迟应该是多少,投资购买来自最新 Intel i7 系列的强大 CPU是有道理的。

英特尔的 Kaby Lake 芯片显然支持通过英特尔 QuickSync 和 ffmpeg supports that through VA-API 进行硬件辅助编码。

【讨论】:

  • 也许你会告诉服务器的cpus类型,哪些对转码最有效?如果我想把编码过程放在数据中心?
  • 最新的 Intel i7 型号,或者如果你想去服务器级,Xeon。不过我不能说出具体的型号。
  • ` -cpu-used 而不是 --cpu-used` - 在文档中,用于示例编码,但对于 ffmpeg 需要使用 -cpu-used
  • 是的。这就是我所说的。在 ffmpeg 中,您必须以不同方式指定参数,例如-cpu-used 而不是 --cpu-used
  • 啊,抱歉 ))) 我之前没有正确理解你....但是在我的转码示例中都已经存在了......,为什么还要写呢?
【解决方案2】:

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

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

示例 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 与 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 无疑会随着时间的推移而成熟,您的硬件可能会产生不同的结果,并且硬件编码器的视觉质量通常比软件编码器更差(尽管我在测试中无法判断)。

【讨论】:

  • 好东西。感谢您提供有关 vainfo 的信息
猜你喜欢
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2016-10-29
  • 2018-06-06
相关资源
最近更新 更多