Información de fondo: Apple proporciona soporte de aceleración de hardware para codificar videos h264 y h265 a través de VideoToolbox. ffmpeg tiene soporte incorporado para VideoToolbox a través del códec h264_videotoolbox.
Problema: Tengo un montón de imágenes .png que quiero convertir en un video mp4 de alta calidad. Usar "-crf 18" funciona bien sin aceleración de hardware, como en lo siguiente:
ffmpeg -pattern_type glob -i '*.png' -framerate 25 -c:v libx264 -crf 18 -preset veryslow out.mp4
Pero esto tarda una eternidad. Puedo forzar una tasa de bits y usar la aceleración de hardware de mi Mac haciendo algo como esto:
ffmpeg -hwaccel videotoolbox -pattern_type glob -i '*.png' -framerate 25 -c:v h264_videotoolbox -b:v 7000k out.mp4
...lo cual codifica a 100fps en lugar de <10fps sin aceleración de hardware. Pero realmente quisiera tener una alta calidad constante, no una tasa de bits constante.
Parece que hay prácticamente ninguna documentación para el códec h264_videotoolbox, y ninguna explicación de qué significan realmente estas opciones:
usuario@maquina$ ffmpeg -h encoder=h264_videotoolbox
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
construido con Apple clang version 11.0.0 (clang-1100.0.33.17)
configuración: --prefix=/usr/local/Cellar/ffmpeg/4.2.2_5 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags=-fno-stack-check --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Codificador h264_videotoolbox [VideoToolbox H.264 Encoder]:
Capacidades generales: delay
Capacidades de hilos: none
Formatos de píxeles admitidos: videotoolbox_vld nv12 yuv420p
Opciones de h264_videotoolbox:
-profile E..V..... Perfil (de 0 a 4) (predeterminado 0)
baseline E..V..... Perfil base
main E..V..... Perfil principal
high E..V..... Alto perfil
-level E..V..... Nivel (de 0 a 52) (predeterminado 0)
1.3 E..V..... Nivel 1.3, solo disponible con Perfil Base
3.0 E..V..... Nivel 3.0
3.1 E..V..... Nivel 3.1
3.2 E..V..... Nivel 3.2
4.0 E..V..... Nivel 4.0
4.1 E..V..... Nivel 4.1
4.2 E..V..... Nivel 4.2
5.0 E..V..... Nivel 5.0
5.1 E..V..... Nivel 5.1
5.2 E..V..... Nivel 5.2
-coder E..V..... Codificación de entropía (de 0 a 2) (predeterminado 0)
cavlc E..V..... Codificación de entropía CAVLC
vlc E..V..... Codificación de entropía CAVLC
cabac E..V..... Codificación de entropía CABAC
ac E..V..... Codificación de entropía CABAC
-a53cc E..V..... Usar subtítulos cerrados A53 (si están disponibles) (predeterminado true)
-allow_sw E..V..... Permitir codificación de software (predeterminado false)
-require_sw E..V..... Requerir codificación de software (predeterminado false)
-realtime E..V..... Indicar que la codificación debería ocurrir en tiempo real si no es más rápida (por ejemplo, capturando desde la cámara). (predeterminado false)
-frames_before E..V..... Otros marcos vendrán antes de los marcos en esta sesión. Esto ayuda a suavizar problemas de concatenación. (predeterminado false)
-frames_after E..V..... Otros marcos vendrán después de los marcos en esta sesión. Esto ayuda a suavizar problemas de concatenación. (predeterminado false)
¿Qué es "nivel"? ¿Cómo difieren "perfil base"/"perfil principal"/"alto" y qué es un "perfil"...?
Agradecería ejemplos de cómo usar adecuadamente h264_videotoolbox con ffmpeg y específicamente cómo lograr algo como la opción CRF que existe con el códec h264 predeterminado.