%20a%20MP4%20(H.264)%20manteniendo%20la%20misma%20calidad.png)
Quiero comprimir un archivo AVI a MP4 usando un códec h.264. No pude conseguir la misma calidad. ¿Cómo puedo comprimirlo?
Vídeo original:
Pantalla de vídeo original:
Salida de consola FFmpeg ( ffmpeg -i input.avi
):
FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.93. 0 / 52.93. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
Metadata:
encoder : VirtualDubMod 1.5.10.2 (build 2542/release)
Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified
Prueba 1
Comando FFmpeg:
ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4
Pantalla de prueba 1:
Salida de consola FFmpeg ( ffmpeg -i 1.mp4
)
FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.93. 0 / 52.93. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.93.0
Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
At least one output file must be specified
Prueba 2
Comando FFmpeg:
ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4
Pantalla de prueba 2:
Salida de consola FFmpeg ( ffmpeg -i 2.mp4
)
FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.93. 0 / 52.93. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.93.0
Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
At least one output file must be specified
Respuesta1
En primer lugar, instale una versión más reciente de FFmpeg: obtenga una compilación estática dela página de descarga.
El uso de vpre
ajustes preestablecidos (que es una forma de establecer valores predeterminados paraffmpegajustes, no ajustes del codificador) no es realmente necesario; normalmente querrás utilizar las -preset
opciones definidas por los codificadores.
Las razones por las que obtiene una baja calidad de salida son las siguientes, para sus dos casos respectivamente:
En el primer caso se utiliza
crf 25
, unFactor de tasa constanteeso le dará peor calidad que la predeterminada para el codificador x264 (que es 23). El CRF controla la calidad. Intente configurar un CRF más bajo, tal vez 20, 18, etc. Aquí, más bajo significa mejor calidad, pero aumentará el tamaño del archivo. Un cambio de 6 en el CRF le da el doble o la mitad de la tasa de bits promedio original, en términos generales.Tendrá que establecer un CRF más bajo debido a lapérdida de generación. Estás codificando algo que ya estaba codificado, por lo que nuevamente estás desperdiciando información visual. Eso nunca es bueno, pero si es necesario, tendrás que configurar una calidad más alta para no eliminar demasiada información del vídeo de entrada.
En el segundo caso, intenta establecer una velocidad de bits constante de 2 MBit/s. Su vídeo de entrada tiene aproximadamente la misma velocidad de bits. Ahora, x264 ofrece una calidad visual mucho mejor que un codificador visual MPEG-4 para la misma tasa de bits, pero debido a la pérdida de generación, nuevamente, es posible que desees usar una tasa de bits aún mayor que la original; de lo contrario, terminarás comprimiendo. demasiada información.
Además, la codificación de velocidad de bits constante puede hacer que algunos pasajes se vean bien, pero otras partes del video se vean peor. Si no permite que el codificador elija libremente la cantidad de bits que quiere gastar en algo, sacrificará la calidad a expensas de conocer el tamaño del archivo de destino.
x264 tiene un modo de velocidad de bits constante, pero se considera inferior a los otros métodos de codificación. En realidad, la codificación de dos pasos no está destinada a lograr una calidad óptima, así que elimine eso.
Dicho todo esto, intente algo como lo siguiente:
ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4
Si libfdk_aac
no está disponible, utilice esto en su lugar:
ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4
La principal perilla de control de calidad será la configuración CRF. Experimente con eso y use un valor más bajo si necesita mejor calidad.
También puedes elegir el veryslow
ajuste preestablecido, que te dará una mejor compresión, pero la codificación obviamente llevará más tiempo.
Si no puede conseguir un archivo de calidad decente con un tamaño de archivo razonable, no tendrá suerte. Es mejor mantener el archivo original tal como está, sin volver a codificarlo. No existe una herramienta mágica para "mantener la misma calidad" cuando comprimes algo que ya está comprimido.