Convierta AVI (Xvid) a MP4 (H.264) manteniendo la misma calidad


48

Quiero comprimir un archivo AVI a MP4 usando un códec h.264. No pude obtener la misma calidad. ¿Cómo puedo comprimirlo?

Video original:

Pantalla de video original:

Salida de la 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

Respuestas:


60

En primer lugar, instale una versión más reciente de FFmpeg: obtenga una compilación estática de la página de descarga .

El uso de vprepreajustes (que es una forma de establecer valores predeterminados para la configuración de ffmpeg , no la configuración del codificador) no es realmente necesario; generalmente desea usar las -presetopciones definidas por los codificadores.

Las razones por las que obtiene baja calidad de salida son las siguientes, para sus dos casos, respectivamente:

  1. En el primer caso que utilice crf 25, un Factor de velocidad constante que le dará una calidad peor 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 / la mitad de la tasa de bits promedio original, en términos generales.

    Tendrá que establecer un CRF más bajo debido a la pérdida de generación . Estás codificando algo que ya estaba codificado, por lo que vuelves a tirar información visual. Eso nunca es bueno, pero si tiene que hacerlo, tendrá que establecer una calidad más alta para no eliminar demasiada información del video de entrada.

  2. En el segundo caso, está intentando establecer una velocidad de bits constante de 2 MBit / s. Su video 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 desee utilizar una tasa de bits aún mayor que la original; de lo contrario, terminará comprimiéndose. 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 deja 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 alcanzar una calidad óptima, así que tacha eso.

Dicho todo esto, intente algo con 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_aacno está disponible, use 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 perilla principal de control de calidad será su configuración de CRF. Experimente con eso y use un valor más bajo si necesita una mejor calidad.

También puede elegir el veryslowpreajuste, que le dará una mejor compresión, pero la codificación obviamente tomará más tiempo.

Si no puede obtener un archivo de calidad decente con un tamaño de archivo razonable, entonces no tiene suerte. Mejor mantenga el archivo original como está, sin volver a codificar. No existe una herramienta mágica para "mantener la misma calidad" cuando se comprime algo que ya está comprimido.


Si su video es más pequeño después de la conversión con dos pasadas, debe especificar una tasa de bits más alta. Prueba -b:v 3Mo más; pero recomendaría usar el método CRF en lugar de la variante de dos pasos.
slhck

10
@AhmetKa Otra opción es simplemente re-MUX las corrientes de contenedor AVI a contenedor MP4: ffmpeg -i input.avi -c copy -map 0 output.mp4. No hay una nueva codificación, por lo que no hay pérdida de calidad.
llogan

1
@ AhmetKa Debería haber mencionado que el muxing no siempre funcionará si el formato del contenedor de salida no admite formatos de medios de entrada. Consulte Comparación de formatos de contenedor para tener una idea general de lo que funciona.
llogan

Hola de nuevo @slhck Crf no está correctamente. Bitrate, ancho, alto, etc. ¿Puedo calcular?
Ahmet KAPIKIRAN

3
@hyde Deberías preferir en -c:a aac -strict experimentallugar de hacerlo libvo_aacenc, porque ofrece una mejor calidad.
slhck
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.