2012-09-04 40 views
10

Me gustaría envolver datos codificados en tiempo real a webm u ovg y enviarlos a un navegador html5.Transmisión en tiempo real a HTML5 (sin out webrtc) simplemente usando la etiqueta de video

Puede hacerlo webm o ov, Mp4 no puede hacerlo debido a sus átomos MDAT. (uno no puede ajustar h264 y mp3 en tiempo real y envolverlo y enviarlo al cliente) Digamos que estoy alimentando la entrada de mi cámara web y el audio de mi micrófono incorporado. El mp4 fragmentado puede manejar esto, pero es una molestia encontrar libs para hacer eso).

Necesito hacer esto porque no quiero enviar audio y video separadamente.

Si lo envié de manera separable, enviando audio por etiqueta de audio y video a través de video> (audio y video son demultiplexados y enviados) ¿Puedo sincronizarlos en el navegador del cliente con javascript. Vi algunos ejemplos, pero aún no estoy seguro.

Respuesta

2

Evren,

Puesto que usted ha hecho esta pregunta al principio, las extensiones de los medios de origen https://www.w3.org/TR/media-source/ han madurado lo suficiente como para poder reproducir segmentos de video/mp4 ISO-BMFF muy cortos (30 ms) con solo un poco de almacenamiento en búfer.

Consulte HTML5 live streaming

Así que su estado de cuenta

(no se puede envolver H264 y MP3 en tiempo real y envolverlo y enviarlo al cliente)

está fuera de fecha ahora. Sí, puedes hacerlo con h264 + AAC.

Existen varias implementaciones; echa un vistazo a Unreal Media Server. De Unreal Media Server FAQ: http://umediaserver.net/umediaserver/faq.html

Cómo es irreal en vivo en HTML5 diferente de MPEG-DASH? A diferencia de MPEG-DASH, Unreal Media Server utiliza un protocolo WebSocket para la transmisión en vivo al elemento MSE HTML5 en los navegadores web. Esto es mucho más eficiente que captar segmentos a través de solicitudes HTTP por MPEG-DASH. Además, Unreal Media Server envía segmentos de duración mínima, tan bajos como 30 ms. Eso permite una baja latencia de sub-segundo, mientras que MPEG-DASH, al igual que otros protocolos de transmisión en vivo basados ​​en fragmentos HTTP, no puede ofrecer transmisión en vivo de baja latencia.

sus demos página web tiene una alimentación de HTML5 en directo desde la cámara RTSP: http://umediaserver.net/umediaserver/demos.html en cuenta que la latencia en el reproductor HTML5 es comparable a la de flash player.

+0

Esto parece un anuncio de Unreal. "Hay varias implementaciones", sin embargo, la única sugerencia es una solución única de Unreal que requiera una licencia. Dado que esta es una respuesta mucho más actual que la anterior mejor de hace 4 años, sería agradable ver que una de las varias implementaciones sea una que otros puedan construir. – JohnMetta

0

No es 100% seguro de que puede hacerlo. HTML5 no ha ratificado ningún mecanismo de transmisión en vivo. Puede usar websockets y enviar datos en tiempo real al navegador para hacer esto. Pero debes escribir la lógica de análisis y no sé cómo alimentarás los datos a medida que llegan al reproductor.

En cuanto a la etiqueta de video y audio: la etiqueta de video puede reproducir archivos contenedores que tienen audio y video. Así que envuelva su contenido en un contenedor que sea compatible. Si modifica su navegador para escribir su transmisión en vivo a este archivo de video a medida que el contenido en vivo sigue llegando y transmite esos datos para cada byte solicitado por el navegador, esto podría hacerse. Pero definitivamente no es trivial.

+1

Necesito leer un archivo wmv. transcodifíquelo en tiempo real con velocidad de procesamiento (como si estuviera mirando y no escribiendo en un archivo) codificado para VP8 y envuélvalo en webm. El navegador va a señalar file.webm que está siendo transcodificado. cuando se realiza la solicitud, voy a realizar largas encuestas en el servidor. y voy a escribir en ese zócalo http (puede nombrarlo como sea, digamos "respuesta"). Así que hay una forma de comunicación, es decir, el servidor está empujando el archivo webm hacia el navegador. El navegador está descargando progresivamente un archivo, al menos cree que es un archivo pero en realidad es una transmisión en vivo envuelta en webm. –

+2

Doable. Es más simple quizás escribir en un archivo directamente y servir el archivo de un servidor web. Utilice el conjunto de aceleración de los servidores web a la tasa de bits objetivo para asegurarse de que se sirve en "tiempo real" y no más rápido o más lento. Dale un poco de ventaja a la transcodificación para conseguir espacio. Deberia trabajar. La aceleración es importante para que el jugador no pueda tirar más rápido que la velocidad a la que está produciendo (la tasa de bits objetivo) – av501

10

Hice esto con ffmpeg/ffserver ejecutándose en Ubuntu de la siguiente manera para webm (mp4 y ogg son un poco más fáciles, y deberían funcionar de manera similar desde el mismo servidor, pero debería usar los 3 formatos para compatibilidad entre navegadores)

En primer lugar, compile ffmpeg desde el origen para incluir los controladores libvpx (incluso si usa una versión que lo tiene, necesita los más nuevos (a partir de este mes) para transmitir webm porque simplemente agregaron la funcionalidad para incluir global encabezados). Hice esto en un servidor y escritorio de Ubuntu, y this guide me mostró cómo - instrucciones para otros sistemas operativos can be found here.

Una vez que haya obtenido la versión apropiada de ffmpeg/ffserver, puede configurarlos para la transmisión, en mi caso esto se hizo de la siguiente manera.

En el dispositivo de captura de vídeo:

ffmpeg -f video4linux2 -standard ntsc -i /dev/video0 http://<server_ip>:8090/0.ffm 
  • La parte "-f Video4Linux2 -standard NTSC -i/dev/video0" de que puede cambiar dependiendo de la fuente de entrada (el mío es de un video Tarjeta de captura).

Relevante extracto ffserver.conf:

Port 8090 
#BindAddress <server_ip> 
MaxHTTPConnections 2000 
MAXClients 100 
MaxBandwidth 1000000 
CustomLog /var/log/ffserver 
NoDaemon 

<Feed 0.ffm> 
File /tmp/0.ffm 
FileMaxSize 5M 
ACL allow <feeder_ip> 
</Feed> 
<Feed 0_webm.ffm> 
File /tmp/0_webm.ffm 
FileMaxSize 5M 
ACL allow localhost 
</Feed> 

<Stream 0.mpg> 
Feed 0.ffm 
Format mpeg1video 
NoAudio 
VideoFrameRate 25 
VideoBitRate 256 
VideoSize cif 
VideoBufferSize 40 
VideoGopSize 12 
</Stream> 
<Stream 0.webm> 
Feed 0_webm.ffm 
Format webm 
NoAudio 
VideoCodec libvpx 
VideoSize 320x240 
VideoFrameRate 24 
AVOptionVideo flags +global_header 
AVOptionVideo cpu-used 0 
AVOptionVideo qmin 1 
AVOptionVideo qmax 31 
AVOptionVideo quality good 
PreRoll 0 
StartSendOnKey 
VideoBitRate 500K 
</Stream> 

<Stream index.html> 
Format status 
ACL allow <client_low_ip> <client_high_ip> 
</Stream> 
  • Nota: este está configurado para un servidor en feeder_ip para ejecutar el comando ffmpeg antes mencionado, y para el servidor en modo ip_servidor servidor a través de client_low_ip client_high_ip mientras manejo de la conversación de mpeg a webm en server_ip (continúa a continuación).

Este comando ffmpeg se ejecuta en la máquina antes denominado ip_servidor (que maneja el MPEG real -> conversión WebM y se alimenta de nuevo en el ffserver en una alimentación diferente):

ffmpeg -i http://<server_ip>:8090/0.mpg -vcodec libvpx http://localhost:8090/0_webm.ffm 

Una vez que todos hayan sido iniciados (primero el ffserver, luego el proceso feeder_ip ffmpeg luego el proceso server_ip ffmpeg) debería poder acceder a la transmisión en vivo en http: //: 8090/0.webm y verificar el estado en http : //: 8090/

Espero que esto ayude.

+0

gracias, lo conseguí con show directo. Esto es muy útil. –

+0

@ EvrenBingøl, ¿podría proporcionar más información? – alfadog67

+0

Esto ha sido un tiempo, así que esto es lo que recuerdo; El cliente solicita un archivo ogv del servidor que representa el video en tiempo real. los datos que se envían se convierten a ogv sobre la marcha en el servidor usando directX. Entonces di que quieres hacer un video chat. Enviaría sus datos de audio y video al servidor con sus encabezados (cualquiera que sea el tipo que sea) y directx los convertirá en ogv y los enviará al extremo receptor. Ogv maneja muy bien los trozos. –

4

Uso el servidor de Stream-m para retransmitir secuencias de webm a las etiquetas de video HTML5 del cliente. https://github.com/yomguy/stream-m

Funciona bien en producción. Saludos

EDIT: Tenga en cuenta que IceCast ahora también puede transmitir WebM fuera de la caja;)

Cuestiones relacionadas