当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 23:19:12 C#

C#学习教程:将实时视频从摄像机流式传输到Unity3D有没有办法做到这一点?奖励问题:提前致谢我假设这是一台带有以太网端口或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.mjpg和http://192.168.1.5/mjpg/video.bin每个相机都不同。找到url的唯一方法是阅读其手册。如果说明书不可用,使用其官方应用程序连接到它,然后使用Wireshark发现相机图像的URL。用户名和密码(如果需要)也可以在手册中找到。如果没有,请谷歌型号以查找您需要的所有信息。从相机中提取JPEG:当连接到相机时,相机会向您发送无穷无尽的数据。您可以扫描此数据并从中检索图像。2.搜索JPEG标头,即0xFF后跟0xD8。如果两个字节相邻,则开始读取字节并将它们保存到数组中。您可以使用索引(int)变量来计算接收到的字节数。整数计数器=0;byte[]completeImageByte=newbyte[500000];byte[]receivedBytes=newbyte[500000];receivedBytes[计数器]=byteFromCamera;计数器++;3.从相机读取数据时,检查JPEG页脚的下两个字节,即0xFF后跟0xD9。如果是这样,那么您就收到了完整的图像(1帧)。您的图像字节应如下所示:0xFF0xD8someotherbytes(千)....然后0xFF0xD9将receivedBytes复制到completeImageByte变量,以便您稍后可以使用它来显示图像。将计数器变量重置为0。Buffer.BlockCopy(receivedBytes,0,completeImageByte,0,counter);计数器=0;将JPEG图像显示到屏幕上:4.将图像显示到屏幕上因为您每秒会接收到很多图像,所以我发现显示这种效果的最佳方法是使用RawImage组件。因此,如果您希望它在移动设备上运行,请不要使用Image或SpriteRenderer。公共RawImage屏幕显示;if(updateFrame){Texture2DcamTexture=newTexture2D(2,2);camTexture.LoadImage(completeImageByte);screenDisplay.texture=camTexture;你只需要做camTexture=newTexture2D(2,2);一次在Start()函数中。5回到第2步,继续这样做,直到你想吃饱为止。连接相机的API:.如果相机需要身份验证(用户名和密码),请使用HttpWebRequest。对于那些不需要身份验证的人,请使用UnityWebRequest。使用UnityWebRequest,您必须从DownloadHandlerScript派生您自己的类,否则您的应用程序将崩溃,因为您将不停地接收数据。从DownloadHandlerScript派生自己的类的示例:usingUnityEngine;使用系统集合;使用UnityEngine.Networking;publicclassCustomWebRequest:DownloadHandlerScript{//标准脚本下载处理程序-将在每个ReceiveData回调上分配内存publicCustomWebRequest():base(){}//预分配的脚本下载处理程序//将重用提供的字节数组来传送数据。//消除内存分配。publicCustomWebRequest(byte[]buffer):base(buffer){}//DownloadHandler基类需要。当您寻址“字节”属性时调用。protectedoverridebyte[]GetData(){返回空值;}//当从网络接收到数据时每帧调用一次。protectedoverrideboolReceiveData(byte[]byteFromCamera,intdataLength){if(byteFromCamera==null||byteFromCamera.Length使用方法:使用UnityEngine;使用System.Collections;使用UnityEngine.Networking;公共类测试:MonoBehaviour{CustomWebRequestcamImage;UnityWebRequest网络请求;byte[]bytes=newbyte[90000];voidStart(){stringurl="http://camUrl/mjpg/video.mjpg";webRequest=newUnityWebRequest(url);webRequest.downloadHandler=newCustomWebRequest(bytes);webRequest.Send();您可以在CustomWebRequest脚本的ReceiveData函数中执行步骤2、3、4和5控制相机:相机具有平移、旋转、翻转、镜像和执行其他功能的能力。这在每个摄像头中都不同,但是向摄像头的URL发出GET/POST请求并提供查询很简单。这些命令可以在相机手册中找到。例如:http://192.168.1.5?pan=50&rotate=90:http://192.168.1.5?pan=50&rotate=90其他框架:AForge-一个免费的框架,可以处理来自相机的JPEG/MJPES和FFMPEG。你必须修改它才能使用Unity,如果你不能执行步骤2、3、4和5,你应该这样做。以上是C#学习教程:将实时素材从相机流式传输到Unity3D。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: