Unity에서 RTSP 비디오 스트리밍 재생

소개



RTSP 전송된 영상을 Unity에서 스트리밍하고 싶을 수 있습니다.
그러나 Unity에는 표준으로 RTSP 재생을 지원하는 구성 요소가 없습니다.
이번에는 gujadot 씨의 RTSP_Unity_Plugin 을 사용하여 Unity에서 RTSP 스트리밍을 도입하는 방법을 설명합니다.

사용하는 소프트웨어


  • Unity 2019.2.8f1
  • Visual Studio 2017
  • RTSP_Unity_Plugin
  • FFmpeg

  • 구현 절차



    DLL 생성편


  • Visual Studio에 Visual C++를 설치합니다.

  • FFmpeg 다운로드 페이지 에 접속한다. dev/share 모두 다운로드.
  • RTSP_Unity_Plugin 다운로드. RTSPUnityPlugin.vcxproj(VC++ Project)를 Visual Studio에서 엽니다.
  • 프로젝트 폴더에 ffmpeg 폴더를 만듭니다. 다음과 같은 구성이 된다.
  • 작성한 ffmpeg 이하에 ffmpeg/include, ffmpeg/lib의 2 폴더를 작성한다. 각 폴더에 다음과 같이 다운로드한 FFmpeg의 내용을 복사한다. ffmpeg/include <- copy <- FFmpeg/win64-dev/include ffmpeg/lib <- copy <- FFmpeg/win64-dev/lib と FFmpeg/win64-shared/bin
  • Visual Studio 탐색기에서 RTSPUnityPlugin 속성을 엽니다.
  • [구성 속성]-[C/C++]-[일반]을 엽니다.

  • 추가 포함 디렉토리에 다음을 입력합니다.
    $(SolutionDir)\ffmpeg\include;%(AdditionalIncludeDirectories)
    

  • 추가 #using 디렉토리에 다음을 입력합니다.
    $(SolutionDir)\ffmpeg\lib
    
  • 구성 속성 > 링커 > 일반을 엽니다.

  • 추가 라이브러리 디렉토리에 다음을 입력합니다.
    $(SolutionDir)\ffmpeg\lib;%(AdditionalLibraryDirectories)
    
  • 구성 속성 > 디버그를 엽니다.

  • [명령]에 다음을 입력합니다.
    $(TargetPath)
    
  • 구성 속성 > 링커 > 입력을 엽니다.

  • 추가 종속 파일에 다음을 입력합니다.
    avcodec.lib
    avdevice.lib
    avfilter.lib
    avformat.lib
    avutil.lib
    postproc.lib
    swresample.lib
    swscale.lib
    
  • 구성 속성 > 빌드 이벤트 > 링크 이전 이벤트를 엽니다.

  • [명령줄]에 다음을 입력합니다.
    copy "$(SolutionDir)ffmpeg\lib\avcodec-57.dll" "$(TargetDir)"
    copy "$(SolutionDir)ffmpeg\lib\avdevice-57.dll" "$(TargetDir)"
    copy "$(SolutionDir)ffmpeg\lib\avfilter-6.dll" "$(TargetDir)"
    copy "$(SolutionDir)ffmpeg\lib\avformat-57.dll" "$(TargetDir)"
    copy "$(SolutionDir)ffmpeg\lib\avutil-55.dll" "$(TargetDir)"
    copy "$(SolutionDir)ffmpeg\lib\postproc-54.dll" "$(TargetDir)"
    copy "$(SolutionDir)ffmpeg\lib\swresample-2.dll" "$(TargetDir)"
    copy "$(SolutionDir)ffmpeg\lib\swscale-4.dll" "$(TargetDir)"
    
  • 빌드한다.

  • 위의 단계를 수행하면 build\x64\Release\RTSPUnityPlugin.dll가 생성됩니다.

    Unity편



    DLL 배치



    위의 절차에서 생성 된 Release 폴더를 Assets/Plugins 아래에 놓습니다.

    객체에 적용



    스트리밍하려는 머티리얼의 객체에 다음 스크립트를 첨부합니다.
    (setRTSPTexture.cs)

    setRTSPTexture.cs
    using UnityEngine;
    using System;
    using System.Collections;
    using System.Runtime.InteropServices;
    
    
    public class SetRTSPTexture : MonoBehaviour {
    
        [DllImport("RTSPUnityPlugin")]
        private static extern void SetTimeFromUnity(float t);
        [DllImport("RTSPUnityPlugin")]
        private static extern IntPtr GetRenderEventFunc();
        [DllImport("RTSPUnityPlugin")]
        private static extern void SetTextureAsRTSPSink(string rtsp_uri,System.IntPtr texture, int h, int w);
    
    
        public string g_rtspUri = "rtsp://localhost:8554/stream";
    
        IEnumerator Start()
        {
            CreateTextureAndPassToPlugin();
            yield return StartCoroutine("CallPluginAtEndOfFrames");
        }
    
        private void CreateTextureAndPassToPlugin()
        {
            // Create a texture
            Texture2D tex = new Texture2D(256, 256, TextureFormat.RGBA32, false);
            // Set point filtering just so we can see the pixels clearly
            tex.filterMode = FilterMode.Point;
            // Call Apply() so it's actually uploaded to the GPU
            tex.Apply();
    
            // Set texture onto our material
            GetComponent<Renderer>().material.mainTexture = tex;
    
            // Pass texture pointer to the plugin
            SetTextureAsRTSPSink(g_rtspUri, tex.GetNativeTexturePtr(), tex.width, tex.height);
        }
    
        private IEnumerator CallPluginAtEndOfFrames()
        {
            while (true)
            {
                // Wait until all frame rendering is done
                yield return new WaitForEndOfFrame();
    
                // Set time for the plugin
                SetTimeFromUnity(Time.timeSinceLevelLoad);
    
                // Issue a plugin event with arbitrary integer identifier.
                // The plugin can distinguish between different
                // things it needs to do based on this ID.
                // For our simple plugin, it does not matter which ID we pass here.
                GL.IssuePluginEvent(GetRenderEventFunc(), 1);
            }
        }
    }
    
    

    이제 Unity를 실행하면 RTSP를 수신하고 객체의 텍스처에서 재생됩니다.

    마지막으로



    이 플러그인을 사용하면. 멋진 플러그인을 제공해 주셨습니다 THETA 씨에게 감사!

    좋은 웹페이지 즐겨찾기