Convierta .WMV usando FFmpeg

Me gustaría usar FFmpeg en la línea de comandos de Mac Terminal para convertir un archivo .WMV. Estoy familiarizado con la sintaxis:

ffmpeg -i /path/OriginalMovieFile.wmv /path/NewMovieFile.???

Sin embargo, mi intento reciente de convertir un archivo .WMV de 38 MB a .MP4 resultó en un archivo de 800 MB que no se reproducía. Tal vez haya un error en mi sintaxis anterior. O tal vez necesito instalar un paquete especial para manejar .WMV.

¿Cómo puedo convertir archivos .WMV usando FFmpeg desde la línea de comandos de Mac Terminal?

Incluya la salida completa de la consola de su comando. Puede agregar la -topción si la codificación de una duración corta es suficiente para ayudar a explicar el problema.

Respuestas (2)

wmv a menudo se detecta como 90k FPS por ffmpeg. (Ese es un valor de marcador de posición ya que el demuxer no mira la transmisión de inmediato para ver los intervalos entre los primeros cuadros).

El valor predeterminado de ffmpeg para la salida mp4 es el modo CFR, duplicando fotogramas para aumentar la velocidad de fotogramas (a 90000FPS en este caso). Incluso los códecs más eficientes toman unos pocos bytes para codificar un cuadro que es un duplicado exacto del anterior.

-vsync vfr(igual que -vsync 2) en la línea de comando debería solucionar el problema (permitiendo que ffmpeg no elimine ni duplique ningún cuadro, sino que solo use las marcas de tiempo de entrada para los cuadros de salida). Va después del archivo de entrada pero antes del archivo de salida, ya que es una opción de salida.

Aparte de eso, consulte https://trac.ffmpeg.org/wiki/Encode/H.264 , por ejemplo, para saber cómo elegir la configuración adecuada para lo que está haciendo. (por ejemplo, -preset veryslowgastar mucho tiempo de CPU en una tarea de codificación única en la que la ganancia de calidad por tamaño de archivo se beneficiará muchas veces).

Esta explicación es poco probable ya que 1) incluso en el nivel 5.2 H264 admite un máximo de 530 millones de muestras de luminancia por segundo, por lo que una salida de 90K fps se limitará a una resolución inferior a 102x58 y 2) he codificado muchos WMV que informan un tbn y tbc de 1K (e incluso algunos 90K), y nunca obtuve una salida inflada como el OP: no especifico una velocidad de fotogramas como indicador o filtro de salida.
@Mulvya: No probé esto por mí mismo con ffmpeg recientemente, pero mplayersolía mostrar los fps de los archivos wmv como 90k. En realidad, creo que vi algo como esto con salida mp4 y una entrada VFR mp4 real. Cuando codifica desde una fuente wmv, ¿qué formato de salida utiliza? El valor predeterminado de ffmpeg para la mayoría de los muxers es -vsync vfr, pero se cambió a -vsync cfrmp4 como una solución para algún error que puede ocurrir en un caso de esquina. re: 1) : este archivo de salida probablemente no esté cerca del nivel 5.2, si mi teoría es correcta. Si ffmpeg / x264 lo etiqueta como tal, eso es un error.
Mi salida era típicamente H264 en MP4 o MOV. Mi punto re: nivel era que era muy poco probable que ffmpeg estuviera tratando de usar un fps de 90K como salida, aunque solo fuera por la sencilla razón de que incluso en el nivel más alto de 5.2, esa velocidad de fotogramas solo permitiría una resolución muy baja, y la codificación debería fallar desde el principio, en lugar de volcar un archivo inflado.
@Mulvya: insane-framerate h.264 sigue siendo h.264 válido, simplemente no hay un nivel que lo describa. Creo que ahora recuerdo al menos otra pregunta aquí donde ffmpeg usó una velocidad de fotogramas demasiado alta e hizo un archivo gigante. Esa pregunta tenía una salida ffmpeg completa, por lo que pudimos ver que eso fue lo que realmente sucedió. Estoy de acuerdo, en un mundo ideal, ffmpeg podría saber cuándo sucedió esto por accidente y cancelar, sin dejar de hacer lo que se le pide si realmente le pidió que creara un archivo de salida CFR de 90k fps.

Ambos avconvy ffmpegsufren de los valores predeterminados mal elegidos para cada contenedor y códec. Por lo tanto, no debe simplemente dar el comando en el formato que ha presentado, sino también decirle qué hacer.

Yo uso avconv, pero si aún lo usa ffmpeg, el formato es bastante similar, por lo que debería poder seguirlo.

Deberá especificar la configuración de audio. En muchos casos, deseará copiar su audio sin volver a codificarlo. Esto se hace a través de -c:a copy. Por ejemplo:

avconv -i video.wmv -c:a copy (...) video.mkv

Esta no era una línea completa, así que aún no la intentes.

También puede optar por volver a codificar su audio, en ese caso, en lugar de copyusar el nombre del códec (o, por alguna razón, a menudo, la biblioteca que realiza la codificación). Por ejemplo, puedes escribir:

avconv -i video.wmv -c:a libvorbis (...) video.mkv

Pero esto no producirá buenos resultados, porque no proporcionamos ningún parámetro para la conversión de audio. Démosle una configuración de calidad, y luego estaremos listos con el audio:

avconv -i video.wmv -c:a libvorbis -q:a 3 (...) video.mkv

Ahora el vídeo. A menudo podemos simplemente copiar ese también, pero esto rara vez es lo que queremos. Si solo desea remuxar el archivo (lo que significa que desea cambiar el formato, pero no los códecs), puede hacer lo siguiente:

avconv -i video.wmv -c:a copy -c:v copy video.mkv

Como veis hemos copiado tanto el vídeo como el audio, y los metemos en el nuevo archivo que es de formato Matroska. Esta línea de comando ya funcionará, y puede intentarlo.

Debe tener en cuenta que no todos los formatos pueden aceptar todos los códecs posibles, algunos de ellos son más exigentes que otros.

Digamos que ahora desea volver a codificar el video en algo. Personalmente, prefiero libtheora, debido a que es un códec gratuito, pero puedes tener diferentes preferencias. Te dejaré decidir por ti mismo cuál usar.

Entonces podemos tener algo como esto:

avconv -i video.wmv -c:a copy -c:v libtheora -q:v 8 video.mkv

Allí pedí avconvcopiar el audio, pero recodificar el video con la biblioteca libtheoray una calidad de video de 8. Todo se guardará dentro de video.mkv, lo que significa que es un archivo Matroska.

Puede jugar con la configuración, pero muy rara vez debe usar los ajustes preestablecidos predeterminados. Y tenga en cuenta que, incluso si el formato del archivo es el mismo para la salida que para la entrada, avconv se volverá a codificar de forma predeterminada. Si desea copiar flujos, debe especificarlo manualmente.