我使用这个命令重新编码视频,
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/