将实时镜头从摄像机流式传输到 Unity3D

2023-11-26

假设我有一个无线摄像机,我想将其实时流式传输到统一。有办法实现这一点吗?

奖励问题:

  • 广角相机怎么样(180,甚至 360)
  • 如果这是我想要与之交互的镜头,那么延迟会是一个多大的问题
  • 除了常规镜头之外,还可以发送更多数据,例如深度感知(使用深度感知相机)吗?
  • 我疯了还是这已经完成了?

提前致谢


我假设这是一台带有以太网端口或 Wi-Fi 的相机,您可以连接到它并实时传输图像。

如果是这样,那么可以使用 Unity 来完成。

在没有外部库的情况下如何完成:

连接到相机:

1.与相机连接到同一本地网络,或者如果支持unpn,您也可以通过互联网连接到它。通常,您需要摄像机的 IP 和端口来执行此操作。假设摄像机 IP 地址是192.168.1.5端口号是900。要连接的 url 是http://192.168.1.5:900.

有时,它只是一个以以下结尾的网址.mjpg or .bin例如http://192.168.1.5/mjpg/video.mjpg and http://192.168.1.5/mjpg/video.bin

每个相机都是不同的。找到该网址的唯一方法是阅读其手册。如果手册不可用,请使用其官方应用程序连接到它,然后使用 Wireshark 发现相机图像的 url。这usernamepassword(如果需要)也可以在手册中找到。如果没有,请用谷歌搜索型号,应该可以找到您需要的一切。

从相机中提取 JPEG:

当连接到相机时,相机将向您发送无尽的数据。您可以扫描这些数据并从中检索图像。

2.搜索 JPEG 标头,该标头是0xFF其次是0xD8。如果这两个字节彼此相邻,则开始读取字节并继续将它们保存到数组中。您可以使用索引(int) 变量来记录您收到的字节数。

int counter = 0;
byte[] completeImageByte = new byte[500000];
byte[] receivedBytes = new byte[500000];
receivedBytes[counter] = byteFromCamera;
counter++;

3.从相机读取数据时,检查接下来的两个字节是否是JPEG页脚,即0xFF其次是0xD9。如果这是真的,那么您已经收到完整的图像(1 帧)。

您的图像字节应类似于:

0xFF 0xD8一些其他字节(数千个)......然后0xFF 0xD9

Copy receivedBytes to the completeImageByte变量,以便稍后可以使用它来显示图像。重置counter变量为 0。

Buffer.BlockCopy(receivedBytes, 0, completeImageByte, 0, counter);
counter = 0;

在屏幕上显示 JPEG 图像:

4.将图像显示到屏幕上

由于您每秒将收到许多图像,因此最多高效的我发现显示它的方法是使用RawImage成分。所以,不要使用Image or Sprite Renderer如果您希望它在移动设备上运行,请为此。

public RawImage screenDisplay;
if(updateFrame){
Texture2D camTexture = new Texture2D(2, 2);
camTexture.LoadImage(completeImageByte);
screenDisplay.texture = camTexture;
}

你只需要做camTexture = new Texture2D(2, 2);一旦在Start()功能。

5.跳回步骤2并继续这样做,直到你想停止为止。

连接相机的API:.

Use HttpWebRequest如果相机需要身份验证(用户名和密码)。

对于不需要身份验证的用户,请使用UnityWebRequest。使用时UnityWebRequest,您必须从中派生自己的类DownloadHandlerScript否则您的应用程序将崩溃,因为您将不间断地接收数据。

派生您自己的类的示例DownloadHandlerScript:

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class CustomWebRequest : DownloadHandlerScript
{    
    // Standard scripted download handler - will allocate memory on each ReceiveData callback
    public CustomWebRequest()
        : base()
    {
    }

    // Pre-allocated scripted download handler
    // Will reuse the supplied byte array to deliver data.
    // Eliminates memory allocation.
    public CustomWebRequest(byte[] buffer)
        : base(buffer)
    {
    }

    // Required by DownloadHandler base class. Called when you address the 'bytes' property.
    protected override byte[] GetData() { return null; }

    // Called once per frame when data has been received from the network.
    protected override bool ReceiveData(byte[] byteFromCamera, int dataLength)
    {
        if (byteFromCamera == null || byteFromCamera.Length < 1)
        {
            //Debug.Log("CustomWebRequest :: ReceiveData - received a null/empty buffer");
            return false;
        }

        //Search of JPEG Image here

        return true;
    }

    // Called when all data has been received from the server and delivered via ReceiveData
    protected override void CompleteContent()
    {
        //Debug.Log("CustomWebRequest :: CompleteContent - DOWNLOAD COMPLETE!");
    }

    // Called when a Content-Length header is received from the server.
    protected override void ReceiveContentLength(int contentLength)
    {
        //Debug.Log(string.Format("CustomWebRequest :: ReceiveContentLength - length {0}", contentLength));
    }
}

Usage:

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Test : MonoBehaviour
{

    CustomWebRequest camImage;
    UnityWebRequest webRequest;
    byte[] bytes = new byte[90000];

    void Start()
    {
        string url = "http://camUrl/mjpg/video.mjpg";
        webRequest = new UnityWebRequest(url);
        webRequest.downloadHandler = new CustomWebRequest(bytes);
        webRequest.Send();
    }
}

你可以让他们执行步骤2,3,4 and 5 in the ReceiveData函数从CustomWebRequest script.

控制相机:

摄像机具有平移、旋转、翻转、镜像和执行其他功能的命令。每个摄像机的情况都不同,但很简单,只需向摄像机的 URL 发出 GET/POST 请求并提供查询即可。这些命令可以在相机手册中找到。

例如:http://192.168.1.5?pan=50&rotate=90

其他框架:

AForge- 一个可以处理两者的免费框架JPEG/MJPES and FFMPEG从相机。你必须修改它才能与 Unity 一起使用,如果你不能执行步骤,你应该修改它2,3,4 and 5.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将实时镜头从摄像机流式传输到 Unity3D 的相关文章

随机推荐

  • 在原型继承中实现实例方法/变量

    读完后我一直在玩原型继承http javascript crockford com prototypal html并且在理解如何以使用经典继承的方式使用它方面存在一些问题 也就是说 原型继承的所有函数和变量本质上都会变成静态 除非它们被子对
  • 编写阿拉伯语和英语混合的文本文件

    我正在尝试在文本文件中写入包含阿拉伯语和英语的句子 但问题是两种语言都有 RTL 和 LTR 方向 因此输出文本文件不保存单词的顺序 并且某些单词出现在彼此之前 这是错误的 当我从记事本或任何文本编辑器更改文本方向时问题已解决 有什么方法可
  • 从 XML 填充参数列表

    我需要将 ID 列表拉入 powershell 参数验证集中 如下所示 function Do Stuff Cmdletbinding param ValidateSet Seattle NewYork London Atlanta Str
  • 评估 Javascript 中的表达式树

    我的输入由嵌套逻辑表达式对象组成 Ex var obj OR AND false true true OR true false false AND true true true 这相当于 false true true true fals
  • 语法定向翻译是什么意思?

    谁能简单地解释一下 语法定向翻译 是什么意思 我开始阅读这个主题龙书但无法理解 这维基文章也没有帮助 简而言之 语法定向翻译 意味着用语法识别器 解析器 驱动整个编译 翻译 过程 从概念上讲 编译程序 将其从源代码翻译为机器代码 的过程从生
  • 通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入文档

    对于这个应用程序 我使用 Node js MongoDB Mongoose 和 Express 所以我有一个包含枢轴数组的参数对象 我想从枢轴读取某些数据 如下所述 in models js var Pivot new Schema val
  • Firebase 无法与 Firebase 服务器通信

    我正在使用 Firebase PhoneAuth 并收到以下错误 由于配置无效 Firebase 安装无法与 Firebase 服务器 API 通信 请更新您的 Firebase 初始化流程 并在初始化 Firebase 时设置有效的 Fi
  • 如何使用 Javascript 获取表的当前行索引?

    我可以在 Javascript 中获取表的当前行索引吗 我们可以删除具有当前索引的表行吗 rowIndex 属性返回表中行的位置 function myFunction x console log Row index is x rowInd
  • 在 pandas 中转换读取 csv 的数据

    我正在将 csv 文件读入 pandas 数据帧 csv 文件包含多个列 列 A 包含字符串 20 989 98766 加载文件时是否可以只读取字符串的最后 5 个字符 98766 df pd read csv test data2 csv
  • 延迟解析非常大的 xml

    我有一个巨大的 xml 文件 40 GB 我想从中提取一些字段而不将整个文件加载到内存中 有什么建议么 基于 SAXParser 教程的 XMLEventReader 快速示例here 由 Rinat Tainov 发布 我确信它可以做得更
  • Google 应用程序脚本 - onChange 或 OnEdit

    我有一个谷歌应用程序脚本 可以更改电子表格中 onLoad 事件中 A1 中的值 这会引发一连串的变化 当单元格 F200 由于对单元格 A1 进行编辑而发生更改时 我想检测该事件 如何设置触发器来检测此更改 当用户打开他或她有权编辑的电子
  • IOS的文件系统加密?

    我知道在Mac OS上 我们可以使用Macfuse在用户空间中编写文件系统 我们可以创建一个盒子加密 我不知道IOS上有一个框架 像FUSE Macfuse这样的库 我可以编写我的文件系统来加密 解密文件 可能安装在目录 文件夹上 谁能给我
  • DocumentDb 错误“跨分区查询仅支持聚合的‘VALUE ’”

    我很困惑 我将以下 SQL 查询发送到我的 documentDb 实例 query SELECT SUM c clicks SUM c opens MAX c ts COUNT c FROM c WHERE c clicks gt 0 我收
  • 如何使用 Javascript 找出两个日期之间的差异

    我想获得特定日期的扩孔天数 所以我试图用今天的日期检测特定日期 但这在这里不起作用是我的code如果日期是下个月 27 我怎样才能得到剩余的天数 var date2 new Date var date1 27 5 2012 var diff
  • 从 CMRotationMatrix 获取俯仰、偏航、滚转

    我有一个 CMRotationMatrix rot 我想从矩阵中获取俯仰 偏航 滚转 我有什么想法可以做到这一点吗 Thanks 使用四元数比使用欧拉角更好 可以使用以下公式从四元数导出横滚角 俯仰角和偏航角值 roll atan2 2 y
  • 如何从c中数字的最高有效位开始获取不同的数字?

    我正在解决一个问题 其中给出一个正整数 并且我必须用文字显示它 例如 如果一个数字是2134输出应该是 two one three four 如果我使用模运算符并使用递归技术 我会从最低有效数字开始得到数字 即 four three one
  • 奇怪:按下按钮后 WinForms 窗体自动关闭

    我的应用程序是 WinForms NET 4 C 其中一个表单在按下按钮后会自动关闭 该表单确实有默认的 接受 和 取消 按钮 但这些按钮未被触及 有一个 ButtonTestConnection Click 事件 当单击该事件时 它会完成
  • 未解析的外部符号“public:__thiscall [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我已经看过 我知道还有其他答案 但似乎没有一个答案能给
  • 是否可以通过 VBA 检查文件是否存在于共享点站点上?

    我正在尝试编写一个 Excel 2010 宏 该宏在某些时候必须确认公司共享点网站上是否存在某个文件 doc pdf 该文件可通过 Internet Explorer 访问 所有权限均授予用户 我有该文件的直接链接 我不需要打开它 只需检查
  • 将实时镜头从摄像机流式传输到 Unity3D

    假设我有一个无线摄像机 我想将其实时流式传输到统一 有办法实现这一点吗 奖励问题 广角相机怎么样 180 甚至 360 如果这是我想要与之交互的镜头 那么延迟会是一个多大的问题 除了常规镜头之外 还可以发送更多数据 例如深度感知 使用深度感