Nous ne ferons pas une longue partie introductive, nous irons droit au but.
Il existe donc une caméra stéréo qui peut diffuser de la vidéo H264 via divers protocoles. Il y a des lunettes Oculus Go. Comment regarder un flux stéréo en direct à partir d'une caméra dans des lunettes VR? Il est souhaitable, avec un minimum de retard et localement, que Youtube et les autres services vidéo RTMP disparaissent.
Pour l'avenir, c'est ce qui s'est passé. Au début - lecture d'un fichier vidéo précédemment enregistré en stéréo, puis lecture d'un flux en direct avec StereoPi (MPEG-TS via UDP).
La caméra stéréo que j'utilise est StereoPi, je vais donc donner des exemples spécifiques à ce sujet. En fait, c'est une framboise ordinaire, mais avec deux caméras, donc les exemples décrits peuvent être essayés sur des framboises ordinaires, si vous le voulez vraiment. Certes, vous devrez installer le firmware depuis StereoPi.
La première chose a été de tenter de créer une application Android régulière qui lit le flux de la caméra en plein écran et de le remplir dans l'oculus avec la méthode de chargement latéral (via adb).
Après quelques cueillettes avec le manifeste, les verres ont accepté de considérer cette application comme native. Il est apparu dans les «Sources inconnues» de la bibliothèque, a démarré, a montré tout ce qui était nécessaire, mais il y avait un problème - les mouvements de la tête n'étaient pas pris en compte, la vidéo de la caméra était simplement stupidement affichée en plein écran avec des lunettes. L'effet stéréo était oui, mais dès que vous bougiez un peu la tête, le Moscovite commençait à devenir fou, ce qui provoquait une sensation très, très inconfortable.
Si c'est le cas, voici l'application .apk:
StereoPi pour Oculus Go En même temps dans les archives et adb se trouve, vous pouvez donc immédiatement essayer de remplir les verres. Commande juste
adb install StereoPi.apk
Après cela, allez dans Bibliothèque -> Sources inconnues, l'application com.virt2real.stereopi devrait y apparaître

Nous le démarrons et si StereoPi est dans le même réseau local que les lunettes, nous voyons immédiatement l'image stéréo de la caméra.
Mais ce sont des ordures ... Je veux une application native normale pour l'oculus pour regarder la vidéo. Pour qu'il y ait un écran immobile et pour ne pas prendre d'assaut en bougeant la tête. Je ne suis pas encore prêt à apprendre Unity pour l'oculus, j'ai donc eu l'idée d'essayer d'utiliser les applications du lecteur vidéo déjà dans la boutique Oculus. Je regarde généralement des films 3D dans
Skybox , j'ai donc essayé de l'utiliser.
En plus de la visualisation habituelle des fichiers multimédias à partir du lecteur flash intégré et des périphériques réseau, un élément intéressant "Airscreen" a été trouvé dans Skybox. Il s'est avéré que vous pouvez installer l'application Skybox sur un ordinateur avec Windows (enfin, ou sur un Mac), lui nourrir des fichiers vidéo puis il devient possible de regarder ces fichiers vidéo avec des lunettes. C'est-à-dire L'application Windows est un serveur vidéo et des lunettes - un client. Je n'ai trouvé le protocole de communication nulle part, j'ai donc dû découvrir tcpdump.
Après une courte fouille, il s'est avéré que Skybox utilise des messages de diffusion UDP pour rechercher un serveur dans le LAN. Le message ressemble à ceci:
{"command":"search","project":"direwolf","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceType":"vr","udpPort":"6881"}
Tous les messages en JSON sont très pratiques.
À ce message, nous devons envoyer une réponse à l'hôte et au port de l'expéditeur spécifiés dans le message, c'est-à-dire 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}
Ici, nous indiquons notre hôte et le port sur lequel nous avons le serveur WebSockets en cours d'exécution. Toute communication ultérieure passera par des sockets Web.
Par exemple, le premier message via les sockets Web ressemblera à ceci:
{"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true}
Nous y répondons:
{"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true}
Et après cela, dans la Skybox avec des lunettes, nous verrons notre StereoPi. Ensuite, il y aura un tas de demandes pour lesquelles vous devez envoyer des réponses. Le contenu de la playlist, par exemple.
Exemple de liste de lecture pour Skybox[{id: 'livestream-rtsp',
nom: «Live Stream RTSP»,
durée: 0,
taille: 0,
url: «rtsp: //192.168.1.51: 554 / h264»,
miniature: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailLargeur: 186,
thumbnailHauteur: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
largeur: 1280,
hauteur: 720,
orientDegree: '0',
sous-titres: [],
ratioTypeFor2DScreen: 'par défaut',
rotationFor2DScreen: 0,
existe: vrai
isBadMedia: faux,
addedTime: 1},
{id: 'livestream-mpegts',
nom: «Live Stream MPEG-TS»,
durée: 0,
taille: 0,
url: 'udp: // @: 3001',
miniature: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailLargeur: 186,
thumbnailHauteur: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
largeur: 1280,
hauteur: 720,
orientDegree: '0',
sous-titres: [],
ratioTypeFor2DScreen: 'par défaut',
rotationFor2DScreen: 0,
existe: vrai
isBadMedia: faux,
addedTime: 1}]
Ceci est particulièrement intéressant car dans la playlist qui forme l'application Windows, l'abréviation convoitée RTSP a été découverte. Il s'est avéré que l'application serveur diffuse des fichiers vidéo via RTSP, qui est déjà adapté au streaming vidéo en direct, dont nous avons bien sûr besoin. Plus précisément, il s'est avéré qu'il y avait «RTSP» dans la liste de lecture, mais les liens vers les fichiers vidéo sont des http réguliers. C'est-à-dire l'application serveur envoie toujours des fichiers via HTTP, mais cela ne nous convient pas. À ce stade, j'étais déjà bouleversé, mais je me suis dit, pourquoi ne pas essayer de donner un lien dans la liste de lecture dans un format que VLC comprend habituellement, c'est-à-dire rtsp: //192.168.1.51: 554 / h264 Et bravo, Skybox a commencé à lire le flux vidéo du serveur RTSP sur la chaîne stéréo. Le retard est très important, 20 secondes, donc on continue. Nous essayons d'alimenter le flux UDP en MPEG-TS. Encore une fois, VLC mange généralement cela en utilisant le lien udp: // @: 3001, pour Skybox, j'ai essayé de spécifier la même manière. Il ne reste alors plus qu'à diriger le flux MPEG-TS vers l'hôte de lunettes et le port UDP spécifié. GStreamer est impliqué pour cela:
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
Dans la skybox, nous cliquons sur l'élément de playlist «Live Stream MPEG-TS» et le tour est joué, nous voyons un flux MPEG-TS en direct sur grand écran dans un cinéma virtuel. Le retard est beaucoup moins qu'avec RTSP, 2-3 secondes, mais toujours beaucoup plus que dans ma simple application qui reçoit un flux H264 brut sur UDP (il y a généralement un retard de 100-150 ms à une résolution de 720p).
Ensuite, je suis tombé dans une impasse, jusqu'à présent je n'ai pas réussi à réduire le retard. Peut-être que vous devez désactiver la mise en mémoire tampon dans Skybox lui-même, je vais essayer d'écrire aux développeurs, peut-être qu'ils feront l'option "Désactiver la mise en mémoire tampon" :-)
En conclusion
En général, si soudainement, pour une raison quelconque, vous aviez soudainement besoin de regarder un flux vidéo en direct dans les oculi ou d'autres lunettes VR (Skybox est disponible sur de nombreuses plateformes comme) - vous pouvez essayer la méthode que j'ai décrite. Je ne sais pas si cela fonctionnera avec d'autres caméras stéréo, mais avec StereoPi c'est vérifié, ça laboure.
Les références
Source serveur pour skyboxFil de discussion avec discussionMerci à tous, tout le monde est libre.
Oh oui, j'ai presque oublié. Si tout à coup quelqu'un peut aider avec l'application native pour l'oculus (pour qu'elle ressemble à Skybox) - écrivez dans un message personnel, nous discuterons des détails.