Fluxo de desktop de baixa latência para Raspberry Pi usando decodificação de hardware

Não impressionado com a lentidão do raspberry pi no HTML5, comecei a tentar aproveitar a CPU de outro PC (estação de trabalho ou VPS) para lidar com o processamento do navegador e, em seguida, transmitir a área de trabalho para o Pi usando a decodificação de hardware H264.

Inspirado por este receptor Citrix acelerado por hardware, comecei um experimento de prova de conceito para ver se seria viável utilizar a decodificação de hardware de GPU para melhorar o desempenho de aplicativos de controle remoto como X2GO, NX, VNC, RDesktop, etc.

O resultado depois de muitos ajustes é bastante impressionante. Rodar um vídeo do youtube no PC e vê-lo transmitido pela LAN para o Pi foi suave e de baixa latência (<250ms) e usou cerca de 30% da CPU.
Não é o controle remoto do PC, é apenas um fluxo unilateral, mas acho que há um potencial definitivo em obter um dos aplicativos atuais (muito bem agrupados aqui ) para utilizar a decodificação de hardware para um cliente fino Pi melhor.

As desvantagens …

  • Não consegui transmitir em desktop muito maior do que 1024×768. Não sei por quê.
  • Pi tem que usar gstreamer1.0 para decodificar por hardware (ffmpeg não tem um plugin para Pi openmax GPU)

Veja como eu fiz

Certifique-se de que o Pi está atualizado e use a imagem do sistema operacional Raspian mais recente.
Instale gstreamer1.0 pré-compilado usando estas instruções

Defina o pi para ouvir o fluxo de entrada da área de trabalho:

gst-launch-1.0 -v udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! h264parse ! omxh264dec ! videoconvert ! autovideosink sync=false

Ele usa o decodificador openmax para reproduzir vídeo codificado em H264 enviado usando o protocolo em tempo real sobre UDP.
Em teoria, você pode usar o TS em vez do RTP, mas não consegui fazer o TS funcionar.
Consegui um fluxo MJPEG funcionando em HTTP usando omxmjpegdec, mas a CPU aumentou cerca de 50% e a imagem não escalou tão bem quanto H264.

Agora use o ffmpeg para transmitir a área de trabalho do PC:

ffmpeg -f x11grab -show_region 1 -s 1024x768 -r 25 -i :0.0+10,10 -vcodec libx264 -preset ultrafast -tune zerolatency -f rtp rtp://192.168.0.11:5000

Este usa x11grab (apenas linux com medo, desculpe os fãs de Mac / Windows) para capturar a parte de 1024×768 da área de trabalho (10 pixels no canto), o software codifica com h264, mux em RTP e envia usando UDP para pi.
As opções de predefinição e sintonia tornam a latência baixa.

Eu também fiz isso funcionar usando VLC, mas era muito lento.
Eu tentei e falhei em fazer funcionar usando gstreamer ximagesrc

Dicas:

  • Se ssh’d to pi primeiro execute ‘export DISPLAY =: 0’ antes de executar o gstreamer
  • gstreamer pode ter uma lista de opções aparentemente infinita e confusa. Essa matriz torna muito mais fácil entender as opções de streaming compatíveis.
  • Use gst-inspect-1.0 para ver quais outros plug-ins estão instalados.
  • Lembre-se de alterar o endereço IP para o do seu pi