Como posso fazer com que o Raspivid pule a codificação h264? (eliminando o fluxo de vídeo de latência de 5 segundos)

11

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.

Louis Somers
fonte
Essa é uma investigação muito completa. O uso do MJPEG está fora de questão, porque (na época eu estava procurando) o codificador JPEG embutido não tinha biblioteca e o software era lixo. Consegui obter 1s de atraso usando o nginx-rtmp (FLV empacotado), compilação personalizada, em HD! O pi usou cerca de 30% da CPU, mas o VLC lutou para decodificá-lo por causa dos quadros de tempo ausentes e devido ao seu FLV :( Também meu software de CFTV usava coletor VLC e o fluxo de 1 720p usava 40% da CPU quando eu finalmente consegui trabalhar, mas estava muito instável.
Piotr Kula
@ppumkin Não acredito que o MJPEG esteja fora de questão. Depois que o H264 se for, podemos codificar para o que quisermos sem ter a sobrecarga de decodificação e recodificação. Na verdade, ter o H264 é um luxo! Somente devemos ser capazes de desligá-lo. É como um luxuoso trono acolchoado e com ponta de diamante em uma câmara sanitária apertada, para que nada mais caiba na sala (exceto por um espaço onde podemos pular um pouco para cima e para baixo) ... quando você abre a porta, precisa subir por cima de um apoio de braço alto, e quando você se senta, não há espaço para as pernas ...
Louis Somers
Sim, eu entendo o que você quer dizer. Passei dias tentando obter MJPEG em uma qualidade decente para o meu servidor IP de CFTV. Muitas coisas mudaram, mas a codificação JPEG direta do hardware e a canalização para um fluxo são inexistentes, pois a API não está disponível. A única maneira que conheço é software e a melhor solução que encontrei foi o dissipador JPEG nginx-rtmp. HLS para iPhone funciona muito bem, na verdade, mas seus tenho um 5s-10s lag :(
Piotr Kula
11
Você pode tentar fazer isso como uma pergunta no projeto Github para o software da câmera. Você provavelmente obterá uma explicação de por que é difícil, mas se outros acharem um recurso útil, alguém poderá implementá-lo.
TomG 28/08/14
demux não é o mesmo que decodificar ... por favor verificar isso
o Flash Trovão

Respostas:

5

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!):

  • VLC
  • MJPEG
  • GStreamer

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:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT
Val
fonte
11
Sim, eu já tentei o Gstreamer e funciona muito bem ao transmitir para um PC, mas não funciona bem com softwares de terceiros, como o Synology DiskStation. Parece que o GStreamer apenas reutiliza o fluxo h264 e envolve um protocolo de streaming sem decodificá-lo, o que é uma ótima solução, mas infelizmente para um pequeno número de casos de uso. Se eu quiser ver o fluxo em um dispositivo Android, tenho que desenvolver meu próprio aplicativo para ele. O MJPEG é muito mais suportado, e tenho certeza que o Raspivid pode ser alterado para ignorar a codificação desnecessária, deixando isso para o VLC ou mais. Obrigado pela dica qualquer maneira
Louis Somers
11
Eu também tenho um Synology, mas não tentei o GStreamer nele (o meu não é poderoso o suficiente, eu acho). Aliás, sobre o Android, você também pode usar o GStreamer! Estou usando-o para o meu projeto e está funcionando bem :)!
Val
Problema com o gstreamer, ele não inclui o intervalo de tempo nos dados do quadro e é inutilizável como um coletor (mesmo com a opção adicionada !!) :( Existem scripts de mod disponíveis para canalizar, mas achei o gstreamer recebendo bombas VLC frequentemente. 6 meses atrás, quando eu estava procurando fazer saome CCTV .. mas nunca funcionou de forma confiável :(
Piotr Kula
@Val true, existe um SDK para Android, mas não há muitos players prontos para uso na play-store que oferecem suporte a pipelines como gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234! gdpdepay! rtph264depay! avdec_h264! videoconvert! autovideosink sync = false. Para iOS, há ainda menos disponível. O Synology é um ótimo hub que suporta a maioria dos dispositivos convencionais, pode detectar, gravar e notificações de movimento, tudo pronto para uso (e sem cartões SD de cintura).
Louis Somers
Você ainda está usando isso assim? Existe o novo driver U4VL, mas ainda com os mesmos problemas de latência com o h264 streaming para o VLC
Piotr Kula
0

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:

Entre outras coisas, oferece uma interface da Web a partir da qual é possível ver o fluxo de vídeo de várias maneiras e uma Página de controle que permite controlar totalmente as configurações da câmera durante o streaming com qualquer aplicativo Video4Linux.

Ainda não experimentei isso ainda (já que não quero estragar minha configuração atual).

Louis Somers
fonte
11
Não tenho certeza se esse foi o seu problema, mas se você estiver enviando tráfego RTSP multicast através de um roteador, verifique se o snooping IGMP está ativado e verifique se o seu PC não está bloqueando as consultas IGMP do roteador. Caso contrário, o roteador não perceberá que o seu PC está tentando receber os pacotes e, portanto, nunca os encaminhará.
Malvineous 20/08/19