Eu adquiri a câmera Pi B + e Pi e agora estou tentando encontrar a configuração mais eficiente (baixa CPU) e de menor latência para transmitir vídeo codificado em H.264 da câmera para o meu servidor doméstico.
Eu li o seguinte:
(Todos os links usam gstreamer-1.0 de deb http://vontaene.de/raspbian-updates/ . main
.)
Muito foi feito nesse sentido nos últimos anos.
Originalmente, tínhamos que canalizar a saída raspivid
para gst-launch-1.0
(consulte o link 1).
Então (link 2) foi criado o driver oficial V4L2, que agora é padrão, e permite obter diretamente os dados sem um cano, usando apenas o gstreamer (veja especialmente o post de towolf »sábado, 07 de dezembro de 2013 15:34 no link 2):
Remetente (Pi): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000
Receptor: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
Se bem entendi, as duas formas usam a GPU para decodificar o H264, mas a última é um pouco mais eficiente, pois não precisa passar pelo kernel mais uma vez, pois não há canal entre os processos envolvidos.
Agora eu tenho algumas perguntas sobre isso.
Essa última ainda é a maneira mais recente de obter com eficiência o H264 da câmera? Eu li sobre
gst-omx
, o que permite pipelines gstreamer como... video/x-raw ! omxh264enc ! ...
. Isso faz algo diferente de apenas usarvideo/x-h264
ou pode até ser mais eficiente? Qual é a diferença?Como descubro qual plugin de codificação do gstreamer é realmente usado quando uso o
video/x-h264 ...
pipeline? Parece apenas especificar o formato que eu quero, em comparação com as outras partes do pipeline, onde nomeio explicitamente o componente (código) (comoh264parse
oufpsdisplaysink
).Em esta resposta ao link de 1 Mikael Lepistö menciona "Tirei um filtro passa desnecessária de streaming de lado" , o que significa que ele cortar o
gdppay
egdpdepay
. O que esses fazem? Por que eles são necessários? Posso mesmo tirá-los?Ele também menciona que, especificando
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
parâmetros para oudpsrc
lado receptor, ele pode iniciar / retomar a transmissão no meio da transmissão. O que esses limites alcançam, por que essas escolhas específicas, onde posso ler mais sobre eles?Quando faço o que é sugerido nas perguntas 3 e 4 (adicionando
caps
, soltandogdppay
egdpdepay
), a latência do meu vídeo fica muito pior (e parece estar se acumulando, a latência aumenta com o tempo e, após alguns minutos, o vídeo para)! Por que poderia ser isso? Gostaria de obter a latência obtida com o comando original, mas também tenho o recurso de poder ingressar no fluxo a qualquer momento.Eu li que o RTSP + RTP geralmente usa uma combinação de TCP e UDP: TCP para mensagens de controle e outras coisas que não devem ser perdidas, e UDP para a transmissão de dados de vídeo real. Nas configurações acima, estou realmente usando isso ou apenas usando UDP? É um pouco opaco para mim se o gstreamer cuida disso ou não.
Eu apreciaria qualquer resposta para até uma dessas perguntas!
|
cria qualquer problema nesse contexto é uma peça incrível da BS. Você já tentou algumraspivid | cvlc
método? Eu não tenho a câmera há muito tempo ou muito tempo para brincar com ela, mas usá-la para produzir um fluxo http (visível no linux na outra extremidade comvlc
) parece funcionar bem.cat file | grep ...
vez degrep ... file
. O canal adiciona outra camada de cópia de e para o kernel, que é facilmente mensurável, especialmente em dispositivos com pouca largura de banda de memória. Se o gstreamer pode ler diretamente do arquivo do dispositivo, por que não usá-lo? Com relação à suaraspivid | cvlc
sugestão: eu estava usando isso antes de mudar para a solução baseada no gstreamer, ela tem até 3 segundos a mais de latência do que o gstreamer (não sei por quê).cvlc
usa ~ 45%, mas apenas passar por um tubo com essa taxa de dados (lembrando novamente, o tubo não está diminuindo sua velocidade ) mal moveria a agulha, eu acho. Como <5%. Não é totalmente insignificante, se você quiser fazer isso de forma tão eficiente quanto possível, é claro ...raspivid | cvlc
único e isso é 40-50%. As pessoas podem responder melhor a uma pergunta que as desafia a melhorar uma figura específica. No momento, você está perguntando muito por que, sem explicar por que cada um é significativo.Respostas:
As opções:
raspivid -t 0 -o - | nc -k -l 1234
raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264
cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'
raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234
gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=SERVER_IP port=1234
uv4l --driver raspicam
picam --alsadev hw:1,0
Coisas a considerar
top -d 10
)Comparação:
fonte
?
"?A única maneira moderna de transmitir o H264 para um navegador é com UV4L : sem latência, sem configuração, com áudio opcional, áudio / vídeo bidirecional opcional. Sem molho GStreamer mágico, ainda é possível estender seu uso.
fonte
uv4l
? Meu pipeline de gstreamer parece bastante desatualizado agora! Mal posso esperar para testar como está a latência!1.) h264es transmitido pela rede (apenas amostra)
no servidor:
no cliente:
2.) mjpeg transmitido pela rede (apenas amostra)
no servidor:
no cliente:
tudo isso funciona mesmo em um RPi Zero W (configurado como servidor)
fonte
sample only
significa?