Импорт живого видео с камеры в единство - PullRequest
1 голос
/ 04 февраля 2020

У меня есть проблема, которую я не мог понять, используя inte rnet. У меня есть малиновая камера, которая транслирует на веб-IP, сценарий для потоковой передачи является python сценарий, "http://192.168.0.94: 8000 / index. html" в моем случае, и я хочу импортировать поток в приложение для единства. Кто-нибудь делал это раньше? Как это должно быть сделано? Например, когда я нажимаю кнопку воспроизведения в единстве, я хочу видеть изображения, записанные камерой, в объекте приложения! Спасибо за ваше время!

using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.IO;

public class WebStreams : MonoBehaviour
{

    public MeshRenderer frame;    //Mesh for displaying video

    private string sourceURL = "http://192.168.0.94:8000/index.html";
    private Texture2D texture;
    private Stream stream;

    public void GetVideo()
    {
        texture = new Texture2D(2, 2);
        // create HTTP request
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sourceURL);
        //Optional (if authorization is Digest)
        ///req.Credentials = new NetworkCredential("username", "password");
        // get response
        WebResponse resp = req.GetResponse();
        // get response stream
        stream = resp.GetResponseStream();
        StartCoroutine(GetFrame());
    }

    IEnumerator GetFrame()
    {
        Byte[] JpegData = new Byte[65536];

        while (true)
        {
            int bytesToRead = FindLength(stream);
            print(bytesToRead);
            if (bytesToRead == -1)
            {
                print("End of stream");
                yield break;
            }

            int leftToRead = bytesToRead;

            while (leftToRead > 0)
            {
                leftToRead -= stream.Read(JpegData, bytesToRead - leftToRead, leftToRead);
                yield return null;
            }

            MemoryStream ms = new MemoryStream(JpegData, 0, bytesToRead, false, true);

            texture.LoadImage(ms.GetBuffer());
            frame.material.mainTexture = texture;
            stream.ReadByte(); // CR after bytes
            stream.ReadByte(); // LF after bytes
        }
    }

    int FindLength(Stream stream)
    {
        int b;
        string line = "";
        int result = -1;
        bool atEOL = false;

        while ((b = stream.ReadByte()) != -1)
        {
            if (b == 10) continue; // ignore LF char
            if (b == 13)
            { // CR
                if (atEOL)
                {  // two blank lines means end of header
                    stream.ReadByte(); // eat last LF
                    return result;
                }
                if (line.StartsWith("Content-Length:"))
                {
                    result = Convert.ToInt32(line.Substring("Content-Length:".Length).Trim());
                }
                else
                {
                    line = "";
                }
                atEOL = true;
            }
            else
            {
                atEOL = false;
                line += (char)b;
            }
        }
        return -1;
    }
}
...