using System;
using RenderStreaming;
using Stary.Evo;
using Unity.XR.XREAL;
using UnityEngine;
using UnityEngine.UI;
namespace Script
{
public class YUVToRenderTexture : MonoBehaviour, IController
{
///
/// 本地视频显示
///
public RenderTexture localRenderTexture;
private Material localVideoMaterial;
private XREALRGBCameraTexture m_RGBCameraTexture;
//private RawImage _localVideoImage;
//private RawImage _textureImage;
private void Start()
{
//_localVideoImage= GameObject.Find("CanvasMain/RawImage").GetComponent();
//_textureImage= GameObject.Find("CanvasMain/RawImage1").GetComponent();
localVideoMaterial = Resources.Load("LocalRenderMaterial");
m_RGBCameraTexture = XREALRGBCameraTexture.CreateSingleton();
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的尺寸
int width = yuvTextures[0].width;
int height = yuvTextures[0].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(width, 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;
}
}
}