FFMPEG convierte flv a mp4 sin perder calidad [duplicado]

55

Esta pregunta ya tiene una respuesta aquí:

Actualmente estoy convirtiendo archivos flash .flv a archivos .webm y .mp4 para usarlos con un reproductor de video HTML5.

_ _

Utilizo este comando ffmpeg para WEBM: ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis filename.webm que funciona muy bien y el tamaño del archivo se mantiene relativamente igual (importante).

_ _

Para MP4 estoy usando lo siguiente: ffmpeg -i filename.flv -sameq -ar 22050 filename.mp4

Se convierte a .mp4 bien y evita cualquier pérdida de calidad, pero el tamaño del archivo casi se triplica.

¿Qué fórmula de ffmpeg podría usarse para convertir a MP4 sin perder demasiada calidad y evitar un tamaño de archivo mucho mayor?

Chad Whitaker
fuente

Respuestas:

57
ffmpeg -i filename.flv -c:v libx264 -crf 19 -strict experimental filename.mp4

Debe especificar el códec de video utilizado. En su comando no especifica más -vcodeco -c:vmenos ffmpeg usa el códec predeterminado para MP4 ( mpeg4) que no tiene muy buena eficiencia de compresión. Intente usar libx264 en su lugar y establezca el CRF, que es el nivel de calidad (menor es mejor, el valor predeterminado es 23 y los valores correctos están entre 18 y 28).

La codificación con libx264 es un poco compleja, por lo que debe buscar la guía de codificación H.264 .

También debe especificar lo -strict experimentalcontrario, podría obtener: "El codificador 'aac' es experimental pero los códecs experimentales no están habilitados, agregue '-strict -2' si desea usarlo".

sashoalm
fuente
1
Esto lleva mucho tiempo y el mp4 resultante está muy distorsionado, se pierden píxeles, etc. ¿Alguna idea de por qué podría ser así? : /
trainoasis
El códec de vídeo por defecto para el formato mp4 no es necesariamente mpeg4. Según la salida de ffmpeg --help muxer=mp4mi máquina, ffmpeg usa h264 como códec de video predeterminado de mp4.
doubleDown
1
@doubleDown Mi respuesta es antigua: desde 2011. Probablemente cambiaron los valores predeterminados en algún momento desde entonces.
sashoalm
43

Este comando solo cambia el contenedor sin volver a codificar

ffmpeg -i input.flv -codec copy output.mp4
c97
fuente
¿Conoces una manera de hacer un script para la conversión por lotes de muchos videos en la misma carpeta?
ttoine
sí, en Windows cree el archivo convert.bat y coloque este código en él: for %%a in ("*.flv") do ffmpeg -i "%%a" -codec copy "%%~na.mp4"luego ejecute convert.bat en la carpeta con archivos * .flv
c97
1
Para mí, esto arroja No se pudo escribir el encabezado para el archivo de salida # 0 (¿parámetros de códec incorrectos?): Argumento no válido. ¿Algunas ideas? : /
trainoasis
2
@trainoasis su .flv no contiene video H.264 y audio AAC. Copiar los datos de audio / video intactos -codec copya un archivo .mp4 solo funciona en el caso muy raro de que el audio y el video ya estén codificados con H.264 y AAC. Ver superuser.com/a/1009539/390946 y addpipe.com/blog/flv-to-mp4 .
Octavian Naicu
3

avconvy ffmpegson esencialmente lo mismo. [a partir de MUY recientemente hay ALGUNA divergencia, pero no hay mucho de qué hablar si compila la suya propia ffmpeg[la que se proporciona en los repositorios de Ubuntu, por ejemplo, es VIEJA y sufre de que el tamaño del video no sea un bla, bla, bla, trato [básicamente intenta para decirle que el video tiene proporciones incorrectas], pero si se molesta en leer la ffmpegguía de compilación y compilarla desde git, no tiene ninguno de los problemas de las versiones anteriores que vienen en la mayoría de los sistemas operativos. la advertencia en referencia a la depreciación avconvque está diciendo que ellos han creado una nueva util para tratar de reemplazar ffmpeg, pero es SO utiliza ampliamente que incluso si trataban cual fue cortada que todos estaríamos creando enlaces simbólicos a partir avconvdeffmpeg de todos modos para que no dejen de trabajar y lo dejen caer.]]

No es algo malo de usar avconv, acabo de ver la respuesta que menciona la advertencia de depreciación, que es esencialmente un mensaje vacío, debería ser más una alternativa a ffpmeg que podría probar avconv, que es más fiel al caso aquí.

avconv -i inputfile.flv -map 0 -c:v libx264 -c:a copy outputfile.mp4

es realmente lo MISMO que

ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis

esencialmente en el primero está usando las opciones de mano más corta y en el segundo está la variedad más escrita.

TAMBIÉN -map 0se refiere a las pistas de audio, por lo que si usa algo como lo mp4aque puede manejar múltiples pistas de audio bien, puede dejar esto para copiar todas las secuencias de audio en el archivo resultante. Esto solo es necesario si usa un códec que no admite múltiples pistas de audio en el mismo archivo, entonces querrá asignar el audio necesario y no todos. Por supuesto, si intenta minimizar el espacio utilizado, puede especificar solo uno para tratar de eliminar un poco de tamaño del archivo [el audio es como un 1/3 del tamaño de la pista de video [y eso es generoso]].

-c:v = codec(video)entonces: -c:v libx264es lo mismo que usar: -vcodec libx264FYI; lo mismo con este ejemplo:-c:v copy = -vcodec copy

y, además, para los FLV, tenga cuidado de que el archivo flv sea el mismo que un avi ya que es un contenedor que puede contener cualquier número de códecs para video o audio. Debería usar primero la utilidad de inspección de medios de su elección para ver qué se usa dentro del archivo antes de elegir copiar el flujo de video y / o audio o si desea transmitirlo de lo que sea a algo nuevo. Por lo tanto, el comando que funciona mejor para un FLV puede no ser el mismo para otro FLV [por supuesto, USUALMENTE si obtiene múltiples FLV de la misma fuente, se codificarán de la misma manera, pero nunca es una garantía].

No traté de elegir con precisión solo encontré esto en la búsqueda web y quería ayudar a aclarar un poco las cosas para la gente.

Nuevamente, como esta respuesta indica la respuesta debajo de esta, SÍ ejecutando ffmpeg siempre publicará ese mensaje, es esencialmente hueco ya que estas 2 utilidades siguen siendo la misma utilidad con muy poca diferencia. En casi todos los casos, debería obtener exactamente los mismos resultados con cualquiera de los comandos. Esto no necesariamente va a resultar en una nueva transcodificación completa, ¿por qué? A, si no es necesario, ahorra un montón de tiempo, y B si vuelve a transcodificar un archivo que ya se ha comprimido en un códec de video, básicamente está ejecutando una rutina de compresión contra algo que ya está comprimido y siempre dará como resultado en menos calidad que la fuente. La mayoría de los códecs más nuevos son algo compatibles entre sí [no todos] como, por ejemplo, un flv podría ser técnicamente un MP4 dentro de un contenedor FLV, ya que los FLV como AVI son solo contenedores de otros códecs. Entonces, depende de lo que tenga la fuente flv para el video y el códec ausio en comparación con lo que está convirtiendo en si necesita ser transcodificado. Si dentro del FLV usaran el video H264 MP4 y MP4a para audio, no necesitaría volver a transcodificar lo que solo necesitaría para copiarlo y ajustar los encabezados de los archivos para que se lea como un verdadero MP4 en lugar de un video MP4 dentro de un archivo FLV.

Paria
fuente
3

De acuerdo con esta guía , el comando adecuado para convertir FLV a MP4 sin ninguna codificación AV es este:

ffmpeg -i input.flv -c copy -copyts output.mp4

Funcionó perfectamente para mí en todos los casos con video AVC y audio AAC o MP3.

Al Kepp
fuente
-1

Cuando uso ffmpeg, recibí una advertencia de desuso para usar avconv. Usando avconv obtuve buenos resultados:

avconv -i inputfile.flv -map 0 -c: v libx264 -c: una copia outputfile.mp4

Leer man avconvpara más información.

gare_c
fuente
1
ffmpegen sí mismo no está en desuso . La razón por la que se ve bien es porque especifica el codificador x264 que tiene una buena configuración predeterminada de calidad.
slhck
-2

Le sugiero que cree un script de shell para ese llamado video_flv_to_mp4con el siguiente contenido:

ffmpeg -i $1 -sameq -ar 22050 -vcodec libx264 $1.mp4 

Luego ejecútelo así:

$ video_flv_to_mp4 video.flv

Le dará un archivo video.flv.mp4.

Thibault
fuente
44
-sameqya no es una opción válida para ffmpeg. Tampoco significa "misma calidad". Ver también esta publicación .
slhck