Files
webRtc/Assets/Script/YUVToRenderTexture.cs
2026-06-03 22:05:03 +08:00

106 lines
3.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using RenderStreaming;
using Stary.Evo;
using Unity.RenderStreaming;
using Unity.XR.XREAL;
using UnityEngine;
using UnityEngine.UI;
namespace Script
{
public class YUVToRenderTexture : MonoBehaviour, IController
{
/// <summary>
/// 本地视频显示
/// </summary>
public RenderTexture localRenderTexture;
private Material localVideoMaterial;
private XREALRGBCameraTexture m_RGBCameraTexture;
//private RawImage _localVideoImage;
//private RawImage _textureImage;
private VideoStreamSender videoStreamSender;
private void Start()
{
//_localVideoImage= GameObject.Find("CanvasMain/RawImage").GetComponent<RawImage>();
//_textureImage= GameObject.Find("CanvasMain/RawImage1").GetComponent<RawImage>();
localVideoMaterial = Resources.Load<Material>("LocalRenderMaterial");
m_RGBCameraTexture = XREALRGBCameraTexture.CreateSingleton();
videoStreamSender=this.GetComponent<VideoStreamSender>();
Play();
}
public void Play()
{
if (!m_RGBCameraTexture.IsCapturing)
{
Debug.Log($"[RGBCamera] Play");
m_RGBCameraTexture.StartCapture();
}
}
void Update()
{
var yuvTextures = m_RGBCameraTexture.GetYUVFormatTextures();
if (yuvTextures[0] != null)
{
ConvertYUVToRenderTexture(yuvTextures);
}
}
public void ConvertYUVToRenderTexture(Texture2D[] yuvTextures)
{
if (yuvTextures == null || yuvTextures.Length < 3)
return;
// 获取Y纹理的尺寸作为目标RenderTexture的尺寸
var width = videoStreamSender.width;
var height = videoStreamSender.height;
// if (_localVideoImage==null || _localVideoImage.rectTransform.sizeDelta.x != width ||
// _localVideoImage.rectTransform.sizeDelta.y != height)
// {
// _localVideoImage.rectTransform.sizeDelta = new Vector2(width, height);
// }
// 如果RenderTexture不存在或尺寸不匹配创建新的
if (localRenderTexture == null || localRenderTexture.width != width ||
localRenderTexture.height != height)
{
// 释放旧的RenderTexture
if (localRenderTexture != null)
localRenderTexture.Release();
// 创建新的RenderTexture
localRenderTexture = new RenderTexture((int)width, (int)height, 0, RenderTextureFormat.ARGB32);
localRenderTexture.enableRandomWrite = true;
localRenderTexture.Create();
//_textureImage.texture = localRenderTexture;
}
// 设置YUV纹理到material
//_localVideoImage.texture = yuvTextures[0];
localVideoMaterial.SetTexture("_MainTex", yuvTextures[0]);
localVideoMaterial.SetTexture("_UTex", yuvTextures[1]);
localVideoMaterial.SetTexture("_VTex", yuvTextures[2]);
Graphics.Blit(null, localRenderTexture, localVideoMaterial);
}
public void Stop()
{
if (m_RGBCameraTexture.IsCapturing)
{
if (localRenderTexture != null)
localRenderTexture.Release();
Debug.Log($"[RGBCamera] Stop");
m_RGBCameraTexture.StopCapture();
}
}
public IArchitecture GetArchitecture()
{
return MainArchitecture.Interface;
}
}
}