0

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

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

到目前为止,我已经设法获取了 cam 的 MJPEG 流并将其作为 JPEG 提供,而不是使用 NodeJS 服务器。然后通过该WWW.LoadImageIntoTexture方法渲染 JPEG。正如您可能想象的那样,每帧的 GET 请求非常慢,大约每秒 0.5 帧。

我的一位同事向我指出 WebRTC 和 Janus 网关是一种更优雅的解决方案。这个简单的对等聊天使用 SocketIO,并且与我的网络摄像头配合得很好,但我不知道如何更改此代码以使用来自 PIXPRO 而不是我的本地设备的视频流。渲染内容也应该很有趣,因为您需要一个用于 WebRTC 的浏览器,而我不确定其中有多少可以嵌入到 Unity3d 中。

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

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

更新

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

4

1 回答 1

1

我终于设法完成了。二进制文件必须加载到缓冲区中并作为 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 插件。使用适用于 Unity 的 Cardboard SDK 为我提供了一种解决方法,让我再次获得相当流畅的相机控制。

于 2015-04-26T12:01:22.310 回答