为什么 ffmpeg 硬件编码的输出质量比软件编码的低?

为什么 ffmpeg 硬件编码的输出质量比软件编码的低?

我使用这个命令重新编码视频,

ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -c:v h264_vaapi -b:v 1M -maxrate 1.5M output.mp4

生成的视频具有以下属性:

Duration: 00:01:03.92, start: 0.000000, bitrate: 1292 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 1159 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

屏幕截图如下

然后我使用这个命令在硬件中解码视频,但在软件中编码视频,

ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -vf 'deinterlace_vaapi=rate=field:auto=1,hwdownload,format=nv12' -c:v libx264 -crf 30 -r 25 output.mp4

由此产生了一段有关房产的视频,

Duration: 00:01:00.89, start: 0.000000, bitrate: 932 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 798 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

截图如下

显然,第二个视频的比特率较低,但质量更高。我想知道原因。我还想知道如何使用硬件编码实现第二个结果。

答案1

简短的回答:因为一切事物总是需要妥协的。

更长的答案:ASIC 编解码器不可避免地比软件编解码器更不灵活,也更不聪明。它们也主要设计用于高速/低功耗/一致比特率的应用,例如实时流媒体,在这些应用中,伪影比丢帧更可取。

答案2

我不确定你是否能接近一个好的软件编码器,但如果你的硬件支持它,你也可以尝试 hevc_vaapi,它应该更有效率。

但是你也不应该使用 h264_vaapi,-b:v 1M因为它不能给你带来好的结果,除非你指定类似1500 万

尝试-qp 22(然后调整值)甚至更好:

-rc_mode CQP -global_quality 22(然后稍后调整值)。

您还可以尝试添加-compression_level 1可以在较低速度下提供更好质量的功能。

选项描述如下:https://ffmpeg.org/ffmpeg-codecs.html#VAAPI-encoders

也可能有帮助,特别是当你想尝试 hevc_vaapi 时: https://www.tauceti.blog/posts/linux-ffmpeg-amd-5700xt-hardware-video-encoding-hevc-h265-vaapi/

相关内容