¿Cómo transmitir video en vivo desde un servidor Linux?

30

Esto es lo que quiero hacer. Miré a mi alrededor pero no encontré ninguna respuesta directa. Tengo una caja de Linux que ejecuta sitios web usando Ubuntu / MySQL / Apache. También tengo mi propia IP estática, es decir, no uso el alojamiento web. Me gustaría poder transmitir el video desde una cámara web en una computadora portátil (presumiblemente ejecutando Windows) a mi servidor Linux, y hacer que los usuarios de uno de mis sitios web puedan ver ese video en vivo mientras se transmite. Obviamente, la computadora portátil necesitaría autenticarse de alguna manera con el servidor, pero no debería haber restricciones sobre quién podría ver el video en vivo en el sitio web. Gracias.


fuente
¿pregunta cómo implementar dicha solución o busca una solución de terceros lista para usar? en el caso anterior SO es un lugar equivocado para esta pregunta, creo que es la razón de la votación negativa

Respuestas:

46

Actualmente desarrollo transmisión en línea a partir de 3 cámaras miniDV conectadas a través de FireWire, que es bastante similar a sus necesidades.

Sugerencia rápida: vlc + flowplayer / jw player

En primer lugar, hay dos formatos de video que puede usar en la transmisión en línea: FLV y h264. FLV es más fácil de transcodificar, h264 tiene una mejor relación tamaño / calidad, pero la transcodificación consume mucho más CPU. Ambos pueden ser mostrados por reproductores flash en la página web.

En segundo lugar, la infraestructura de transmisión. Dado que su ancho de banda desde la computadora portátil es limitado (un par de Mbps como máximo), necesita transmitir a su servidor y transmitirlo a los clientes. Entonces la secuencia fluirá 1 vez al servidor y luego N veces a los clientes desde allí. No ha descrito su conexión a Internet para su computadora portátil, por lo que el escenario se divide en dos secciones:

  1. La computadora portátil está conectada con una dirección IP pública O puede conectar el puerto NAT a la computadora portátil . Este escenario es mucho más fácil, ya que puede conectarse de un servidor a una computadora portátil de manera agradable y fácil. La gran desventaja es que está vinculado a una ubicación (una dirección IP).

  2. La computadora portátil no está conectada con la dirección pública . Esto es un poco complicado, pero funcionará desde cualquier red que le permita SSH a su servidor y tenga una carga suficiente (1 Mbps debería hacerlo).

Independientemente del escenario utilizado, el infractor se verá así

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

Streaming desde laptop

  1. Capture video de la cámara web . Nunca he capturado transmisiones de cámaras web conectadas localmente, pero hay muchos ejemplos de cómo hacerlo a través de V4L, por ejemplo: Configuración de cámara web . La única parte que debería interesarte es:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    Cuál es la primera parte del comando VLC para conectarse a la cámara web. Para más detalles, siga el CÓMO mencionado. Mire especialmente la parte del "grupo de video" y la ruta correcta del dispositivo a / dev / video y / dev / audio. Esos pueden ser diferentes en su computadora portátil.

  2. Transcodificar video a FLV . Yo personalmente uso FLV, ya que requiere menos CPU. La cadena de transcodificación que uso es esta:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    Que transcodificará la transmisión de video a formato FLV con audio MPGA (MP3 no está disponible en mi Ubuntu). La frecuencia de muestreo es obligatoria de alguna manera, no funcionará sin ella. Pero puede elegir más pequeño, como 22050. Esto transcodificará la transmisión de video 'tal cual', por lo que la escala es 1: 1. Puede agregar parámetros de ancho y alto, o incluso parámetros de escala. Mira en la documentación de VLC.

  3. Transmítelo desde la computadora portátil . Ahora tiene que hacer una transmisión local, en la que se conectará el servidor:

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    Esto vinculará la transmisión VLC a 0.0.0.0:8081/stream.flv. Todo el comando se verá así:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

Restreaming en el servidor

  1. Captura de la corriente en el servidor y que ReStream . Nuevamente, usamos VLC para capturar y transmitir. El uso se basa en el escenario de infraestructura desde principios de esta publicación. Como mostré, VLC en la computadora portátil transmite video en algún puerto. Este puerto debe ser accesible desde el servidor. Si tiene una dirección IP pública de una computadora portátil o un puerto NAT, puede probarla con telnet:

    server$ telnet public_ip_address 8081

    Todo lo que no sea "tiempo de espera de conexión" revelará que puede conectarse a la transmisión de su computadora portátil. Si no tiene una dirección IP pública o no puede utilizar el puerto NAT, debe hacerlo al revés. Puede SSH desde la computadora portátil al servidor y reenviar remotamente el puerto de su computadora portátil al servidor. El comando SSH correcto sería:

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    Este comando mágico 'vinculará' el puerto 8081 de su computadora portátil al puerto 8081 del servidor. Eso significa que cuando se conecta al servidor a 8081, se conectará en silencio al puerto 8081 de su computadora portátil a través del túnel SSH. Genial, ¿eh? :) Entonces, todo lo que tenemos que hacer es conectar y transmitir VLC:

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    O en caso de dirección IP pública o puerto NAT:

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Al igual que en la parte de la computadora portátil, su VLC en el servidor está vinculado al puerto 8082. ¿Por qué 8082 y no 8081? El control remoto SSH ya ha tomado 8081. ¿Por qué no usamos la parte de transcodificación como en el primer ejemplo? El video ya está en el formato correcto, por lo que todo lo que tenemos que hacer es transmitirlo tal cual.

  2. Las pruebas . En ambos ejemplos, puede probar la funcionalidad al ver transmisiones a través de VLC. Puedes probar tu transmisión local:

    laptop$ vlc http://localhost:8081/stream.flv

    Y puede probar la transmisión de su servidor:

    laptop$ vlc http://server_ip_address:8082/stream.flv

    En ambos casos, debería ver la entrada de su cámara web.

Mostrar secuencia en la web

La visualización de la transmisión en la web, que funcionará en la mayoría de los casos, se realiza a través de Flash Player. Probé dos productos, que son gratuitos para uso no comercial: JW Player y Flowplayer . Me quedé con Flowplayer, pero no recuerdo la razón, tal vez por los complementos (que no uso :)) o por una mejor documentación.

Aquí se cubre cómo mostrar la transmisión FLV desde VLC en la página web: Transmita VLC al sitio web con asf y Flash

Solución de problemas

Tenga en cuenta muchos problemas que surgirán. Lo primero, como en todo, leer . VLC es un programa muy hablador, por lo que le dirá dónde está el problema. Podría haber un problema con los permisos para acceder al dispositivo de video / audio, los códecs faltantes, los parámetros mal escritos --out, ... Aprenda a usar iftoppara ver si los datos realmente fluyen a través de la red, etc.

mkudlacek
fuente
1
¡Muchas gracias! Esta fue más información de lo que esperaba. Revisará VLC y usará su información como guía.
3

Mi herramienta de elección aquí sería vlc . No es solo un reproductor de video multiformato multipropósito, también es capaz de transmitir en una gran variedad de formatos de archivo y protocolos de transmisión. Como beneficio adicional, funciona multiplataforma entre los hosts de Windows y Linux.

Hemos establecido algo similar hace un par de años donde un cliente que usaba una línea DSL de ancho de banda estrecho (128 K aguas arriba) necesitaba que sus cámaras web conectadas a la red se transmitieran a un público amplio. Una instalación de VLC como host "reflector" realizó la rotación de la señal de la leva, tomó la carga de ancho de banda principal de los clientes de transmisión y presentó la transmisión en diferentes protocolos y formatos de transmisión.

el wabbit
fuente
1

No es realmente mi área de especialización, pero tal vez pueda señalarle en una dirección potencial.

La implementación comercial es utilizar el servidor Flash Media de Adobe. Por supuesto, ese puede ser un enfoque bastante costoso. Sin embargo, existen alternativas de código abierto, como Red5 . Deberá instalar el servidor (tiene dependencias de Java).

Una vez que tenga el servidor en funcionamiento, puede elegir su front-end (creo que Red5 viene con algunas muestras, pero también puede usar JW Player con type=camera).

El front-end recibirá la transmisión de video desde el servidor de medios, y usted subirá su transmisión al servidor de medios.

Más información: Ayuda e información de Red5 y Referencia de Red5

cyberx86
fuente
jwplayer es algo increíble para uso personal
Kendrick