Wir werden keinen langen Einführungsteil machen, wir werden direkt zum Punkt kommen.
Es gibt also eine Stereokamera, die H264-Video über verschiedene Protokolle liefern kann. Es gibt Gläser Oculus Go. Wie kann man einen Stereo-Live-Stream von einer Kamera in einer VR-Brille sehen? Es ist wünschenswert, mit einer minimalen Verzögerung und lokal, damit Youtube und andere RTMP-Videodienste verschwinden.
Mit Blick auf die Zukunft ist genau das passiert. Zu Beginn - Wiedergabe einer zuvor aufgenommenen Videodatei aus Stereo, dann Wiedergabe eines Live-Streams mit StereoPi (MPEG-TS über UDP).
Die von mir verwendete Stereokamera ist StereoPi, daher werde ich diesbezüglich konkrete Beispiele nennen. In der Tat ist dies eine gewöhnliche Himbeere, aber mit zwei Kameras, so dass die beschriebenen Beispiele an gewöhnlichen Himbeeren probiert werden können, wenn Sie wirklich wollen. Richtig, Sie müssen die Firmware von StereoPi installieren.
Das erste war der Versuch, eine reguläre Android-Anwendung zu erstellen, die den Stream von der Kamera auf den Vollbildmodus abspielt und ihn mit der Seitenlademethode (über adb) in das Okulus füllt.
Nach einigem Hin und Her mit dem Manifest stimmten die Brillen zu, diese Anwendung als nativ zu betrachten. Es erschien in den "Unbekannten Quellen" in der Bibliothek, startete, zeigte alles, was benötigt wurde, aber es gab ein Problem - Kopfbewegungen wurden nicht berücksichtigt, das Video von der Kamera wurde einfach dumm im Vollbildmodus mit Brille angezeigt. Der Stereoeffekt war, ja, aber sobald Sie Ihren Kopf ein wenig bewegen, wird der Moskauer verrückt, was ein sehr, sehr unangenehmes Gefühl verursachte.
In diesem Fall ist hier die .apk-Anwendung:
StereoPi für Oculus Go Zur gleichen Zeit im Archiv und adb liegt, sodass Sie sofort versuchen können, die Brille auszufüllen. Befehl einfach
adb install StereoPi.apk
Gehen Sie danach zu Bibliothek -> Unbekannte Quellen. Dort sollte die Anwendung com.virt2real.stereopi angezeigt werden

Wir starten es und wenn sich StereoPi im selben lokalen Netzwerk wie die Brille befindet, sehen wir sofort das Stereobild von der Kamera.
Aber das ist Müll ... Ich möchte, dass eine normale native Anwendung für das Oculus das Video ansieht. Damit es einen bewegungslosen Bildschirm gab und um nicht zu stürmen, wenn Sie Ihren Kopf bewegen. Ich bin noch nicht bereit, Unity für das Oculus zu lernen, daher kam mir die Idee, die bereits im Oculus Store vorhandenen Video-Player-Anwendungen zu verwenden. Normalerweise
schaue ich 3D-Filme in
Skybox , also habe ich versucht, sie zu verwenden.
Neben der üblichen Anzeige von Mediendateien vom eingebauten Flash-Laufwerk und von Netzwerkgeräten wurde in Skybox ein interessantes Element „Airscreen“ gefunden. Es stellte sich heraus, dass Sie die Skybox-Anwendung auf einem Computer mit Windows (also auf einem Mac) installieren, ihm Videodateien zuführen und diese Videodateien dann mit einer Brille ansehen können. Das heißt, Die Windows-Anwendung ist ein Videoserver und eine Brille - ein Client. Ich habe das Kommunikationsprotokoll nirgendwo gefunden, also musste ich tcpdump aufdecken.
Nach einer kurzen Ausgrabung stellte sich heraus, dass Skybox UDP-Broadcast-Nachrichten verwendet, um nach einem Server im LAN zu suchen. Die Nachricht sieht ungefähr so aus:
{"command":"search","project":"direwolf","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceType":"vr","udpPort":"6881"}
Alle Nachrichten in JSON sind sehr praktisch.
Auf diese Nachricht müssen wir eine Antwort an den in der Nachricht angegebenen Host und Port des Absenders senden, d. H. 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}
Hier geben wir unseren Host und Port an, auf dem der WebSockets-Server ausgeführt wird. Die gesamte weitere Kommunikation erfolgt über Websockets.
Die erste Nachricht über Web-Sockets lautet beispielsweise wie folgt:
{"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true}
Wir antworten darauf:
{"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true}
Und danach sehen wir in der Skybox mit Brille unser StereoPi. Als nächstes folgen eine Reihe von Anfragen, für die Sie Antworten senden müssen. Zum Beispiel Inhalte von Wiedergabelisten.
Playlist-Beispiel für Skybox[{id: 'livestream-rtsp',
Name: 'Live Stream RTSP',
Dauer: 0,
Größe: 0,
URL: 'rtsp: //192.168.1.51: 554 / h264',
Vorschaubild: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailWidth: 186,
thumbnailHeight: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
Breite: 1280,
Höhe: 720,
orientDegree: '0',
Untertitel: [],
ratioTypeFor2DScreen: 'default',
RotationFor2DScreen: 0,
existiert: wahr
isBadMedia: false,
addierte Zeit: 1},
{id: 'livestream-mpegts',
Name: 'Live Stream MPEG-TS',
Dauer: 0,
Größe: 0,
url: 'udp: // @: 3001',
Vorschaubild: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailWidth: 186,
thumbnailHeight: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
Breite: 1280,
Höhe: 720,
orientDegree: '0',
Untertitel: [],
ratioTypeFor2DScreen: 'default',
RotationFor2DScreen: 0,
existiert: wahr
isBadMedia: false,
addierte Zeit: 1}]
Dies ist seitdem besonders interessant In der Wiedergabeliste der Windows-Anwendung wurde die begehrte Abkürzung RTSP entdeckt. Es stellte sich heraus, dass die Serveranwendung Videodateien über RTSP überträgt, was bereits für das Live-Video-Streaming geeignet ist, das wir natürlich benötigen. Genauer gesagt stellte sich heraus, dass die Wiedergabeliste „RTSP“ enthält, die Links zu den Videodateien jedoch regulär http sind. Das heißt, Die Serveranwendung sendet weiterhin Dateien über HTTP, dies passt jedoch nicht zu uns. Zu diesem Zeitpunkt war ich bereits verärgert, aber ich dachte, warum nicht versuchen, einen Link in der Wiedergabeliste in einem Format anzugeben, das VLC normalerweise versteht, d. H. rtsp: //192.168.1.51: 554 / h264 Und Prost, Skybox begann, den Videostream vom RTSP-Server auf der Stereoanlage abzuspielen. Die Verzögerung ist sehr groß, 20 Sekunden. Wir versuchen, den UDP-Stream an MPEG-TS weiterzuleiten. Wiederum isst VLC dies normalerweise über den Link udp: // @: 3001, für Skybox habe ich versucht, den gleichen Weg anzugeben. Dann muss nur noch der MPEG-TS-Stream zum Host der Brille und zum angegebenen UDP-Port geleitet werden. GStreamer ist daran beteiligt:
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
In der Skybox klicken wir auf das Wiedergabelistenelement „Live Stream MPEG-TS“ und voila, wir sehen einen Live MPMP-TS-Stream auf der großen Leinwand in einem virtuellen Kino. Die Verzögerung ist viel geringer als bei RTSP, 2-3 Sekunden, aber immer noch viel größer als bei meiner einfachen Anwendung, die einen rohen H264-Stream über UDP empfängt (normalerweise gibt es eine Verzögerung von 100-150 ms bei einer Auflösung von 720p).
Dann bin ich in eine Sackgasse geraten, bisher ist es mir nicht gelungen, die Verzögerung zu reduzieren. Vielleicht müssen Sie die Pufferung in Skybox selbst deaktivieren, ich werde versuchen, an Entwickler zu schreiben, vielleicht werden sie die Option "Pufferung deaktivieren" wählen :-)
Abschließend
Im Allgemeinen können Sie die von mir beschriebene Methode ausprobieren, wenn Sie plötzlich aus irgendeinem Grund plötzlich einen Live-Videostream im Okuli oder in einer anderen VR-Brille ansehen müssen (Skybox ist auf vielen Plattformen verfügbar). Ich weiß nicht, ob dies mit anderen Stereokameras funktioniert, aber wenn StereoPi aktiviert ist, pflügt es.
Referenzen
Serverquelle für SkyboxForenthread mit DiskussionVielen Dank an alle, jeder ist frei.
Oh ja, ich hätte es fast vergessen. Wenn plötzlich jemand mit der nativen App für das Oculus helfen kann (so dass es wie Skybox aussieht) - schreiben Sie eine persönliche Nachricht, wir werden die Details besprechen.