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

Kir*_*l K 2 video ffmpeg stream transcoding

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

我想用ffmpeg将来自IP摄像机的流重新编码为WebM(VP8或VP9)格式.我需要实时速度,但我的CPU是Core i5(2017)并且太忙(加载avarage太多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
Run Code Online (Sandbox Code Playgroud)

Tom*_*m B 9

如果可用,请切换到 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
Run Code Online (Sandbox Code Playgroud)

有一个选项loop_filter_level似乎与 CRF 等效,范围为 0-63。然而,除了默认值 16 之外,网上的记录很少。我在 1 和 63 下尝试过,文件大小和主观质量几乎相同,所以要么我使用错误,要么该选项被 ffmpeg 忽略。

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

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

  VAProfileVP9Profile0            : VAEntrypointEncSlice
Run Code Online (Sandbox Code Playgroud)

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


slh*_*hck 7

VP8/VP9的速度/质量选项在文档中有说明.请注意,在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)%
Run Code Online (Sandbox Code Playgroud)

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

值得注意的是,在--rt模式中,编码质量将取决于剪辑的特定剪辑或片段的硬度以及编码机器的速度.在这种模式下,结果因机器而异,甚至从运行到运行,取决于您正在做什么.

但是当然,使用i5 CPU,取决于你拥有多少并行转码任务以及你想达到什么级别的质量,以及最终的延迟应该是什么,从最新的Intel i7系列投入强大的CPU将是有意义的.

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