C# 使用Unity C通过网络发送图片#

C# 使用Unity C通过网络发送图片#,c#,unity3d,ffmpeg,C#,Unity3d,Ffmpeg,我目前正在和全息透镜一起工作,因此是统一的。其想法是在不同的设备上制作一个网络摄像机直播流,尽可能少地延迟到FFmpeg实例进行编码。然而,我遇到了一些问题 我的第一个问题是从Color32数组到字节数组的转换。它创造了巨大的带宽,特别是当我试图以30fps和1280x720分辨率录制和流媒体时。 下面是一些代码: IEnumerator Init() { webCam = new WebCamTexture(1280, 720, 30); webCam.

我目前正在和全息透镜一起工作,因此是统一的。其想法是在不同的设备上制作一个网络摄像机直播流,尽可能少地延迟到FFmpeg实例进行编码。然而,我遇到了一些问题

我的第一个问题是从Color32数组到字节数组的转换。它创造了巨大的带宽,特别是当我试图以30fps和1280x720分辨率录制和流媒体时。 下面是一些代码:

IEnumerator Init()
    {
        webCam = new WebCamTexture(1280, 720, 30);
        webCam.Play();
        image.texture = webCam;
        Debug.Log("WebCam Width: " + webCam.width);
        Debug.Log("WebCam Height: " + webCam.height);
        currentTexture = new Texture2D(webCam.width, webCam.height);
        
        data = new Color32[webCam.width * webCam.height];
        listener = new TcpListener(IPAddress.Any, 10305);
        listener.Start();



        while (webCam.width < 100)
        {
            
             yield return null;
        }

        StartCoroutine("Recording");
    }

    WaitForEndOfFrame endOfFrame = new WaitForEndOfFrame();

    IEnumerator Recording()
    {

        TcpClient tcpClient = null;
        NetworkStream tcpStream = null;
        bool isConnected = false;

        Loom.RunAsync(() =>
        {
            while(!stopCapture)
            {
                tcpClient = listener.AcceptTcpClient();
                Debug.Log("Client Connected!");
                isConnected = true;
                tcpStream = tcpClient.GetStream();
            }
        });
        while(!isConnected)
        {
            yield return endOfFrame;
        }
        readyToGetFrame = true;
        byte[] messageLength = new byte[SEND_RECEIVE_COUNT];
        while(!stopCapture)
        {
            yield return endOfFrame;

            webCam.GetPixels32(data);
            byte[] webCamBytes = Utilities.Color32ArrayToByteArray(data);
                                
            readyToGetFrame = false;
            Loom.RunAsync(() => {
                tcpStream.Write(webCamBytes, 0, webCamBytes.Length);
                readyToGetFrame = true;
            });

            while (!readyToGetFrame)
            {
                yield return endOfFrame;
            }
        }
    }
为了解决这个问题,我尝试使用EncodePNG和EncodeJPG。但我还有第二个问题。如果我使用这些方法,我会有很大的性能损失

所以不是这个

        webCam.GetPixels32(data);
        byte[] webCamBytes = Utilities.Color32ArrayToByteArray(data);
我用这个

        currentTexture.SetPixels(webCam.GetPixels());
        byte[] webCamBytes = currentTexture.EncodeToJPG();
因此,我的问题是: 是否有任何方法可以通过切断alpha值来减少带宽,因为它们不需要?或者是否有其他好方法,例如转换为不同的颜色或图片格式?

因为现在我没有可用的想法,感觉有点卡住了。可能就是我;-)

PS:使用外部库有点困难,因为它需要在HoloLens上运行,并且由于其他规定


提前感谢您

您基本上是在重新发明流式视频编解码器。从发送未压缩位图开始,您会发现这需要大量带宽。然后,您使用一个(可能未优化速度)JPEG编码器,并发现(即使您克服了性能问题)仍然需要太多的带宽。然后你开始想“如果我只能发送帧之间的差异怎么办?”等等。为什么要在不同的系统上安装编码器?你想解决什么原始问题?视频捕获(
VideoCapture.CreateAsync()
)为什么不能工作?@CodeCaster感谢您的评论。我是新来的,必须学会如何提出好的问题。不在全息镜头上运行编码器的原因是:电源。电池和计算能力。这是相当有限的,即使h264编码在最小的延迟和有点okayish质量的实时工作,随后的带宽是有限的,甚至进一步。这就是为什么还有第二块硬件,它功能更强大(由于之后的带宽有限,在VP9中对全息镜头的相机馈送进行编码),并通过LAN/WLAN直接连接到全息镜头。@CodeMaster此外,它不像全息镜头那样使用电池运行。但我明白你的观点,在一个非常基本的层面上重新发明编解码器。然而,我试图减少一点带宽(因为这似乎是目前的瓶颈,我不知道它需要多少压缩),而不是一个巨大的利润,而不牺牲所有的当前性能。就我而言,VideoCapture只能保存到文件而不能流式传输,因此造成了巨大的延迟,无法以尽可能少的延迟实现实时流式传输。如果目标是实时查看,则不应使用TCP进行视频流,这可能足以同步尽可能多的帧。我认为使用编码后台线程和UDP可能已经提高了性能编码本质上是以一种性能和带宽效率都很高的智能方式压缩数据,并且您有一些参数,您可以在这些参数中说明什么对您最重要。只需按照您的喜好使用现有的编解码器,就可以降低分辨率/比特率/质量/压缩,并选择最适合的编解码器。您当前处于三角形中,可以选择2。性能、带宽、CPU周期。此外,使用udpy,您基本上是在重新发明流式视频编解码器。从发送未压缩位图开始,您会发现这需要大量带宽。然后,您使用一个(可能未优化速度)JPEG编码器,并发现(即使您克服了性能问题)仍然需要太多的带宽。然后你开始想“如果我只能发送帧之间的差异怎么办?”等等。为什么要在不同的系统上安装编码器?你想解决什么原始问题?视频捕获(
VideoCapture.CreateAsync()
)为什么不能工作?@CodeCaster感谢您的评论。我是新来的,必须学会如何提出好的问题。不在全息镜头上运行编码器的原因是:电源。电池和计算能力。这是相当有限的,即使h264编码在最小的延迟和有点okayish质量的实时工作,随后的带宽是有限的,甚至进一步。这就是为什么还有第二块硬件,它功能更强大(由于之后的带宽有限,在VP9中对全息镜头的相机馈送进行编码),并通过LAN/WLAN直接连接到全息镜头。@CodeMaster此外,它不像全息镜头那样使用电池运行。但我明白你的观点,在一个非常基本的层面上重新发明编解码器。然而,我试图减少一点带宽(因为这似乎是目前的瓶颈,我不知道它需要多少压缩),而不是一个巨大的利润,而不牺牲所有的当前性能。就我而言,VideoCapture只能保存到文件而不能流式传输,因此造成了巨大的延迟,无法以尽可能少的延迟实现实时流式传输。如果目标是实时查看,则不应使用TCP进行视频流,这可能足以同步尽可能多的帧。我认为使用编码后台线程和UDP可能已经提高了性能编码本质上是以一种性能和带宽效率都很高的智能方式压缩数据,并且您有一些参数,您可以在这些参数中说明什么对您最重要。只需按照您的喜好使用现有的编解码器,就可以降低分辨率/比特率/质量/压缩,并选择最适合的编解码器。您当前处于三角形中,可以选择2。性能、带宽、CPU周期。另外,使用UDP
        currentTexture.SetPixels(webCam.GetPixels());
        byte[] webCamBytes = currentTexture.EncodeToJPG();