29 votos

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

Aquí es lo que yo quiero hacer. Miró a su alrededor, pero no encontrar ninguna respuesta clara. Tengo un Linux ejecutando sitios web usando Ubuntu/MySQL/Apache. Yo tengo mi propia IP estática así, es decir, no utilizando de alojamiento web. Me gustaría ser capaz de transmitir la señal de video desde una cámara web en una laptop (es de suponer que ejecuta Windows) a mi servidor Linux, y hacer que los usuarios de uno de mis sitios web ser capaz de ver el video en vivo que se transmite. Obviamente el portátil sería necesario autenticarse con el servidor de alguna manera, pero no debe haber restricciones sobre quién puede ver el video en vivo en el sitio web. Gracias.

7voto

mkudlacek Puntos 1316

Yo actualmente desarrolla de streaming en línea de 3 miniDV cámaras conectadas a través de FireWire, que es bastante similar a sus necesidades.

Rápido sugerencia: vlc + flowplayer/jw player

Primero de todo, hay dos formatos de vídeo, que se puede utilizar en la transmisión en línea: FLV y h264. FLV es más fácil de codificar, h264 tiene mejor tamaño y calidad de la relación, pero la transcodificación es mucho más consumen. Ambos pueden ser mostrados por los reproductores flash de una página web.

En segundo lugar, la transmisión de la infraestructura. Desde su ancho de banda desde un ordenador portátil es limitado (par Mbps tops) usted necesita para obtener la corriente a su servidor y no restream a los clientes. De modo que la corriente de flujo de 1 vez al servidor y, a continuación, N veces a los clientes a partir de ahí. No has descrito tu conexión a internet para su computadora portátil, por lo que el escenario está dividido en dos secciones:

  1. Ordenador portátil está conectado con la dirección IP pública O usted puede puertos NAT para ordenador portátil. Este escenario es mucho más fácil, ya que puedes conectar desde el servidor a la computadora portátil agradable y fácil. Gran desventaja es, que estás atado a un solo lugar (una dirección IP).

  2. Ordenador portátil no está conectado con el público me dirijo. Esto es un poco complicado, pero será el trabajo de cualquier red que le permitirá SSH a su servidor y tener sufficiant de carga (1 Mbps debería hacerlo).

Sin importar a escenario, el infrastructer tendrá este aspecto

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

Streaming desde un ordenador portátil

  1. Captura de vídeo desde la webcam. Nunca he capturado flujo de webcam conectada localmente, pero hay muchos ejemplos de cómo hacerlo a través de V4L, e.g: Webcam De Instalación. La única parte que usted debe estar interesado es:

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

    Que es la primera parte de VLC comando para conectarse a la webcam. Para más detalles siga el mencionado HOWTO. Sobre todo se ven en el video "grupo" parte y corregir la ruta de dispositivo /dev/video y /dev/audio. Esos pueden ser diferentes en su equipo portátil.

  2. Transcodificación de vídeo a FLV. Yo personalmente uso FLV, ya que es menos de la CPU exigentes. Transcodificar cadena que yo uso es este:

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

    Que se convertirán secuencia de vídeo a formato FLV con MPGA de audio (MP3 no está disponible en mi Ubuntu). Frecuencia de muestreo es de alguna manera obligatoria, no funcionará sin él. Pero usted puede elegir más pequeños, como 22050. Esto transcodificación de vídeo stream 'como es', de modo que la escala es de 1:1. Usted puede añadir parámetros width y height, o incluso parámetro de escala. Buscar en VLC documentación.

  3. La secuencia de la computadora portátil. Ahora usted tiene que hacer arroyo local, y en el que el servidor de connect:

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

    Esto se unen VLC stream a 0.0.0.0:8081/arroyo.flv. El comando completo tendrá este aspecto:

    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. La captura de flujo en el servidor y restream ella. De nuevo, se uso el VLC para capturar y transmitir. El uso se basa en la infraestructura de escenario desde principios de este post. Como he mostrado, VLC en el ordenador portátil de secuencias de vídeo en algún puerto. Este puerto tiene que ser accesible desde el servidor. Si usted tiene una dirección IP pública de la computadora portátil, o Nat port, usted puede probarlo con telnet:

    server$ telnet public_ip_address 8081

    Nada, a excepción de "tiempo de espera de conexión" se revelan, que puede conectar a su ordenador portátil a la corriente. Si usted no tiene una dirección IP pública, o no se puede puertos NAT, tienes que hacerlo de la otra manera alrededor. Usted puede utilizar SSH desde la computadora al servidor remoto y enviar su portátil de puerto para el servidor. La correcta SSH el comando sería:

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

    Esta magia comando 'enlazar' su portátil puerto 8081, servidor de puerto 8081. Esto significa que cuando se conecta en el servidor para 8081, que silenciosamente se conecte a su ordenador portátil puerto 8081 a través de un túnel SSH. Bien, ¿eh?:) Todo lo que tienes que hacer es simple VLC conectar y transmitir:

    server$ vlc

    O en el caso de los IP pública dirección o Nat del puerto:

    http://localhost:8081/stream.flv

    Como en la laptop parte, su VLC en el servidor es enlazar el puerto 8082. Por qué 8082 y no 8081? 8081 está ya tomada por el SSH remoto hacia adelante. Por qué no utilizamos la transcodificación parte como en el primer ejemplo? El vídeo ya está en el formato correcto, todo lo que tienes que hacer es simplemente la secuencia tal como es.

  2. Pruebas. En ambos ejemplos, puede probar la funcionalidad de visualización de flujos a través de VLC. Usted puede probar su local de la secuencia:

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

    Y usted puede poner a prueba su secuencia del servidor:

    server$ vlc

    En ambos casos, usted debe ver a su webcam de entrada.

Visualización de flujo en la web

La visualización de la secuencia en la web, la cual funcionará en la mayoría de los casos, es a través de flash player. He probado dos productos, los cuales son gratis para uso no comercial: JW Player y Flowplayer. Me quedé con Flowplayer, pero no recuerdo el motivo, tal vez porque de plugins (que yo no lo uso:) ) o debido a la mejora de la documentación.

Cómo mostrar FLV flujo de VLC en la página web está cubierto aquí: Flujo de VLC a la página Web con la fundación y el Flash

Solución de problemas

Ser consciente de muchos de los problemas que SE presenten. Primero, como en todo, leer. VLC es muy hablador programa, así que le dirá dónde está el problema. Podría ser problema con los permisos para acceder al vídeo/audio del dispositivo, la falta de codecs, mal escrito --sout parámetros,... Aprender a utilizar http://public a ver si los datos realmente fluye a través de la red, etc.

4voto

the-wabbit Puntos 28168

Mi herramienta de elección en este caso sería vlc. No es un multi-propósito multi-formato de reproductor de vídeo, también es capaz de streaming en una magnitud de formatos de archivo y protocolos de streaming. Como un bono, las obras de plataforma cruzada entre Windows y Linux hosts.

Hemos creado algo similar hace un par de años donde un cliente a través de un estrecho ancho de banda de la línea DSL (128 K de subida) que se necesita para tener su conectados a la red de webcams transmitir a un público amplio. Una instalación de VLC como un "reflector" host hizo cam señal de rotación, tomó la principal carga del ancho de banda de la transmisión de los clientes y presenta la secuencia en diferentes protocolos de transmisión y formatos.

1voto

cyberx86 Puntos 14100

En realidad no es mi área de especialización, pero tal vez me pueda apuntar en una posible dirección.

La implementación comercial es el uso de Adobe Flash Media Server. Por supuesto, que puede ser bastante costoso enfoque. Sin embargo, existen alternativas de código abierto - como Red5. Usted tendrá que instalar el servidor (tiene Java dependencias).

Una vez que tenga el servidor que ejecuta, usted puede escoger su front-end (creo Red5 viene con algunas muestras, pero también puede usar el Reproductor JW con type=camera).

El extremo delantero recibirá el streaming de vídeo desde el servidor de medios, y deberá cargar su secuencia para el servidor de medios.

Más información: Red5 Ayudar & Info y Red5 Referencia

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: