Transmissão ao vivo de vídeo estéreo para óculos VR (Oculus Go)

Não faremos uma longa parte introdutória, iremos direto ao ponto.

Portanto, há uma câmera estéreo que pode transmitir vídeo H264 através de vários protocolos. Existem óculos Oculus Go. Como assistir a uma transmissão ao vivo estéreo de uma câmera em óculos VR? É desejável, com um atraso mínimo e localmente, para que o YouTube e outros serviços de vídeo RTMP desapareçam.

Olhando para o futuro, foi o que aconteceu. No início - reprodução de um arquivo de vídeo gravado anteriormente em estéreo e, em seguida, reprodução de uma transmissão ao vivo em StereoPi (MPEG-TS via UDP).


A câmera estéreo que eu uso é o StereoPi, por isso darei exemplos específicos em relação a ela. Na verdade, essa é uma framboesa comum, mas com duas câmeras, portanto os exemplos descritos podem ser experimentados em framboesas comuns, se você realmente quiser. É verdade que você precisará instalar o firmware do StereoPi.
A primeira coisa foi uma tentativa de criar um aplicativo Android normal que reproduza o fluxo da câmera para a tela inteira e preencha-o no oculus com o método sideload (via adb).

Depois de escolher o manifesto, os óculos concordaram em considerar esse aplicativo nativo. Ele apareceu em “Fontes desconhecidas” na biblioteca, foi iniciado, mostrava tudo o que era necessário, mas havia um problema - os movimentos da cabeça não eram levados em consideração, o vídeo da câmera era simplesmente estupidamente exibido em tela cheia com óculos. O efeito estéreo foi, sim, mas assim que você move a cabeça um pouco, o moscovita começa a enlouquecer, o que causava uma sensação muito, muito desconfortável.

Nesse caso, aqui está o aplicativo .apk: StereoPi for Oculus Go Ao mesmo tempo, no arquivo e no adb, você pode tentar preencher os copos imediatamente. Apenas comando

adb install StereoPi.apk 

Depois disso, vá para Biblioteca -> Fontes desconhecidas, o aplicativo com.virt2real.stereopi deve aparecer lá



Começamos e, se o StereoPi estiver na mesma rede local que os óculos, vemos imediatamente a imagem estéreo da câmera.

Mas isso é lixo ... Quero um aplicativo nativo normal para o oculus assistir ao vídeo. Para que houvesse uma tela imóvel e para não cair ao mover sua cabeça. Ainda não estou pronto para aprender o Unity para o oculus, então tive uma ideia de tentar usar os aplicativos do player de vídeo já existentes na loja Oculus. Normalmente assisto a filmes em 3D no Skybox , então tentei usá-lo.

Além da visualização usual de arquivos de mídia da unidade flash embutida e de dispositivos de rede, um item interessante "Airscreen" foi encontrado no Skybox. Descobriu-se que você pode instalar o aplicativo Skybox em um computador com Windows (bom ou em um Mac), alimentar arquivos de vídeo e, em seguida, torna-se possível assistir esses arquivos de vídeo com óculos. I.e. Aplicativo do Windows é um servidor de vídeo e óculos - um cliente. Como não encontrei o protocolo de comunicação em nenhum lugar, tive que descobrir o tcpdump.

Após uma breve escavação, descobriu-se que o Skybox usa mensagens de transmissão UDP para procurar um servidor na LAN. A mensagem é mais ou menos assim:

 {"command":"search","project":"direwolf","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceType":"vr","udpPort":"6881"} 


Todas as mensagens em JSON são muito convenientes.

Para esta mensagem, precisamos enviar uma resposta ao host e à porta do remetente especificados na mensagem, ou seja, 6881

 {"udp":true,"project":"direwolf server","command":"searchResult","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","computerId":"53709de962eba2f9695c8a926562486c","computerName":"STEREO-PI","ip":"192.168.1.51","ips":["192.168.1.51"],"port":6888} 

Aqui, indicamos nosso host e porta na qual temos o servidor WebSockets em execução. Toda a comunicação adicional passará por websockets.

Por exemplo, a primeira mensagem via soquetes da Web será algo como isto:

 {"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true} 

Nós respondemos a ele:

 {"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true} 

E depois disso, no Skybox com óculos, veremos o nosso StereoPi. Em seguida, haverá um monte de solicitações para as quais você precisa enviar respostas. Conteúdo da lista de reprodução, por exemplo.

Exemplo de lista de reprodução para Skybox
[{id: 'livestream-rtsp',
nome: 'Live Stream RTSP',
duração: 0,
tamanho: 0,
URL: 'rtsp: //192.168.1.51: 554 / h264',
thumbnail: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailWidth: 186,
thumbnailHeight: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
largura: 1280,
altura: 720,
orientDegree: '0',
legendas: [],
ratioTypeFor2DScreen: 'padrão',
rotationFor2DScreen: 0,
existe: verdadeiro
isBadMedia: false,
addedTime: 1},
{id: 'livestream-mpegts',
nome: 'Transmissão ao vivo MPEG-TS',
duração: 0,
tamanho: 0,
url: 'udp: // @: 3001',
thumbnail: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailWidth: 186,
thumbnailHeight: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
largura: 1280,
altura: 720,
orientDegree: '0',
legendas: [],
ratioTypeFor2DScreen: 'padrão',
rotationFor2DScreen: 0,
existe: verdadeiro
isBadMedia: false,
addedTime: 1}]

Isso é especialmente interessante, pois na lista de reprodução que forma o aplicativo Windows, a abreviada RTSP foi descoberta. Verificou-se que o aplicativo do servidor transmite arquivos de vídeo por meio do RTSP, que já é adequado para transmissão de vídeo ao vivo, que é claro que precisamos. Mais precisamente, verificou-se que há "RTSP" na lista de reprodução, mas os links para os arquivos de vídeo são http regulares. I.e. o aplicativo do servidor ainda envia arquivos via HTTP, mas isso não nos convém. Nesse ponto, eu já estava chateada, mas pensei: por que não tentar dar um link na playlist em um formato que o VLC geralmente entende, ou seja, rtsp: //192.168.1.51: 554 / h264 E aplausos, a Skybox começou a reproduzir o fluxo de vídeo do servidor RTSP no aparelho de som. O atraso é muito grande, 20 segundos, então continue. Estamos tentando alimentar o fluxo UDP para MPEG-TS. Novamente, o VLC geralmente usa isso usando o link udp: // @: 3001, para o Skybox tentei especificar da mesma maneira. Resta apenas direcionar o fluxo MPEG-TS para o host de óculos e a porta UDP especificada. O GStreamer está envolvido para isso:

 raspivid -3d sbs -w 1280 -h 720 -o - | gst-launch-1.0 -q fdsrc ! h264parse ! mpegtsmux alignment=7 name=muxer ! rndbuffersize max=1316 min=1316 ! multiudpsink clients="192.168.1.60:3001" sync=false 

No skybox, clicamos no elemento da lista de reprodução “Live Stream MPEG-TS” e pronto, vemos um fluxo MPEG-TS ao vivo na tela grande de um cinema virtual. O atraso é muito menor do que com o RTSP, de 2 a 3 segundos, mas ainda muito mais do que no meu aplicativo simples que recebe um fluxo H264 bruto sobre o UDP (geralmente há um atraso de 100-150 ms na resolução de 720p).

Então cheguei a um beco sem saída, até agora não consegui reduzir o atraso. Talvez você precise desativar o buffer no próprio Skybox, vou tentar escrever para os desenvolvedores, talvez eles façam a opção "Desativar buffer" :-)

Em conclusão


Em geral, se de repente, por algum motivo, você de repente precisar assistir a uma transmissão de vídeo ao vivo no oculi ou em outros óculos de realidade virtual (o Skybox está disponível em muitas plataformas como) - você pode tentar o método que descrevi. Não sei se isso funcionará com outras câmeras estéreo, mas com o StereoPi está marcado, é suficiente.

Referências


Origem do servidor para skybox
Tópico no fórum com discussão

Obrigado a todos, todos são livres.

Ah sim, eu quase esqueci. Se de repente alguém puder ajudar com o aplicativo nativo do oculus (para que pareça com o Skybox) - escrever em uma mensagem pessoal, discutiremos os detalhes.

Source: https://habr.com/ru/post/pt451878/


All Articles