Use la configuración DivX para codificar a mp4 con ffmpeg

4

Estoy acostumbrado a usar VirtualDub para codificar un video en un contenedor AVI con códec DivX (y MP3 para audio). Ahora estoy planeando usar ffmpeg para codificar videos en un contenedor MP4 con códec h264. Lo que he descubierto es que necesito usar libx264 y uno de esos ajustes preestablecidos para que todo funcione. Sin embargo, estoy sorprendido por la tasa de bits de video que usa ffmpeg para la codificación.

Lo que tengo actualmente es este pequeño archivo por lotes:

@ECHO OFF

SETLOCAL

SET IN=source.avs
SET FFMPEG_PATH=C:\Program Files (x86)\ffmpeg
SET PRESET=-fpre "%FFMPEG_PATH%\presets\libx264-lossless_slow.ffpreset" 
SET AUDIO=-acodec libmp3lame -ab 128000
SET VIDEO=-vcodec libx264 -vb 1978000

"%FFMPEG_PATH%\ffmpeg.exe" -i %IN% %AUDIO% %VIDEO% %PRESET% test.mp4

ENDLOCAL

Con esto le digo a ffmpeg que use 1978k como bitrate, ¡pero ffmpeg usa 15000k +! Intenté otros ajustes preestablecidos, pero no usan mi tasa de bits especificada. Aquí están los presets que tengo:

  • libx264-baseline.ffpreset
  • libx264-ipod320.ffpreset
  • libx264-ipod640.ffpreset
  • libx264-lossless_fast.ffpreset
  • libx264-lossless_max.ffpreset
  • libx264-lossless_medium.ffpreset
  • libx264-lossless_slow.ffpreset
  • libx264-lossless_slower.ffpreset
  • libx264-lossless_ultrafast.ffpreset

versión ffmpeg:

FFmpeg git-N-29181-ga304071
libavutil    50. 40. 1 / 50. 40. 1
libavcodec   52.120. 0 / 52.120. 0
libavformat  52.108. 0 / 52.108. 0
libavdevice  52.  4. 0 / 52.  4. 0
libavfilter   1. 79. 0 /  1. 79. 0
libswscale    0. 13. 0 /  0. 13. 0

Tenga en cuenta que no uso la última versión, ya que tiene problemas con espacios en los nombres de archivo.

Esto es lo que parece ser la lista completa de parámetros que utiliza DivX 6.9.2:

-bvnn 1978000 -vbv 218691200,100663296,100663296 -dir "C:\Users\sjngm\AppData\Roaming\DivX\DivX Codec" -w -b 1 -use_presets=1 -preset=10 -windowed_fullsearch=2 -thread_delay=1

¿Qué parámetros de línea de comando serían para ffmpeg?


EDITAR:

Siguiendo la sugerencia de slhck, probé una nueva versión de 32 bits. No tengo idea si eso es 0.9 o más reciente, no puedo encontrar esa información.

ffmpeg version N-36890-g67f5650
libavutil      51. 34.100 / 51. 34.100
libavcodec     53. 56.105 / 53. 56.105
libavformat    53. 30.100 / 53. 30.100
libavdevice    53.  4.100 / 53.  4.100
libavfilter     2. 59.100 /  2. 59.100
libswscale      2.  1.100 /  2.  1.100
libswresample   0.  6.100 /  0.  6.100
libpostproc    51.  2.100 / 51.  2.100

Modifiqué mi archivo por lotes para que se vea así (curiosamente, no puedo encontrar el parámetro -vprofileen la documentación):

@ECHO OFF

SETLOCAL

SET IN=VTS_01_1.avs
SET FFMPEG_PATH=C:\Program Files (x86)\ffmpeg
SET PRESET=-vprofile high -preset veryslow
SET AUDIO=-acodec libmp3lame -ab 128000
SET VIDEO=-vcodec libx264 -vb 1978000

"%FFMPEG_PATH%\ffmpeg.exe" -i %IN% %AUDIO% %PRESET% %VIDEO% test.mp4

ENDLOCAL

Veo que ahora usa la tasa de bits correctamente (¡gracias a LongNeckbeard por señalar que las cosas sin pérdidas ignoran la tasa de bits!).

En caso de que se pregunte cómo se me ocurrió el 1978000, estoy usando esta fórmula que encontré válida para archivos DivX (supongo que la tasa de bits no cambiará tanto para h264):

width * height * 25 * 0.22 / 1000

No estoy seguro si el 0.22 se correlaciona con el CRF de alguna manera.

En general, olvidé decir que usaré un escenario de dos pasos, por lo que no uso el CRF aquí. Trataré de leer más sobre esto. Actualmente solo estoy tratando de ejecutar algo que me muestre que estoy haciendo algo bien (ffmpeg no es la herramienta más fácil de entender;)).

C:\Program Files (x86)\ffmpeg\ffmpeg.exe" -i VTS_01_1.avs -acodec libmp3lame -ab 128000 -vcodec libx264 -vb 1978000 -vprofile high -preset veryslow test.mp4

La salida es ahora:

ffmpeg version N-36890-g67f5650 Copyright (c) 2000-2012 the FFmpeg developers
  built on Jan 16 2012 21:57:13 with gcc 4.6.2
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 34.100 / 51. 34.100
  libavcodec     53. 56.105 / 53. 56.105
  libavformat    53. 30.100 / 53. 30.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 59.100 /  2. 59.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    51.  2.100 / 51.  2.100
Input #0, avs, from 'VTS_01_1.avs':
  Duration: 00:58:46.12, start: 0.000000, bitrate: 0 kb/s
    Stream #0:0: Video: rawvideo (YV12 / 0x32315659), yuv420p, 576x448, 77414 kb/s, 25 tbr, 25 tbn, 25 tbc
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 2 channels, s16, 1536 kb/s
File 'test.mp4' already exists. Overwrite ? [y/N] y
w:576 h:448 pixfmt:yuv420p tb:1/1000000 sar:0/1 sws_param:
[libx264 @ 05A2C400] using cpu capabilities: MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 05A2C400] profile High, level 3.1
[libx264 @ 05A2C400] 264 - core 120 r2120 0c7dab9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=16 deblock=1:0:0 analyse=0x3:0x133 me=umh subme=10 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=24 chroma_me=1 trellis=2 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=8 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=abr mbtree=1 bitrate=1978 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'test.mp4':
  Metadata:
    encoder         : Lavf53.30.100
    Stream #0:0: Video: h264 (![0][0][0] / 0x0021), yuv420p, 576x448, q=-1--1, 1978 kb/s, 25 tbn, 25 tbc
    Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069), 48000 Hz, 2 channels, s16, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo -> libx264)
  Stream #0:1 -> #0:1 (pcm_s16le -> libmp3lame)
Press [q] to stop, [?] for help
frame=    0 fps=  0 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=    0 fps=  0 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=    0 fps=  0 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=    3 fps=  1 q=22.0 size=      39kB time=00:00:00.04 bitrate=8063.8kbits/
frame=    8 fps=  2 q=22.0 size=      82kB time=00:00:00.24 bitrate=2801.3kbits/
frame=   13 fps=  3 q=23.0 size=     120kB time=00:00:00.44 bitrate=2229.5kbits/
frame=   16 fps=  4 q=23.0 size=     147kB time=00:00:00.56 bitrate=2156.7kbits/
frame=   20 fps=  4 q=22.0 size=     175kB time=00:00:00.72 bitrate=1987.4kbits/
:
video:4387kB audio:273kB global headers:0kB muxing overhead 0.260038%
[libx264 @ 05A2C400] frame I:2     Avg QP:19.53  size: 29850
[libx264 @ 05A2C400] frame P:76    Avg QP:22.24  size: 19541
[libx264 @ 05A2C400] frame B:359   Avg QP:25.93  size:  8210
[libx264 @ 05A2C400] consecutive B-frames:  0.5%  0.5%  0.0%  8.2% 17.2% 52.2% 16.0%  5.5%  0.0%
[libx264 @ 05A2C400] mb I  I16..4:  5.4% 75.3% 19.3%
[libx264 @ 05A2C400] mb P  I16..4:  1.3% 16.5%  2.2%  P16..4: 36.3% 28.6% 12.7% 1.8%  0.2%    skip: 0.4%
[libx264 @ 05A2C400] mb B  I16..4:  0.4%  3.8%  0.3%  B16..8: 40.0% 18.4%  4.7% direct:18.5%  skip:13.9%  L0:45.4% L1:38.1% BI:16.5%
[libx264 @ 05A2C400] final ratefactor: 20.35
[libx264 @ 05A2C400] 8x8 transform intra:83.1% inter:68.5%
[libx264 @ 05A2C400] direct mvs  spatial:99.2% temporal:0.8%
[libx264 @ 05A2C400] coded y,uvDC,uvAC intra: 64.9% 83.4% 49.2% inter: 49.0% 50.4% 4.4%
[libx264 @ 05A2C400] i16 v,h,dc,p: 25% 22% 27% 26%
[libx264 @ 05A2C400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10%  7% 23%  9% 10% 10% 10%10% 13%
[libx264 @ 05A2C400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 12% 11% 13%  9% 12% 11% 10% 9% 12%
[libx264 @ 05A2C400] i8c dc,h,v,p: 42% 28% 16% 14%
[libx264 @ 05A2C400] Weighted P-Frames: Y:18.4% UV:7.9%
[libx264 @ 05A2C400] ref P L0: 29.1% 11.3% 15.7%  7.3%  6.9%  4.9%  5.1%  3.4%3.9%  2.7%  2.8%  1.8%  1.7%  1.2%  1.4%  0.9%
[libx264 @ 05A2C400] ref B L0: 68.8% 11.4%  5.5%  2.9%  2.3%  1.9%  1.5%  1.1%1.1%  1.0%  0.9%  0.7%  0.5%  0.3%  0.1%
[libx264 @ 05A2C400] ref B L1: 91.9%  8.1%
[libx264 @ 05A2C400] kb/s:2055.88

Por lo que a mí respecta, no me parece tan mal.

sjngm
fuente
2
Los ajustes preestablecidos sin pérdida ignorarán su declaración -b.
llogan
1
Encontré un buen documento para ayudar a encontrar buenas opciones.
sjngm

Respuestas:

9

Primero debe actualizar al menos a FFmpeg 0.9. vpreya no se recomienda utilizarlo para el control preestablecido. Es por eso que los ffpresetarchivos se han eliminado de las versiones más recientes. El control preestablecido para libx264 ahora ocurre a través de x264 en sí, no a través de FFmpeg.

Dicho esto, establecer una tasa de bits promedio para x264 es el peor modo de control de velocidad que existe. En lugar de una tasa de bits promedio, debe considerar el uso de la codificación de dos pasos si está apuntando a un tamaño de archivo de salida específico, o establecer un Factor de velocidad constante (CRF) si solo le interesa lograr una calidad específica. En caso de duda, use CRF.


Generalmente desea la siguiente sintaxis para usar FFmpeg y x264:

ffmpeg -i in.mp4 -vcodec libx264 <options> out.mp4

... con las siguientes opciones no obligatorias. Es importante especificarlos antes de la salida y después del vcodeccambio. Esos son solo algunos (vea también el mapeo de opciones para más información):

  • -vprofile: Establecer restricciones del perfil H.264, por ejemplo baseline, main,high

  • -preset: Establece un preajuste de codificación, que generalmente permite estrategias de optimización. Se puede elegir entre veryslow, slow, fast, ultrafast, y muchos más. Los presets más lentos resultan en una mejor compresión a un costo de codificación más lenta. Generalmente usa el preajuste más lento para el que tiene paciencia.

  • -tune: Establezca un factor de sintonización especial, p. Ej. Para películas: film

  • -b: Establecer la tasa de bits. Como ya se dijo, esto no es realmente lo que desea con una codificación de un paso, pero si lo necesita, esto debería funcionar. Los valores posibles están en Bits, o mejor dicho 500K, 1Metc.

  • -crf: Establecer calidad. Mutuamente exclusivo con -b. Un buen valor inicial es 24. Un valor más bajo es de mayor calidad. Use el valor más alto que aún le parezca bien.


Ejemplo de dos pasos, video H.264, audio AAC en MP4:

ffmpeg -i input -c:v libx264 -preset slow -b:v 500k -pass 1 -an -f mp4 -y NUL
ffmpeg -i input -c:v libx264 -preset slow -b:v 500k -pass 2 -c:a libfaac -b:a 128k output.mp4

Ejemplo de CRF, video H.264, audio MP3 en MKV:

ffmpeg -i input -c:v libx264 -preset medium -crf 24 -c:a libmp3lame -q:a 4 output.mkv

slhck
fuente
Además, si aún experimenta algún problema, publique la línea de comando completa y la salida completa de FFmpeg / x264 que obtenga.
slhck
¡Muchas gracias, eso me mostró información nueva! Lea mi pregunta mientras agrego mis hallazgos recientes. A mí me parece bien.
sjngm
Con respecto a dos pasadas: si uso -vcodec libx264como la única opción específica de video para la segunda pasada me sale un error ( maybe incorrect parameters such as bit_rate, rate, width or height). Funciona si agrego -vb 1978k. Entonces tengo que agregar una opción de tasa de bits. -minratey me -maxrateparece un poco vago. ¿O está -vbbien para dos pases?
sjngm
Algunos comentarios sobre su pregunta actualizada: 1) MP3 no es oficialmente compatible con MP4. 2) Use la codificación de dos pasos si está apuntando a un tamaño de archivo de salida específico y no le importa la calidad. Use CRF si desea apuntar a una calidad específica y no le importa el tamaño del archivo.
llogan
@ LordNeckbeard Gracias por la edición. /dev/nullno funcionará en Windows, supongo, ¿sabes qué usar en su lugar?
slhck