Existem inúmeros fóruns e tópicos sobre como se livrar de uma latência de 5 segundos ao usar um Pi junto com uma PI-Cam como uma câmera de vigilância. Muitos tutoriais mostram como usar o vlc para codificar e transmitir as imagens usando o protocolo RTP, o que resulta em um atraso de ~ 5 segundos.
De acordo com mim, o motivo é que o raspivid está codificando o fluxo para o H264, enquanto o VLC precisa decodificá-lo novamente e recodificá-lo para o que quer que seja o RTP. A linha de comando fica assim:
raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
A primeira parte diz ao raspivid para transmitir vídeo para a saída padrão:
raspivid -w 640 -h 480 -o - -t 0
A parte após o tubo, diz ao VLC para buscá-lo e decodifica-lo usando h264:
cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
Este mux-ing e desmux-ing é uma cintura de recursos!
Encontrei as fontes do raspicam no github e acho que algo pode ser feito no método encoder_buffer_callback (atualmente na linha 848) para pular a codificação. No entanto, eu não sou bom em ce nem familiarizado com a codificação de vídeo, então não tenho idéia por onde começar.
No Github, vejo 330 garfos, mas eles não parecem ser especificamente para raspicam (e sim para todo o projeto da terra do usuário). Eu me perdi tentando encontrar um fork que removeu a codificação ou implementou algo mais simples como o mjpeg.
Alguém com conhecimento em codec c e de vídeo poderia ajudar a mim e aos outros zilhões de usuários a se livrar da latência? Provavelmente a solução já está disponível em um desses garfos, mas passei horas procurando por ela sem sorte.
ps Não estou procurando uma solução para navegador , mas, em última análise, quero transmiti-la para uma Synology, preferencialmente usando streaming mjpeg (mas não através de uma página da Web, em vez disso, um fluxo mjpeg padrão que é incorporado na maioria das câmeras IP comerciais). O primeiro passo é se livrar do h264.
fonte
Respostas:
Provavelmente, não é isso que você deseja obter respostas, mas eu não recomendo o streaming VLC.
Para um projeto da escola, tentei algumas opções de streaming (também no RPi!):
Usando VLC e MJPEG (e alguns outros menos conhecidos), tive latência entre 3 e 5 segundos.
Usando GStreamer, SEM LATÊNCIA e com uma melhor resolução (e muitas mais opções)!
Se você estiver interessado, pode conferir aqui .
E se você usá-lo, aqui está o meu pipeline:
fonte
Algumas pessoas têm trabalhado duro nisso desde que fiz essa pergunta pela primeira vez e, a essa altura, existem algumas opções (estranho que ninguém tenha respondido a essa pergunta ainda). Eu tentei RaspberrIPCam e tive algum sucesso, no entanto, parece que os pacotes rtsp tinham um TTL extremamente curto ou algo assim. Tendo o Pi conectado diretamente a um roteador próximo ao meu PC, ele funcionaria perfeitamente. Mas assim que instalei a câmera onde eu queria e tentei acessar o fluxo com dois roteadores entre eles, nenhuma imagem chegaria. Eu verifiquei o código-fonte e encontrei o TTL definido no máximo. Eu nunca descobri isso completamente.
Atualmente, eu recomendaria o RaspberryIPCamera, que possui uma ótima interface de usuário (veja as capturas de tela ) e até existe uma imagem de cartão SD pronta para isso. Eu tentei o cartão SD, mas voltei a fazer uma instalação manual como descrito aqui com grande sucesso (minha configuração atual). Instruções para conectá-lo a um Synology DiskStation também estão disponíveis e estão funcionando perfeitamente no meu sistema. O problema com a imagem do cartão SD era que não consegui expandir o sistema de arquivos em toda a extensão do cartão SD (também quero executar outras coisas para controlar alguns relés através dos pinos GPIO).
A solução acima usa componentes do projeto UV4L. A documentação do projeto UV4L nesta página também menciona:
Ainda não experimentei isso ainda (já que não quero estragar minha configuração atual).
fonte