mrayGStreamerUnity实现对unity的在线视频传输

最近在做Unity和Oculus Rift的开发,需要用到一个把摄像头的视频通过网络传给Oculus的组件。
新的Unity自带了一个videoplayer,但是功能比较有限,能够比较好的播放本地的视频,在线的支持.webm和.vp8。我尝试了用ffmpeg + ffserver (已经不再支持了)还有icecast 2去搭建相应的视频流传输平台都没有成功。
其他的解决方案包括GST Movie Texture(已经不再收到维护,试过用不了),ua-i2cat/gst-unity-bridge(和前面这个是同一个人做的)。现在尝试的成功的方案是用Gstreamer配合mrayGStreamerUnity 实现需求。

mrayGStreamerUnity

这个项目的作者的github上直接提供了编译好的文件,编译我没有做(试过编译,但是发现我的Gstreamer的插件路径好像没有设置对,就放弃了)。3D环境中视频流的播放界面可以是一个Quad(Mesh Filter)。需要把BlitMtrl这个Material拖到Mesh Renderer的Element 0中。此外需要额外加上Gst Custom Texture和Custom Pipeline Player两个Script。Custom Pipeline Player的Target Material需要设置成BlitMtrl。Pipeline需要填入Gstreamer的命令行参数,比如

udpsrc port=5000 ! application/x-rtp, encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec

这里我的传输使用mjpeg做的。Transform的Scale可以设置屏幕比例,如果上下或者左右出现了翻转的情况将对应的比例设置成负数就可以解决了。

另外一边可以新开一个命令行,用命令

gst-launch-1.0 avfvideosrc ! video/x-raw,width=640, height=480 ! timeoverlay ! tee name=“local” ! queue ! autovideosink local. ! queue ! jpegenc ! rtpjpegpay ! udpsink host=127.0.0.1 port=5000

发送视频流。avfvideosrc需要替换成相应的相机设备的参数或者视频流的源,比如v4l2的video device。

这样Unity里的object设置后看起来是这样
mrayGStreamerUnity实现对unity的在线视频传输_第1张图片
这个时候启动Unity的项目,然后用Gstreamer发送视频,视频就通过网络传到界面中了。

如果没有视频流显示,需要检查Windows的防火墙中的设置(控制面板的允许应用通过防火墙以及高级设置中允许unity通过防火墙。Build程序的话要允许EXE通过防火墙)。

你可能感兴趣的:(VR开发)