為什麼 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因為這不能為你帶來好的結果,除非你指定類似的東西15M

嘗試-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/

相關內容