Utilicé este comando para volver a codificar un vídeo,
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
El vídeo resultante tiene propiedades,
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)
Una captura de pantalla se ve asíeste
Luego utilicé este comando que decodifica el video en hardware pero codifica el video en software,
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
Lo que da como resultado un vídeo de propiedades,
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)
La captura de pantalla pareceeste
Obviamente el segundo vídeo tiene un bitrate menor pero más calidad. Me gustaría saber por qué. También me gustaría saber cómo lograr el segundo resultado utilizando codificación de hardware.
Respuesta1
Respuesta corta: porque todo es siempre un compromiso.
Respuesta más larga: los códecs ASIC son inevitablemente mucho menos flexibles y mucho menos inteligentes que los códecs de software. También están diseñados principalmente para aplicaciones de alta velocidad, bajo consumo y velocidad de bits constante, como la transmisión en tiempo real, donde los artefactos son preferibles a los fotogramas perdidos.
Respuesta2
No estoy seguro de qué tan cerca estará de un buen codificador de software, pero si su hardware lo admite, también puede probar hevc_vaapi, que debería ser más eficiente.
Pero tampoco deberías usar h264_vaapi, -b:v 1M
ya que esto no puede darte buenos resultados, a menos que especifiques algo como15M.
Pruebe -qp 22
(y luego ajuste el valor) o tal vez incluso mejor:
-rc_mode CQP -global_quality 22
(y ajustar el valor más tarde) en su lugar.
También puede intentar agregar -compression_level 1
lo que se supone que brinda mejor calidad a menor velocidad.
Las opciones se describen aquí:https://ffmpeg.org/ffmpeg-codecs.html#VAAPI-encoders
También podría resultar útil, especialmente si quieres probar hevc_vaapi: https://www.tauceti.blog/posts/linux-ffmpeg-amd-5700xt-hardware-video-encoding-hevc-h265-vaapi/