Ich habe diesen Befehl verwendet, um ein Video neu zu kodieren.
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
Das resultierende Video hat Eigenschaften,
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)
Ein Screenshot sieht so ausDas
Dann habe ich diesen Befehl verwendet, der das Video in der Hardware dekodiert, aber in der Software kodiert,
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
Das Ergebnis ist ein Video von Eigenschaften,
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)
Der Screenshot sieht aus wieDas
Offensichtlich hat das zweite Video eine niedrigere Bitrate, aber eine bessere Qualität. Ich würde gerne wissen, warum. Außerdem würde ich gerne wissen, wie man das zweite Ergebnis mithilfe der Hardwarecodierung erreicht.
Antwort1
Kurze Antwort: Weil alles immer ein Kompromiss ist.
Längere Antwort: ASIC-Codecs sind zwangsläufig weit weniger flexibel und weit weniger intelligent als Software-Codecs. Sie sind außerdem in erster Linie für Anwendungen mit hoher Geschwindigkeit, geringem Stromverbrauch und konstanter Bitrate wie Echtzeit-Streaming konzipiert, bei denen Artefakte besser sind als verlorene Frames.
Antwort2
Ich bin nicht sicher, wie nahe Sie einem guten Software-Encoder kommen, aber wenn Ihre Hardware dies unterstützt, können Sie auch hevc_vaapi ausprobieren, was effizienter sein sollte.
Aber auch mit h264_vaapi sollten Sie nicht verwenden, -b:v 1M
da dies keine guten Ergebnisse liefern kann, es sei denn, Sie geben etwas wie15 Mio..
Probieren Sie es aus -qp 22
(und passen Sie den Wert später an) oder vielleicht noch besser:
-rc_mode CQP -global_quality 22
(und den Wert später anpassen) stattdessen.
Sie können auch versuchen, etwas hinzuzufügen -compression_level 1
, das bei geringerer Geschwindigkeit eine bessere Qualität bieten soll.
Die Optionen werden hier beschrieben:https://ffmpeg.org/ffmpeg-codecs.html#VAAPI-encoders
Könnte auch hilfreich sein, insbesondere wenn Sie hevc_vaapi ausprobieren möchten: https://www.tauceti.blog/posts/linux-ffmpeg-amd-5700xt-hardware-video-encoding-hevc-h265-vaapi/