C#学习教程:将实时素材从相机流式传输到Unity3D分享


将实时素材从相机流式传输到Unity3D

假设我有一台无线摄像头,我希望将video从实时流式传输到统一。 有没有办法实现这个目标?

奖金问题:

提前致谢

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

如果是,那么是的,它可以用Unity完成。

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

连接到相机

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

有时,它只是一个以.mjpg.bin结尾的URL,如http://192.168.1.5/mjpg/video.mjpghttp://192.168.1.5/mjpg/video.bin

每个相机都不一样。 找到url的唯一方法是阅读其手册。 如果手册不可用,请使用其官方应用程序连接到该手册,然后使用Wireshark发现相机Image的URL。 usernamepassword (如果需要)也可以在手册中找到。 如果没有,请在Google上输入型号,找到您需要的所有信息。

从相机中提取JPEG

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

2.搜索JPEG标头,其为0xFF后跟0xD8 。 如果这两个字节彼此相邻,则开始读取字节并继续将它们保存到数组中。 您可以使用index( 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 someotherbytes(数千个)…..然后0xFF 0xD9

receivedBytes复制到completeImageByte变量,以便稍后可以使用它来显示图像。 将counter变量重置为0。

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

将JPEG图像显示在屏幕上

4.显示图像到屏幕

由于您将每秒接收许多图像,因此我发现显示此效果的最有效方法是使用RawImage Component。 因此,如果您希望在移动设备上运行,请不要使用ImageSprite 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 : .

如果摄像机需要身份validation(用户名和密码),请使用HttpWebRequest

对于那些不需要身份validation的用户,请使用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)); } } 

用法

 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(); } } 

您可以从CustomWebRequest脚本执行ReceiveData函数中的步骤2,3,45

控制相机

摄像机具有平移,旋转,翻转,镜像和执行其他function的命令。这在每个摄像机中都是不同的,但是对摄像机的URL和提供查询进行GET / POST请求很简单。 这些命令可在相机手册中找到。

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

其他框架

AForge - 一个免费的框架,可以从相机处理JPEG / MJPES和FFMPEG 。 您必须修改它以使用Unity,如果您不能执行步骤2,3,45 ,则应该这样做。

上述就是C#学习教程:将实时素材从相机流式传输到Unity3D分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1269815.html

(0)
上一篇 1天前
下一篇 1天前

精彩推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注