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 { /// /// 本地视频显示 /// 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(); //_textureImage= GameObject.Find("CanvasMain/RawImage1").GetComponent(); localVideoMaterial = Resources.Load("LocalRenderMaterial"); m_RGBCameraTexture = XREALRGBCameraTexture.CreateSingleton(); videoStreamSender=this.GetComponent(); 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; } } }