Transmisión en vivo a través de MP4


Estoy trabajando en un servicio de televisión en línea. Uno de los objetivos es que el video se reproduzca sin ningún complemento adicional del navegador (excepto Flash).

Decidí usar MP4, porque es compatible con la mayoría de los navegadores HTML5 y con Flash (como alternativa). Los videos son transcodificados desde ASF en un servidor por FFMpeg.

Sin embargo, encontré que MP4 no se puede transmitir en vivo porque tiene un átomo moov para los metadatos que tiene que especificar la longitud. FFMpeg no puede transmitir directamente mp4 a stdout, porque pone el moov al final del archivo. (La transcodificación en vivo y la transmisión de MP4 funciona en Android, pero falla en Flash player con NetStream.Jugar.FileStructureInvalid error )

Por supuesto, MPEG-TS existe, pero no es compatible con HTML5 <video>.

Lo que pensé es un método para transcodificar el flujo en tiempo real a MP4, y en cada nueva solicitud HTTP para él, primero envíe un moov que especifique un número muy largo para la longitud del video, y luego empezar a enviar el resto del archivo MP4.

¿ Es posible usar MP4 para transmitir de esa manera?

Después de algunas investigaciones y la respuesta de av501, entiendo que los tamaños de los marcos deben conocerse para que pueda funcionar.

¿Se puede segmentar el archivo mp4 en partes más pequeñas para que se pueda transmitir?

Por supuesto, cambiar a otro contenedor / formato es una opción, pero el único formato compatible con Flash y HTML5 es mp4/h264, por lo que si tengo que admitir ambos, me gustaría tengo que transcodificar dos veces.

Author: TylerH, 2012-10-22

4 answers

Aquí están mis pensamientos, chicos, algunos de ellos podrían estar justo en otros muy lejos. Alego ignorancia porque nadie ha documentado este proceso completamente, todo es una suposición educada.

AVAssetWriter solo codifica en un archivo, parece que no hay manera de obtener el video codificado en la memoria. Leyendo el archivo mientras se escribe desde un hilo de fondo para decir que un socket resulta en un flujo elemental, esto es esencialmente un m4v, que es un contenedor con h264 / acc mdata, pero no moov átomos. (en otras palabras, sin encabezado) Ningún reproductor suministrado por Apple puede reproducir esta transmisión, pero un reproductor modificado basado en ffplay debería ser capaz de decodificar y reproducir la transmisión. Esto debería funcionar, porque ffplay utiliza libavformat que puede decodificar flujos elementales, una advertencia ya que no hay información de longitud de archivo, algunas cosas tienen que ser determinadas por el juego, el DTS y PTS y también el jugador no puede buscar dentro del archivo.

Alternativamente se puede usar un naul sin procesar de la corriente m4v para construir una corriente rtmp.

Si desea discutir más a fondo puede ponerse en contacto conmigo directamente.

Cómo se obtienen los datos.

Dado que tendrá que reconstruir el archivo en el lado receptor de todos modos, supongo que podría segmentarlo, Steve Mcfarin escribió un pequeño appleSegmentedEcorder que puede encontrar en su página de github, esto resuelve algunos de los problemas para los átomos de moov ya que tiene toda la información del archivo.

 4
Author: Michelle Cannon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-10 19:42:56

Puede usar MP4 fragmentado. Un archivo MP4 fragmentado se construye de la siguiente manera:

moov [moof mdat]+

El cuadro moov solo contiene información básica sobre las pistas (cuántas, su tipo , inicialización de códec, etc.), pero no información sobre las muestras en la pista. La información sobre las ubicaciones de las muestras y los tamaños de las muestras se encuentra en el cuadro moof, cada cuadro moof es seguido por un mdat que contiene las muestras como se describe en el cuadro moof anterior. Típicamente uno elegiría la longitud de un (moof, mdat) - par para estar alrededor de 2,4 u 8 segundos (no hay ninguna especificación sobre eso, pero estos valores parecen ser razonables para la mayoría de los casos de uso).

Esta es una forma de construir una secuencia MP4 interminable.

 18
Author: Sebastian Annies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-28 08:37:18

No, no es solo la longitud muy larga.. necesita saber el tamaño exacto de cada fotograma para crear el encabezado en un mp4. [es por eso que se crea al final por los diversos codificadores].

 2
Author: av501,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-23 09:11:14

Solo mirando el segundo párrafo de su pregunta ("Los videos son transcodificados desde ASF en un servidor por ffmpeg."), usted mencionó que está utilizando ffmpeg para transcodificar videos en el servidor.

Use qt-faststart o MP4Box para colocar MOOV atom al principio del archivo. (también asegúrese de que el uso de vídeo H264 y códec de audio AAC para el soporte universal)

Espero que esto te haya ayudado.
 0
Author: mrsatish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-02 11:00:00