Anteriormente hice un post sobre el codificador de video ffmpeg, en esta ocasión voy a comentar el empleo de gráficas para acelerar el proceso de codificación y así liberar la CPU de uso. Al usar la gráfica vamos a primar la relación calidad y tamaño, los parámetros de calidad han sido realizados con varias pruebas y son subjetivas para mi uso con una calidad aceptable.
VAAPI
Vaapi es usado por tarjetas gráficas Ati, ahora AMD. Algunas tarjetas Intel soportan vaapi.
Para ver si lo soporta utilizamos el comando vainfo
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAEntrypointEncSliceLP Nos indica que es capaz de encodear en H264 pero no en HEVC ya que no aparece.
Para encodear voy a utilizar la función de Calidad Constante o CQP indicado en -rc_mode y en -qp:v 27, para vídeos chorras la calidad es aceptable, si queremos la máxima calidad un -qp:v 21 a 23 es mas que suficiente, no es el mismo equivalente que el CRF. Lo normal es utilizar el profile main para evitar incompatibilidad de hardware, aunque la mayoría de dispositivos actuales soportan otros perfiles. La opción map sirve para mapear los contenidos del vídeo, en los ejemplos los capítulos y los metadatos: -map 0 -map_chapters 0 -map_metadata 0. Realizo una copia del audio -c:a copy, si queremos que sea acc -c:a aac, o bien mp3 -c:a mp3. -b_depth 4 especifica la profundidad de los frames de tipo b. -rc-lookahead 64 permite que estudie los 64 frames anteriores para facilitar la codificación y así codificar mejor. -f matroska indica que el tipo de fichero va a ser un contenedor matroska.
Es posible que un video este grabado a 60fps, que evita parpadeo, aunque en el cine se usa 24 o 25fps podemos encodearlo a 30fps especificando -r 30. El tamaño sera mucho menor ya que tendríamos la mitad de frames (frame o imágenes por segundo, fps).
ffmpeg -threads 2 -hwaccel vaapi -i entrada.mp4 -vaapi_device /dev/dri/renderD128 -c:v h264_vaapi -vf 'format=nv12,hwupload,scale_vaapi' -map 0 -map_chapters 0 -map_metadata 0 -c:a copy -c:s copy -rc_mode CQP -b_depth 4 -qp:v 27 -profile:v main -rc-lookahead 64 -hide_banner -f matroska Salida-x264-qp27.mkv
ffmpeg -threads 2 -hwaccel vaapi -i entrada.mp4 -vaapi_device /dev/dri/renderD128 -c:v h264_vaapi -vf 'format=nv12,hwupload,scale_vaapi' -map 0 -map_chapters 0 -map_metadata 0 -c:a copy -c:s copy -rc_mode CQP -b_depth 4 -qp:v 27 -profile:v main -rc-lookahead 64 -hide_banner -f matroska Salida-hevc-qp27.mkv
Escalado a FullHDffmpeg -threads 2 -hwaccel vaapi -i "$1" -vaapi_device /dev/dri/renderD128 -c:v h264_vaapi -qp 27 -vf 'format=nv12,hwupload,scale_vaapi=1920:-2' -map 0 -map_chapters 0 -map_metadata 0 -c:a copy -rc_mode CQP -b_depth 4 -rc-lookahead 64 -profile:v main -hide_banner -f matroska "$1"-hevc-q27.mkv
scale_vaapi=1920:-2 el -2 es para que sea divisible por 2 y tenga un formato válido cumpliendo los estándares ya que algunas películas la resolución vertical puede ser diferente a 1080p (HD 1920×1080)
Grabar pantallaffmpeg --threads 2 -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 1920x1080 -i :0 -vf 'format=nv12,hwupload' -c:v h264_vaapi -qp 27 output.mp4
Si nuestra gráfica soporta encodear en Hevc simplemente cambiamos la opción de -c:v h264_vaapi por hevc_vaapi o av1_vaapi
El codec hevc es mas moderno y permite mayor compresión así como mejora de la calidad. Es posible que si codificamos algún vídeo salgan rayas verdes o algunos parpadeos, en esos casos es mejor usar el codificador h264. El codec AV1 es el mas actual y no lo soportan todos los dispositivos, sin embargo es el mejor codec, ya que el ratio de compresión y calidad es el mejor. Av1 es de código abierto y este permitió por ejemplo que Netflix emitiera en calidad de 4K.
VDPAU
Vdpau es usado por tarjetas Nvidia.
Pongo la opción de Bitrate variable pero con Calidad constante variable la normal qp 27, la mínima 23 y la máxima 28. Aunque son los cuantificadores en realidad a mayor qp peor calidad.
Para ver las opciones del codificador nvidia completas:
ffmpeg -h encoder=h264_nvenc
nice -n 19 ffmpeg -threads 2 -hwaccel vdpau -i "$1" -c:v h264_nvenc -c:a copy -c:s copy -rc vbr -cq 27 -qmin 23 -qmax 28 -b_depth 4 -b:v 0K -rc-lookahead 64 -profile:v main -spatial_aq:v 1 -aq-strength:v 15 -hide_banner -f matroska "${1: : length -4}"-x264-qp27.mkv
Es posible que tengamos dos tarjetas gráficas, si la otra soporta vaapi sustituimos -hwaccel vdpau por vaapi y así una tarjeta decodifica el video y la otra lo codifica
Mas info sobre aceleración de Hardware https://trac.ffmpeg.org/wiki/HWAccelIntro
Deja una respuesta