将wifi接入点摄像头流式传输到远程计算机

时间:2015-04-23 17:42:42

标签: unity3d webrtc mjpeg janus-gateway

在花了几周的时间搜索论坛并尝试不同的方法后,我没有找到解决我特定问题的方法。我很感谢你提供的每一个提示。

我购买了一台Kodak Pixpro 360相机,它通过wifi提供取景器功能(即实时视频流)。现在我正在尝试使用这款相机作为监控摄像头,可以从任何地方(不仅仅是本地网络)访问。 ODROID将通过wifi连接到摄像头,并使用第二个wifi加密狗连接到LAN。传入的视频流应该实时转发给客户端(一次只能有一个)。然后,在Unity3d中编写的应用程序中查看收到的360度内容。

到目前为止,我已经设法抓住了凸轮的MJPEG流,并将其作为未使用NodeJS服务器的JPEG服务。然后通过WWW.LoadImageIntoTexture方法呈现JPEG。正如您可能想象的那样,每帧的GET请求非常慢,每秒大约0.5帧。

我的一位同事向我指出WebRTC和Janus网关是一个更优雅的解决方案。 This simple peer chat使用SocketIO并且我的网络摄像头工作正常,但我无法弄清楚如何更改此代码以使用来自PIXPRO的视频流而不是我的本地设备。渲染内容也应该很有趣,因为您需要一个WebRTC浏览器,我不确定Unity3d中可以嵌入多少内容。

不幸的是,相机本身无法连接到LAN,而是充当wifi接入点。这使得我为ip cams找到的所有解决方案都已过时。

我找到了一个类似的项目,设法通过Janus和WebRTC转发他们的视频流,但我不确定我是否以及如何应用他们的方法。 https://babyis60.wordpress.com/2015/02/04/the-jumping-janus/

更新

好的,我自己设法缩小了我的问题范围。 PIXPRO没有RTP支持,所以我坚持使用JPEG Stream。现在我正在尝试加速paparazzo.js实现,该实现读取摄像机的TCP响应并通过搜索帧之间的边界返回JPEG。然后通过http响应提供这些JPEG。我想通过使用SocketIO将这些帧推送到客户端并在那里呈现它们来加速这个过程。 奇怪的是,服务端的数据似乎很好(当我通过fs.writeFileSync('testimage.jpg', buffer, 'binary');导出时,我得到一个有效的JPEG图像,但是在发送图像后我无法在客户端工作通过io.sockets.emit("stream",{image: image});。当我尝试通过$("#video").attr("src", "data:image/jpeg;," + data.image);在浏览器中显示此图像时,图像不会被正确解析。检查员会显示视频源已更新,但只有二进制字符串。< / p>

1 个答案:

答案 0 :(得分:1)

我终于成功完成了它。必须将二进制文件加载到Buffer中并作为base64字符串发送。

paparazzo.on("update", (function(_this) {
    return function(image) {
      updatedImage = image;

      var vals = new Buffer(image, 'binary');
      //fs.writeFileSync('testimage.jpg', vals, 'binary');
      io.sockets.emit("image",vals.toString('base64'));
      return console.log("Downloaded " + image.length + " bytes");
    };
  })(this));

在客户端,我不得不使用图片标签,因为画布解决方案对我来说似乎不起作用。

var image = document.getElementById('image');

socket.on("image", function(info) {

    image.src = 'data:image/jpeg;base64,' + info;

});

浏览器输出只是实际Unity3D实现之前的测试。我为Unity3D尝试了很多Websocket库,但是唯一一个在Android设备上工作的是UnitySocketIO-WebsocketSharp项目。 现在我可以简单地将base64图像转换为字节数组并将其加载到Texture2D中。

socket.On("image", (data) => {
        bytes = Convert.FromBase64String (data.Json.args.GetValue(0).ToString());
});

void Update () {
    tex.LoadImage (bytes);
}

LoadImage似乎阻止了UI威胁,这会降低我的相机控制脚本的速度,所以我将不得不看看可以在较低级别重写纹理像素的Unity插件。使用Cardboard SDK for Unity为我提供了一种解决方案,可以再次获得非常流畅的相机控制。