Crear videos MP4 listos para la transmisión HTTP

Respuestas:

9

Esta es una respuesta al último comentario de usted @abrahab.

No necesita mp4boxun archivo para poder transmitirlo de forma pseudo a través de nginx. El módulo de transmisión MP4 lo cuida independientemente del posicionamiento de los átomos de moov ( mp4boxdesplaza el átomo de moov al comienzo del archivo).


Ahora para el error del servidor 500, ¿está usando la opción "-frag" con mp4box? El módulo de transmisión MP4 no puede leer archivos MP4 fragmentados. Un buen uso de mp4boxpseudo streaming es intercalar los videos para una mejor búsqueda. El desplazamiento del átomo de Moov es una ventaja adicional.

Siempre hago esto en mp4boxun archivo codificado con FFmpeg

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

Esto también intercalará el archivo MP4 en 500 milisegundos de fragmentos por defecto.

Vineet
fuente
1
Para intercalar archivos "in situ" sin tener que crear un archivo nuevo, use directamenteMP4Box -isma -inter 500 Myvideo.mp4
Vineet
45

H.264 en MP4

En general, desea crear video x264 dentro de un contenedor MP4. Esta opción es compatible básicamente con cualquier dispositivo y navegador.

Lo siguiente debería ser suficiente. Asegúrese de reemplazar el nombre de entrada y las opciones de CRF. Este último establece la calidad, donde los valores razonables oscilan entre 19 y 25: menor significa mejor calidad, pero también mayor tasa de bits:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

También puede usar Handbrake para codificar si le gusta la forma de GUI.

Usando la faststartopción

Ahora, lo que debe hacer es mover el átomo MOOV del contenedor MP4 al principio. Este átomo (en esencia, una unidad de datos en el contenedor MP4) contendrá metadatos importantes sobre las transmisiones de video / audio. -movflags faststartdebería hacer exactamente eso.

Si su versión de FFmpeg no tiene esta opción, considere actualizar. Si no puede actualizar, puede lograr lo mismo con cualquiera de las siguientes herramientas:

  • QTIndexSwapper , una aplicación de Adobe AIR

  • MP4Box , de código libre y abierto, ejecuta un comando similar al siguiente, donde puede cambiar el intervalo (aquí, 500):

    mp4box -inter 500 input.mp4

  • qt-faststart en Python , que funciona en todas partes donde está instalado Python.

    qtfaststart input.mp4

Eso es todo.

Control de bitrate / calidad

Ahora, por supuesto, para la transmisión, es posible que desee restringir la tasa de bits para mantenerse dentro de ciertos límites. Puede leer más sobre eso en mi publicación de blog sobre métodos de control de velocidad .

Por ejemplo, al agregar -maxrate 2M -bufsize 2Ma las opciones de codificación, limita la codificación a 2 Mbit / s, que puede ser suficiente para video de 720p. La tasa de bits requerida dependerá, por supuesto, de lo complejo que sea el contenido. Esto lleva algo de prueba y error.

slhck
fuente
gracias, hago todo de la misma manera, pero parece que el problema sigue con el video :( Lo hago ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4entonces mp4boxy mp4 no puede buscar y nginx reporta el 500 internal server errorparámetro de inicio más que 0. cuando el video está codificado sin -vcoded libx264(codificador mp4 predeterminado) todo el archivo de trabajo (pero calidad! enfermo!) :( (lo siento, ahora, no se permite votar tu respuesta)
abrahab
Esto parece un problema del complemento h.264 con NginX en lugar de cualquier problema de conversión de video. No soy un experto en transmisión de video web per se, pero veo que ya preguntaste sobre esto en Stack Overflow. stackoverflow.com/questions/11079748/…
slhck
También estoy pensando que quizás nginx no pueda leer este formato de video correctamente. El video de YouTube también se reproduce bien. sí, me preguntan en la pila sobre el problema de nginx, pero parece que no hay respuestas. :(
abrahab
3
+1 por -movflags faststartexactamente lo que necesitaba
Andrew
el enlace está muerto, es necesario usar web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
malat
5

Simplemente puede convertir un AVI o MP4 no transmisible, también sin volver a codificar todo, haciendo esto:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

No hay necesidad de volver a codificar nada, porque solo se debe mover el átomo de moov.

usuario769852
fuente
-1

Puedes probar esto con ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"
Tomás Hernández
fuente
55
¿Audio estéreo PCM de 22 kHz para transmisión de video por Internet? No suena demasiado eficiente. ¿Y por qué entonces establecerías la tasa de bits de audio a 128k?
slhck
@slhck, puede cambiar 22k a 44k reemplazando "-ar 22050" con "ar 44100"
Searush
1
@SEARAS El problema no es la frecuencia de muestreo. Es el hecho de que el audio es PCM estéreo sin comprimir. Para la transmisión por internet. Eso no figura.
slhck
Esta respuesta es de muy baja calidad y debe eliminarse. Los parámetros pueden cambiar la velocidad de cuadros, la resolución de video y la frecuencia de muestreo de audio del contenido y producir resultados ineficientes o de baja calidad (ffmpeg puede elegir parámetros más seguros o mejores). El rendimiento también se ve limitado por la limitación a menos hilos y ni siquiera funciona con el -acodec pcm_s16le(error:) Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. Parece que también falta una buena razón, como un borrador de IETF, de por qué elegir exactamente estos parámetros.
LiveWireBT