![Utilice la configuración de DivX para codificar a mp4 con ffmpeg](https://rvso.com/image/1302234/Utilice%20la%20configuraci%C3%B3n%20de%20DivX%20para%20codificar%20a%20mp4%20con%20ffmpeg.png)
Estoy acostumbrado a usar VirtualDub para codificar un video en un contenedor AVI con códec DivX (y MP3 para audio). Ahora planeo usar ffmpeg para codificar videos en un contenedor MP4 con el códec h264. Lo que descubrí 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 utiliza 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 tasa de bits, ¡pero ffmpeg usa 15000k+! Probé otros ajustes preestablecidos, pero no usan mi tasa de bits especificada. Aquí están los ajustes preestablecidos que tengo:
- libx264-baseline.ffpreset
- libx264-ipod320.ffpreestablecido
- libx264-ipod640.ffpreestablecido
- 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 porque tiene problemas con los espacios en los nombres de archivos.
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 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 viera así (curiosamente no puedo encontrar el parámetro -vprofile
en 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 el material sin pérdidas ignora 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á mucho para h264):
width * height * 25 * 0.22 / 1000
No estoy seguro de si el 0,22 se correlaciona de alguna manera con el CRF.
En general, olvidé decir que usaré un escenario de dos pasadas, razón por la cual no uso el CRF aquí. Intentaré leer más sobre esto. Actualmente solo estoy intentando 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 ahora es:
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 malo.
Respuesta1
Primero debe actualizar al menos a FFmpeg 0.9. vpre
Ya no se recomienda su uso para el control preestablecido. Es por eso que los ffpreset
archivos se han eliminado de las versiones más recientes. El control preestablecido para libx264 ahora ocurre a través del propio x264, no a través de FFmpeg.
Dicho esto, establecer una tasa de bits promedio para x264 es la solución.peor modo de control de velocidadhay. En lugar de una tasa de bits promedio, debería considerar el uso de codificación de dos pasos si su objetivo es un tamaño de archivo de salida específico o establecer unFactor de tasa constante(CRF) si solo te importa lograr una cualidad específica. En caso de duda, utilice CRF.
Generalmente querrás 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 vcodec
cambio. Éstos son sólo algunos (ver también elmapeo de opcionespara más):
-vprofile
: Establezca restricciones de perfil h.264, por ejemplo,baseline
,main
,high
-preset
: establece un valor preestablecido de codificación, que generalmente permite estrategias de optimización. Puede elegir entreveryslow
,slow
,fast
,ultrafast
y muchos más. Los ajustes preestablecidos más lentos dan como resultado una mejor compresión a costa de una codificación más lenta. Generalmente utilizas el ajuste preestablecido más lento para el que tienes paciencia.-tune
: Establezca un factor de sintonización especial, por ejemplo, para películas:film
-b
: establece la tasa de bits. Como ya se dijo, esto no es realmente lo que desea con una codificación de un solo paso, pero si es necesario, debería funcionar. Los valores posibles están en Bits, o mejor dicho500K
,1M
etcétera.-crf
: Establece la calidad. Mutuamente excluyentes con-b
. Un buen valor inicial es 24. Un valor más bajo significa mayor calidad. Utilice el valor más alto que todavía le parezca bueno.
Ejemplo de dos pasadas, vídeo 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 CRF, vídeo H.264, audio MP3 en MKV:
ffmpeg -i input -c:v libx264 -preset medium -crf 24 -c:a libmp3lame -q:a 4 output.mkv