我看到了这个答案,但它有点旧了。也许情况发生了变化?
我想使用 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:
- 质量/期限:
- ffmpeg:
-deadline realtime
,-deadline good
(旧选项:-quality
( - libvpx:
--rt
,--good
- ffmpeg:
-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 无疑会随着时间的推移而成熟,您的硬件可能会产生不同的结果,并且硬件编码器的视觉质量通常比软件编码器差(尽管我在测试中无法分辨(。