Unity에서 RTSP 비디오 스트리밍 재생
소개
RTSP 전송된 영상을 Unity에서 스트리밍하고 싶을 수 있습니다.
그러나 Unity에는 표준으로 RTSP 재생을 지원하는 구성 요소가 없습니다.
이번에는 gujadot 씨의 RTSP_Unity_Plugin 을 사용하여 Unity에서 RTSP 스트리밍을 도입하는 방법을 설명합니다.
사용하는 소프트웨어
구현 절차
DLL 생성편
FFmpeg 다운로드 페이지 에 접속한다. dev/share 모두 다운로드.
ffmpeg
폴더를 만듭니다. 다음과 같은 구성이 된다. ffmpeg/include <- copy <- FFmpeg/win64-dev/include
ffmpeg/lib <- copy <- FFmpeg/win64-dev/lib と FFmpeg/win64-shared/bin
추가 포함 디렉토리에 다음을 입력합니다.
$(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 씨에게 감사!
Reference
이 문제에 관하여(Unity에서 RTSP 비디오 스트리밍 재생), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KawabeAtsushi/items/f5d5bf07e6481b5a7d8b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)