¿Cómo hacer un archivo de video MPEG2 con la mayor calidad posible usando FFMPEG?

16

Tengo un archivo WMV (v9 (WMV3), 960x720, 30.000030 fps, planar 4: 2: 0 YUV, producido por PowerPoint 2010) y necesito convertirlo a MPEG2, el único formato que mi televisor puede leer desde una unidad flash USB (También probé MP4 / h.264, AVI / XVID, nada más que MPEG2 funciona).

Me las he arreglado para el trabajo con simple

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

pero la calidad del resultado es terrible (se introducen distorsiones visuales claramente visibles) y la reproducción no es uniforme (demasiado lenta en algunos momentos).

También he intentado

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(Encontré esto en algún lugar de Internet y lo modifiqué un poco; cambié la revelación, la frecuencia de actualización y el formato de salida (de VOB a MPG simple)), pero la calidad sigue siendo demasiado mala.

¿Qué parámetros debo usar para guardar la mayor calidad posible? La relación de compresión no importa en absoluto, incluso un aumento en el tamaño del archivo es aceptable.

Otra cosa que realmente necesito (he decidido no incluirlo en el título de la pregunta para evitar que sea demasiado específico, pero agradecería que se tenga en cuenta en las respuestas) es agregar silencio puro como una banda sonora: no hay sonido en el original pero el televisor se queja y me gustaría deshacerme de esta queja. He generado un archivo OGG Vorbis de silencio de la misma longitud (segunda precisión) usando Audacity pero no puedo fusionarlo con el video:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

e incluso desnudo

ffmpeg -i in.mpg -c:v copy -out.mpg

da errores de "desbordamiento de búfer" y "paquete demasiado grande". (in.mpg son los archivos producidos por el mismo binario FFMPEG y el mismo archivo WMV de origen utilizando los dos primeros comandos de la pregunta).

Estoy usando una compilación Zeranoe FFMPEG en Windows 7.

Ivan
fuente
2
Alguien le pedirá un registro de salida completo.
dstob
¿Qué televisor exactamente? Es posible que pueda leer H.264, solo un perfil diferente.
slhck
@slhck El televisor es Philips 42PFL3606H/58, estoy codificando a H.264 con ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- el perfil es el más bajo que conozco y se utilizan aún más ajustes para hacer que la reproducción del archivo resultante sea una tarea más fácil.
Ivan
1
Según el manual, el televisor admite MPEG-4 Visual y H.264. Si el perfil de línea de base no funciona, no estoy seguro de lo que hace. Pero los televisores son muy exigentes.
slhck

Respuestas:

16

El problema es que la tasa de bits predeterminada para el MPEG-2 es bastante baja (como con la mayoría de los otros codificadores de video en ffmpeg, el H.264 es una excepción). MPEG-2 tampoco es la mejor opción como códec en estos días.

Mejor calidad para MPEG-2

Tiene algunas opciones si desea seguir con MPEG-2:

  • Aumentar la tasa de bits. Ahora lo estás usando -b:v 2500k. Si se trata de video HD, no llegará lejos con solo 2.5 MBit / s. Necesita al menos el doble o incluso más para que el resultado se vea bien. Por ejemplo, use -b:v 6000k -target pal-dvd.

    Para 720p, creo que aún debería usar una tasa de bits más alta. Recuerde que los DVD usan MPEG-2 y vienen en aproximadamente 4.7 GB por 2 horas de película, por lo que termina con alrededor de 5–8 MBit / s. MPEG-2 realmente no es muy eficiente en compresión y funciona mejor a velocidades de bit más altas.

  • Use una configuración de calidad específica. Cambio-b:v … a -qscale:v 2. El número aquí varía de 1 a 31 y mayor significa menor calidad. No tiene sentido ir más allá de 4 o 5. Si no le importa la tasa de bits, comience con 2 y vea si eso funciona para usted.

Jugar con la cantidad de cuadros B, el método de estimación de movimiento o el tamaño de GOP puede modificar un poco la calidad, pero no dará lugar a grandes cambios.

Audio silencioso

Se usa -f lavfi -i aevalsrc=0para generar una transmisión de audio silenciosa. Por ejemplo:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Es posible que deba agregar -target pal-dvd al comando anterior para forzar un cierto tamaño de búfer.

Elegí MP3 como códec. Los archivos MPEG no pueden contener audio que no sea audio MPEG Layer I y II, así como transmisiones PCM, por lo que usar un archivo Ogg Vorbis silencioso no funcionará a menos que también convierta la transmisión de audio (que no es lo que está haciendo cuando usa-c:a copy ) .

Usa un códec de video diferente

Me sorprende que un televisor que reproduce archivos de video lea MPEG-2 pero no otra cosa. Se debe admitir al menos el video MPEG-4 Parte II (eso es lo que se conoce como "DivX", un codificador MPEG-4 Parte II). Entonces podrías probar:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

Es posible que su televisor también sea compatible con H.264, pero solo un cierto perfil. Intente usar el baselineperfil, por ejemplo:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

En el ejemplo anterior, he usado la opción CRF para establecer la calidad en lugar de qscale. Consulte la guía de codificación H.264 para más información.

slhck
fuente
"Jugar con la cantidad de cuadros B, el método de estimación de movimiento o el tamaño de GOP puede modificar un poco la calidad, pero no generará grandes cambios". - ¿Puedo hacer que cada cuadro sea un cuadro B y no usar ninguna estimación de movimiento con MPEG2? El video tiene muchas partes MUY dinámicas.
Ivan
He probado la primera línea de comando que sugiere ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"): codifica alrededor de 100 cuadros y luego comienza a inundar la pantalla con errores como [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761y [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan
@ Ivan Cambias la tasa de bits con -b:v. Lo agregué a mi respuesta. Con respecto a la configuración del codificador: No puede hacer que cada cuadro sea un cuadro B. Además, necesita una estimación de movimiento: cuanto más exhaustivo sea el método, mejor será la compresión. Pero si se trata de un video dinámico, lo primero que querrá es aumentar significativamente la tasa de bits. La configuración de codificación realmente no tiene mucho impacto. En cuanto a su error, ¿está seguro de que este es el error del comando correcto? Un [mpeg]error solo puede ocurrir si su archivo de salida es .mpg, no cuando lo es .mp4.
slhck
He copiado = pegado una parte incorrecta, @slhck, estoy usando, ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"por supuesto.
Ivan
1
-target pal-dvdresuelve el problema, -bufsizeno funciona (lo he intentado -b:v 7M -bufsize 7M -maxrate 7M).
Ivan
0

Diría de inmediato que si el tamaño del archivo realmente no importa, simplemente experimente aumentando la tasa de bits.

Para el audio silencioso, es posible que desee usar ffmpeg, no sé lo suficiente sobre Audacity como para dar algún tipo de comentario. He usado esto antes.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

Sin embargo, esto no funcionará para usted, ya que está utilizando el contenedor mpg, por lo que es posible que desee probarlo (contenedor mp3)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Parecía funcionar para mí.

dstob
fuente
No es necesario establecer la duración, ya que ffmpeg solo usará lo que sea necesario para el video.
slhck
Mantuve las cosas en el proceso de dos pasos como lo había hecho Ivan. Si omite la duración en mi comando, entonces no sé cuánto tiempo se ejecutará ffmpeg (probablemente más de lo que desearía).
dstob