Wie kann ich von einer ESP32-Kamera aufgenommenes Videostreaming rendern?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich von einer ESP32-Kamera aufgenommenes Videostreaming rendern?

Post by Anonymous »

Ich bin ein Neuling in Stackoverflow! Schön, Sie zu sehen.
Ich möchte eine Videoaufnahme über die ESP 32-Kamera in Echtzeit in Unity rendern.
Aber wenn ich dieses Projekt spiele, zeigt die Spielszene nur den Standardhintergrund von Unity ... Konsole zeigt keinen Fehler an. Bitte helfen Sie mir, das Video der ESP32-Kamera in Unity zu rendern.!
Ich kenne die Streaming-Adresse dieser Kamera (z. B. http://192.1.1.1:81/stream) und Ich möchte das aufgenommene Video (MJPEG-Streaming) auf einem RawImage-Objekt auf Canvas anzeigen. Ich schreibe ein Skript, um es wie folgt zu machen (ich habe Hilfe von ChatGPT bekommen):
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Net;
using System.Collections;
using System.Linq; // System.Linq 추가

public class MJPEGStream : MonoBehaviour
{
public string url = "http://:81/stream"; // MJPEG 스트리밍 URL
public RawImage rawImage; // RawImage 컴포넌트

private Texture2D texture;

void Start()
{
if (rawImage == null)
{
Debug.LogError("RawImage 컴포넌트가 할당되지 않았습니다!");
return; // rawImage가 null이면 함수 종료
}

// texture = new Texture2D(2, 2); // 빈 텍스처 초기화
texture = new Texture2D(0, 0);
rawImage.texture = texture; // RawImage에 텍스처 할당

StartCoroutine(StartStream());
}

IEnumerator StartStream()
{
if (string.IsNullOrEmpty(url))
{
Debug.LogError("스트리밍 URL이 비어있습니다!");
yield break;
}

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();

byte[] boundary = System.Text.Encoding.ASCII.GetBytes("--123456789000000000000987654321"); // boundary 설정

while (true)
{
byte[] jpegData = ReadNextJPEGFrame(stream, boundary);
if (jpegData != null)
{
texture.LoadImage(jpegData);
Debug.Log("Texture width: " + texture.width + ", height: " + texture.height);
rawImage.texture = texture;
Debug.Log("Texture format: " + texture.format);
}
yield return null;
}
}

// boundary 구분자를 기준으로 다음 JPEG 프레임을 읽음
byte[] ReadNextJPEGFrame(Stream stream, byte[] boundary)
{
MemoryStream jpegStream = new MemoryStream();
bool foundBoundary = false;

while (true)
{
int byteRead = stream.ReadByte();
if (byteRead == -1)
return null; // 스트림 끝에 도달하면 종료

jpegStream.WriteByte((byte)byteRead);

// boundary를 찾아서 해당 부분에서 JPEG 데이터 추출
if (jpegStream.Length >= boundary.Length)
{
byte[] lastBytes = new byte[boundary.Length];
jpegStream.Position = jpegStream.Length - boundary.Length;
jpegStream.Read(lastBytes, 0, boundary.Length);

if (lastBytes.SequenceEqual(boundary)) // SequenceEqual 사용
{
// boundary 찾음
byte[] jpegData = new byte[jpegStream.Length - boundary.Length];
jpegStream.Position = 0;
jpegStream.Read(jpegData, 0, jpegData.Length);
return jpegData; // JPEG 데이터 반환
}
}
}
}
}

Ich habe diese Komponente zum RawImage-Objekt hinzugefügt. Dieses Bild zeigt die Einstellungen von RawImage object:rawimageInspector

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post