Como transmitir vídeo ao vivo de um servidor linux?

30

Aqui está o que eu quero fazer. Olhou em volta, mas não encontrou nenhuma resposta direta. Eu tenho uma caixa Linux executando sites usando Ubuntu / MySQL / Apache. Eu também tenho meu próprio IP estático, ou seja, não estou usando hospedagem na web. Eu gostaria de poder transmitir o feed de vídeo de uma webcam em um laptop (provavelmente executando o Windows) para o meu servidor Linux e permitir que os usuários de um dos meus sites vejam esse vídeo ao vivo enquanto está sendo transmitido. Obviamente, o laptop precisaria se autenticar com o servidor de alguma forma, mas não deveria haver restrições sobre quem poderia assistir ao vídeo ao vivo no site. Obrigado.


fonte
você pergunta como implementar essa solução ou procura uma solução de terceiros pronta para uso? no primeiro caso SO é o lugar errado para esta pergunta, eu acredito que é a razão de downvoting

Respostas:

46

Atualmente, desenvolvo streaming on-line a partir de três câmeras miniDV conectadas via FireWire, o que é bastante semelhante às suas necessidades.

Dica rápida: vlc + flowplayer / jw player

Primeiro de tudo, existem dois formatos de vídeo que você pode usar no streaming online: FLV e h264. FLV é mais fácil de transcodificar, o h264 possui uma melhor relação tamanho / qualidade, mas a transcodificação consome muito mais CPU. Ambos podem ser exibidos por flash players na página da web.

Segundo, infra-estrutura de streaming. Como a largura de banda do laptop é limitada (alguns Mbps no máximo), é necessário obter o fluxo no servidor e restituí-lo aos clientes. Portanto, o fluxo fluirá 1 vez para o servidor e depois N vezes para os clientes a partir daí. Você não descreveu sua conexão com a internet para o seu laptop, portanto, o cenário é dividido em duas seções:

  1. O laptop está conectado ao endereço IP público OU você pode porta NAT ao laptop . Esse cenário é muito mais fácil, pois você pode se conectar do servidor ao laptop de forma fácil e agradável. A grande desvantagem é que você está vinculado a um local (um endereço IP).

  2. O laptop não está conectado ao endereço público . Isso é um pouco complicado, mas funcionará em qualquer rede que permita o SSH no servidor e tenha upload suficiente (1 Mbps deve fazê-lo).

Independentemente do cenário usado, a infraestrutura ficará assim

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

Streaming do laptop

  1. Capture vídeo da webcam . Eu nunca capturei o fluxo da webcam conectada localmente, mas há muitos exemplos de como fazê-lo via V4L, por exemplo: Configuração da webcam . A única parte que você deve estar interessado é:

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

    Qual é a primeira parte do comando VLC para conectar-se à webcam. Para mais detalhes, siga o HOWTO mencionado. Observe especialmente a parte "grupo de vídeo" e o caminho correto do dispositivo para / dev / video e / dev / audio. Essas podem ser diferentes no seu laptop.

  2. Transcodifique o vídeo para FLV . Eu pessoalmente uso FLV, pois é menos exigente de CPU. Transcode string que eu uso é o seguinte:

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

    Que irá transcodificar o fluxo de vídeo para o formato FLV com áudio MPGA (o MP3 não está disponível no meu Ubuntu). O Samplerate é de alguma forma obrigatório, não funcionará sem ele. Mas você pode escolher menor, como o 22050. Isso transcodificará o fluxo de vídeo 'como está', de modo que a escala seja 1: 1. Você pode anexar parâmetros de largura e altura, ou até mesmo parâmetros de escala. Examine a documentação do VLC.

  3. Transmiti-lo do laptop . Agora você precisa fazer o fluxo local, no qual o servidor se conectará:

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

    Isso ligará o fluxo do VLC a 0.0.0.0:8081/stream.flv. Todo o comando terá esta aparência:

    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}'

Repetindo no servidor

  1. Capture o fluxo no servidor e renove-o . Novamente, usamos o VLC para capturar e transmitir. O uso é baseado no cenário de infraestrutura do início deste post. Como mostrei, o VLC no laptop transmite vídeo em alguma porta. Esta porta deve ser acessível a partir do servidor. Se você tiver um endereço IP público do laptop ou uma porta NAT, poderá testá-lo com o telnet:

    server$ telnet public_ip_address 8081

    Qualquer coisa, exceto o "tempo limite da conexão", revelará que você pode se conectar ao fluxo do seu laptop. Se você não possui um endereço IP público ou não pode porta NAT, é necessário fazer o contrário. Você pode fazer o SSH do laptop para o servidor e encaminhar remotamente a porta do laptop para o servidor. O comando SSH correto seria:

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

    Este comando mágico 'ligará' a porta 8081 do laptop à porta 8081 do servidor. Isso significa que quando você se conectar ao servidor no 8081, você silenciosamente se conectará à porta 8081 do laptop via túnel SSH. Legal, não é? :) Então, tudo o que precisamos fazer é conectar e transmitir VLC simples:

    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}'

    Ou no caso de endereço IP público ou porta 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}'

    Como na parte do laptop, seu VLC no servidor está vinculado à porta 8082. Por que 8082 e não 8081? O 8081 já foi levado pelo encaminhamento remoto SSH. Por que não usamos a parte de transcodificação como no primeiro exemplo? O vídeo já está no formato certo, então tudo o que precisamos fazer é apenas transmiti-lo como está.

  2. Teste . Nos dois exemplos, você pode testar a funcionalidade visualizando fluxos via VLC. Você pode testar seu fluxo local:

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

    E você pode testar o fluxo do seu servidor:

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

    Nos dois casos, você deverá ver a entrada da sua webcam.

Exibir fluxo na web

A exibição do fluxo na Web, que funciona na maioria dos casos, é via flash player. Tentei dois produtos, gratuitos para uso não comercial: JW Player e Flowplayer . Fiquei no Flowplayer, mas não lembro o motivo, talvez por causa de plugins (que não uso :)) ou por causa de uma documentação melhor.

Como exibir o fluxo FLV do VLC na página da web é abordado aqui: Transmitir VLC para o site com asf e Flash

Solução de problemas

Esteja ciente de muitos problemas que surgirão. A primeira coisa, como em tudo, leia . O VLC é um programa muito falador, por isso lhe dirá onde está o problema. Pode haver problemas com permissões para acessar o dispositivo de vídeo / áudio, codecs ausentes, parâmetros --sout com erros ortográficos, ... Aprenda a usar iftoppara ver se os dados realmente fluem pela rede, etc.

mkudlacek
fonte
11
Muito obrigado! Isso foi mais informação do que eu esperava. Irá verificar o VLC e usar suas informações como um guia.
3

Minha ferramenta de escolha aqui seria vlc . Não é apenas um reprodutor de vídeo multifuncional, também é capaz de transmitir em uma variedade de formatos de arquivo e protocolos de transmissão. Como um bônus, ele funciona em várias plataformas entre os hosts Windows e Linux.

Criamos algo semelhante há alguns anos atrás, em que um cliente que usa uma linha DSL de largura de banda estreita (128 K upstream) precisava ter suas webcams conectadas em rede transmitidas para um público amplo. Uma instalação do VLC como um host "refletor" fez a rotação do sinal do came, tomou a carga da largura de banda principal dos clientes de streaming e apresentou o stream em diferentes protocolos e formatos de streaming.

o wabbit
fonte
1

Não é realmente minha área de especialização, mas talvez eu possa apontá-lo em uma direção potencial.

A implementação comercial é usar o Flash Media Server da Adobe. Obviamente, isso pode ser uma abordagem bastante cara. No entanto, existem alternativas de código aberto - como o Red5 . Você precisará instalar o servidor (ele possui dependências Java).

Depois de ter o servidor em execução, você pode escolher seu front-end (acredito que o Red5 vem com alguns exemplos, mas você também pode usar o JW Player com type=camera).

O front end receberá o vídeo de streaming do servidor de mídia e você fará o upload do seu stream no servidor de mídia.

Mais informações: Ajuda e Informações do Red5 e Referência do Red5

cyberx86
fonte
jwplayer é uma coisa impressionante para uso pessoal
Kendrick