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.
30
Respostas:
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:
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).
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
Streaming do laptop
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.
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.
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
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á.
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
iftop
para ver se os dados realmente fluem pela rede, etc.fonte
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.
fonte
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
fonte