将立体声视频实时流传输到VR眼镜(Oculus Go)

我们将不做冗长的介绍,我们将直截了当。

因此,有一个立体摄像机可以通过各种协议传送H264视频。 有Oculus Go眼镜。 如何在VR眼镜中从相机观看立体声实时流? 希望在本地延迟最小的情况下使Youtube和其他RTMP视频服务消失。

展望未来,这就是发生的事情。 首先-从立体声播放以前录制的视频文件,然后使用StereoPi(通过UDP进行MPEG-TS)播放实时流。


我使用的立体声相机是StereoPi,因此我将给出具体的示例。 实际上,这是一个普通的树莓,但是有两个摄像头,因此,如果您愿意,可以在普通的树莓上尝试上述示例。 是的,您需要从StereoPi安装固件。
第一件事是尝试制作一个常规的Android应用程序,该应用程序可以播放从摄像机到全屏的流,并使用sideload方法(通过adb)将其填充到oculus中。

在对清单进行一些挑选之后,眼镜商同意考虑将此应用程序本机化。 它出现在库中的“未知来源”中,开始显示所需的所有内容,但是存在一个问题-头部运动没有考虑在内,来自摄像机的视频只是愚蠢地戴着眼镜全屏显示。 是的,立体声效果不错,但是只要稍微移动一下头,白云母就会发疯,从而给人带来非常非常不舒服的感觉。

如果是的话,这是.apk应用程序: 适用于Oculus Go的StereoPi同时存在于存档和adb中,因此您可以立即尝试填充眼镜。 只是命令

adb install StereoPi.apk 

之后,转到“库”->“未知来源”,应用程序com.virt2real.stereopi应该出现在此处



我们启动它,如果StereoPi与眼镜在同一局域网中,我们将立即从相机中看到立体图像。

但这是垃圾。我希望oculus可以使用正常的本机应用程序观看视频。 这样就形成了一个静止的屏幕,并且在移动头部时不会打乱。 我还没准备好为oculus学习Unity,所以我有了一个尝试使用Oculus商店中已有的视频播放器应用程序的想法。 我通常在Skybox中观看3D电影,所以我尝试使用它。

除了通常查看内置闪存驱动器和网络设备中的媒体文件外,在Skybox中还发现了一个有趣的“ Airscreen”项。 事实证明,您可以将Skybox应用程序安装在装有Windows的计算机上(或者,或者在Mac上),向他提供视频文件,然后可以戴眼镜观看这些视频文件。 即 Windows应用程序是视频服务器,而眼镜是客户端。 我在任何地方都找不到通信协议,因此不得不揭露tcpdump。

经过一番挖掘,结果发现Skybox使用UDP广播消息在LAN中搜索服务器。 该消息看起来像这样:

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


JSON中的所有消息都非常方便。

对于此消息,我们需要向消息中指定的发件人的主机和端口发送响应,即 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} 

在这里,我们指示运行WebSockets服务器的主机和端口。 所有进一步的通信将通过websockets进行。

例如,通过Web套接字发送的第一条消息将如下所示:

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

我们回答:

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

之后,在戴着眼镜的Skybox中,我们将看到StereoPi。 接下来是一堆您需要发送答案的请求。 例如,播放列表内容。

Skybox的播放列表示例
[{id:'livestream-rtsp',
名称:“实时流RTSP”,
持续时间:0,
大小:0,
网址:“ rtsp://192.168.1.51:554 / h264”,
缩略图:“ http://192.168.1.51/thumbnail/livestream.png”,
thumbnailWidth:186,
thumbnailHeight:120,
lastModified:1,
defaultVRSetting:1,
userVRSetting:2,
宽度:1280,
高度:720,
orientDegree:“ 0”,
字幕:[],
ratioTypeFor2DScreen:'默认',
rotationFor2DScreen:0,
存在:真实
isBadMedia:否,
addTime:1},
{id:“ livestream-mp​​egts”,
名称:“实时流MPEG-TS”,
持续时间:0,
大小:0,
url:'udp:// @:3001',
缩略图:“ http://192.168.1.51/thumbnail/livestream.png”,
thumbnailWidth:186,
thumbnailHeight:120,
lastModified:1,
defaultVRSetting:1,
userVRSetting:2,
宽度:1280,
高度:720,
orientDegree:“ 0”,
字幕:[],
ratioTypeFor2DScreen:'默认',
rotationFor2DScreen:0,
存在:真实
isBadMedia:否,
addTime:1}]

这特别有趣,因为 在构成Windows应用程序的播放列表中,发现了梦co以求的缩写RTSP。 事实证明,服务器应用程序通过RTSP传输视频文件,这当然已经适合我们当然需要的实时视频流。 更确切地说,事实证明播放列表中有“ RTSP”,但是视频文件的链接是常规的http。 即 服务器应用程序仍通过HTTP发送文件,但这不适合我们。 在这一点上,我已经很沮丧,但是我想,为什么不尝试以VLC通常可以理解的格式在播放列表中提供链接? rtsp://192.168.1.51:554 / h264欢呼雀跃,Skybox开始以立体声播放来自RTSP服务器的视频流。 延迟非常大,为20秒,因此请继续。 我们正在尝试将UDP流提供给MPEG-TS。 同样,VLC通常使用链接udp:// @:3001来吃东西,对于Skybox,我尝试指定相同的方式。 然后,仅将MPEG-TS流定向到眼镜主机和指定的UDP端口即可。 GStreamer为此涉及:

 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 

在天空盒中,我们单击“实时流MPEG-TS”播放列表元素,瞧,我们在虚拟电影院的大屏幕上看到了实时MPEG-TS流。 延迟远比RTSP少2-3秒,但比我在UDP上接收原始H264流的简单应用程序要大得多(在720p分辨率下通常有100-150 ms的延迟)。

然后我陷入了僵局,到目前为止,我还没有成功地减少延迟。 也许您需要在Skybox本身中禁用缓冲,我会尝试写给开发人员,也许他们会选择“禁用缓冲” :-)

总结


通常,如果突然由于某种原因突然需要在oculi或其他VR眼镜中观看实时视频流(Skybox在许多平台上都可用)-您可以尝试我描述的方法。 我不知道这是否可以与其他立体相机一起使用,但是使用StereoPi时,它会被检查并耕作。

参考文献


Skybox的服务器源
论坛讨论话题

谢谢大家,大家有空。

哦,是的,我差点忘了。 如果突然有人可以为oculus的本机应用程序提供帮助(看起来像Skybox),请写一封私人信件,我们将讨论详细信息。

Source: https://habr.com/ru/post/zh-CN451878/


All Articles