我用這個命令重新編碼視頻,
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/