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
CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
- Client 1
- Client 2
- Client N
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.