No haremos una larga parte introductoria, iremos directamente al grano.
Entonces, hay una cámara estéreo que puede entregar video H264 a través de varios protocolos. Hay gafas Oculus Go. ¿Cómo ver una transmisión estéreo en vivo desde una cámara con gafas VR? Es deseable, con un retraso mínimo y local, para que Youtube y otros servicios de video RTMP desaparezcan.
Mirando hacia adelante, eso es lo que pasó. Al principio: reproducción de un archivo de video previamente grabado desde estéreo, luego reproducción de una transmisión en vivo con StereoPi (MPEG-TS a través de UDP).
La cámara estéreo que uso es StereoPi, por lo que daré ejemplos específicos en relación con ella. De hecho, esta es una frambuesa ordinaria, pero con dos cámaras, por lo que los ejemplos descritos se pueden probar en frambuesas comunes, si realmente lo desea. Es cierto que necesitará instalar el firmware de StereoPi.
En primer lugar, hubo un intento de crear una aplicación de Android normal que reproduzca la transmisión desde la cámara a pantalla completa, y llenarla en el oculus con el método de carga lateral (a través de adb).
Después de buscar con el manifiesto, las gafas acordaron considerar esta aplicación nativa. Apareció en "Fuentes desconocidas" en la biblioteca, se inició, mostró todo lo que se necesitaba, pero había un problema: los movimientos de la cabeza no se tenían en cuenta, el video de la cámara simplemente se mostraba estúpidamente en pantalla completa con gafas. El efecto estéreo fue, sí, pero tan pronto como mueves un poco la cabeza, el Moscovita comienza a volverse loco, lo que causó una sensación muy, muy incómoda.
Si es así, aquí está la aplicación
.apk :
StereoPi para Oculus Go Al mismo tiempo en el archivo y en las mentiras adb, para que pueda intentar llenar los lentes de inmediato. Solo mando
adb install StereoPi.apk
Después de eso, vaya a la Biblioteca -> Fuentes desconocidas, la aplicación com.virt2real.stereopi debería aparecer allí

Lo iniciamos y si StereoPi está en la misma red de área local que los anteojos, inmediatamente vemos la imagen estéreo de la cámara.
Pero esto es basura ... Quiero una aplicación nativa normal para el oculus para ver el video. Para que hubiera una pantalla inmóvil y para no asaltar al mover la cabeza. Todavía no estoy listo para aprender Unity para el oculus, así que tuve la idea de intentar usar las aplicaciones del reproductor de video que ya están en la tienda Oculus. Por lo general, veo películas en 3D en
Skybox , así que intenté usarlo.
Además de la visualización habitual de archivos multimedia desde la unidad flash incorporada y desde dispositivos de red, se encontró un elemento interesante de "Airscreen" en Skybox. Resultó que puede instalar la aplicación Skybox en una computadora con Windows (bueno, o en una Mac), alimentarlo con archivos de video y luego es posible ver estos archivos de video con gafas. Es decir La aplicación de Windows es un servidor de video y gafas, un cliente. No encontré el protocolo de comunicación en ninguna parte, así que tuve que descubrir tcpdump.
Después de una breve excavación, resultó que Skybox usa mensajes de difusión UDP para buscar un servidor en LAN. El mensaje se ve así:
{"command":"search","project":"direwolf","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceType":"vr","udpPort":"6881"}
Todos los mensajes en JSON son muy convenientes.
Para este mensaje, debemos enviar una respuesta al host y al puerto del remitente especificados en el mensaje, es decir, 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}
Aquí indicamos nuestro host y puerto en el que tenemos el servidor WebSockets ejecutándose. Toda comunicación posterior se realizará a través de websockets.
Por ejemplo, el primer mensaje a través de los sockets web será algo como esto:
{"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true}
Nosotros le respondemos:
{"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true}
Y después de eso, en el Skybox con gafas veremos nuestro StereoPi. A continuación habrá un montón de solicitudes para las cuales debe enviar respuestas. Contenido de la lista de reproducción, por ejemplo.
Ejemplo de lista de reproducción para Skybox[{id: 'livestream-rtsp',
nombre: 'Live Stream RTSP',
duración: 0,
tamaño: 0,
url: 'rtsp: //192.168.1.51: 554 / h264',
miniatura: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailWidth: 186,
thumbnailHeight: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
ancho: 1280,
altura: 720,
orientDegree: '0',
subtítulos: [],
ratioTypeFor2DScreen: 'predeterminado',
rotacionFor2DScreen: 0,
existe: verdadero
isBadMedia: falso,
AddedTime: 1},
{id: 'livestream-mpegts',
nombre: 'Live Stream MPEG-TS',
duración: 0,
tamaño: 0,
url: 'udp: // @: 3001',
miniatura: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailWidth: 186,
thumbnailHeight: 120,
lastModified: 1,
defaultVRSetting: 1,
userVRSetting: 2,
ancho: 1280,
altura: 720,
orientDegree: '0',
subtítulos: [],
ratioTypeFor2DScreen: 'predeterminado',
rotacionFor2DScreen: 0,
existe: verdadero
isBadMedia: falso,
addTime: 1}]
Esto es especialmente interesante ya que En la lista de reproducción que forma la aplicación de Windows, se descubrió la codiciada abreviatura RTSP. Resultó que la aplicación del servidor transmite archivos de video a través de RTSP, que ya es adecuado para la transmisión de video en vivo, que, por supuesto, necesitamos. Más precisamente, resultó que hay "RTSP" en la lista de reproducción, pero los enlaces a los archivos de video son http regulares. Es decir la aplicación del servidor aún envía archivos a través de HTTP, pero esto no nos conviene. En este punto, ya estaba molesto, pero pensé, ¿por qué no intentar dar un enlace en la lista de reproducción en un formato en el que VLC generalmente entiende, es decir? rtsp: //192.168.1.51: 554 / h264 Y saludos, Skybox comenzó a reproducir la transmisión de video desde el servidor RTSP en el estéreo. La demora es muy grande, 20 segundos, por lo que sigue. Estamos tratando de alimentar el flujo UDP a MPEG-TS. Una vez más, VLC generalmente come esto usando el enlace udp: // @: 3001, para Skybox intenté especificarlo de la misma manera. Entonces solo queda dirigir la secuencia MPEG-TS al host de gafas y al puerto UDP especificado. GStreamer está involucrado en esto:
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
En el skybox, hacemos clic en el elemento de la lista de reproducción “Live Stream MPEG-TS” y listo, vemos una transmisión en vivo de MPEG-TS en la pantalla grande en un cine virtual. El retraso es mucho menor que con RTSP, 2-3 segundos, pero aún mucho más que en mi aplicación simple que recibe un flujo de H264 sin procesar a través de UDP (generalmente hay un retraso de 100-150 ms a una resolución de 720p).
Luego me encontré con un callejón sin salida, hasta ahora no he logrado reducir el retraso. Tal vez necesite deshabilitar el almacenamiento en búfer en el propio Skybox, intentaré escribir a los desarrolladores, tal vez hagan la opción "Deshabilitar almacenamiento en búfer" :-)
En conclusión
En general, si de repente por alguna razón necesitaras ver una transmisión de video en vivo en el oculi u otras gafas de realidad virtual (Skybox está disponible en muchas plataformas como), puedes probar el método que describí. No sé si esto funcionará con otras cámaras estéreo, pero con StereoPi está marcado, funciona.
Referencias
Fuente del servidor para skyboxTema del foro con discusiónGracias a todos, todos son libres.
Oh sí, casi lo olvido. Si de repente alguien puede ayudar con la aplicación nativa para el oculus (para que se vea como Skybox), escriba una carta personal, discutiremos los detalles.