Проблема с трансляцией рендеринга из Unity3D. Он работает, но выглядит неправильно - PullRequest
0 голосов
/ 27 мая 2020

У меня проблемы с трансляцией рендеринга Unity3D. Я все это настроил, и кажется, что он транслируется, но изображение, которое я получаю, неправильного цвета и растянуто по вертикали.

Вот - некоторые примеры.

и вот код, который я использую:

    using UnityEngine.UI;
    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices;
    using agora_gaming_rtc;

    public class AgoraScript : MonoBehaviour
    {
        public InputField Inpt_ChannelName;
        static VideoChatCallbacks app = null;
        private string HomeSceneName = "SceneHome";
        private string PlaySceneName = "SceneHelloVideo";
        private string AppID = "db1e101520084a2aabdda11454379bca";

        public GameObject Btn_Join_Obj;
        public GameObject Btn_Leave_Obj;
        public Texture2D mTexture;
        public RenderTexture MyRTTexture;
        public Texture2D Kitten;



        int i = 100;
        public void Btn_Join_Fun()
        {
            if (ReferenceEquals(app, null))
            {
                app = new VideoChatCallbacks(); // create app
                app.loadEngine(AppID); // load engine
            }
            app.join(Inpt_ChannelName.text);
            mTexture = new Texture2D((int)MyRTTexture.width, (int)MyRTTexture.height, TextureFormat.ARGB32, false);
            Btn_Join_Obj.SetActive(false);
            Btn_Leave_Obj.SetActive(true);
        }

        public void Btn_Leave_Fun()
        {
            if (!ReferenceEquals(app, null))
            {
                app.leave(); // leave channel
                app.unloadEngine(); // delete engine
                app = null; // delete app
            }
            Btn_Join_Obj.SetActive(true);
            Btn_Leave_Obj.SetActive(false);
        }

        void OnApplicationPause(bool paused)
        {
            if (!ReferenceEquals(app, null))
            {
                app.EnableVideo(paused);
            }
        }

        public void Btn_DisableChatVideo()
        {
            app.DisableChatVideo();
        }

        public void Btn_EnableChatVideo()
        {
            app.EnableChatVideo();
        }

        void OnApplicationQuit()
        {
            if (!ReferenceEquals(app, null))
            {
                Debug.Log("OnApplicationQuit");
                app.unloadEngine();
            }
        }

        IEnumerator shareScreen()
        {
            yield return new WaitForEndOfFrame();
            RenderTexture.active = MyRTTexture;
            mTexture.ReadPixels(new Rect(0, 0, MyRTTexture.width, MyRTTexture.height), 0, 0);
            mTexture.Apply();
            byte[] bytes = mTexture.GetRawTextureData();
            int size = Marshal.SizeOf(bytes[0]) * bytes.Length;
            IRtcEngine rtc = IRtcEngine.QueryEngine();

            if (rtc != null)
            {
                ExternalVideoFrame externalVideoFrame = new ExternalVideoFrame();
                externalVideoFrame.type = ExternalVideoFrame.VIDEO_BUFFER_TYPE.VIDEO_BUFFER_RAW_DATA;
                externalVideoFrame.format = ExternalVideoFrame.VIDEO_PIXEL_FORMAT.VIDEO_PIXEL_BGRA;
                externalVideoFrame.buffer = bytes;
                externalVideoFrame.stride = MyRTTexture.width;
                externalVideoFrame.height = MyRTTexture.height;
                //externalVideoFrame.cropLeft = 10;
                //externalVideoFrame.cropTop = 10;
                //externalVideoFrame.cropRight = 10;
                //externalVideoFrame.cropBottom = 10;
                //externalVideoFrame.rotation = 90;



                externalVideoFrame.timestamp = i++;
                int a = rtc.PushVideoFrame(externalVideoFrame);
                Debug.Log(" pushVideoFrame =       " + a);
            }
        }

        void Update()
        {
            if (Btn_Leave_Obj.activeSelf == true)
            {
                StartCoroutine(shareScreen());
            }
        }
    }

Я не думаю, что делаю что-то настолько странное. Соединение - это другой сценарий, но он содержит mRtcEngine.SetExternalVideoSource(true, false);.

Как я уже сказал, на самом деле он транслирует видео просто неправильно.

Любая помощь с этим будет очень признательна. Уже 2 дня пытаюсь разобраться.

Всего наилучшего !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...