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 skyboxTópico no fórum com discussãoObrigado 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.