109 lines
2.9 KiB
C#
109 lines
2.9 KiB
C#
|
using System;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.UI;
|
|||
|
|
|||
|
public class UEGVideoPlayer : MonoBehaviour
|
|||
|
{
|
|||
|
[SerializeField]
|
|||
|
private int mWidth;
|
|||
|
[SerializeField]
|
|||
|
private int mHeight;
|
|||
|
[SerializeField]
|
|||
|
private int mDataLenght;
|
|||
|
[SerializeField]
|
|||
|
private Texture2D m_rawBufferWarper;
|
|||
|
[SerializeField]
|
|||
|
private RawImage m_drawCanvas;
|
|||
|
[SerializeField]
|
|||
|
private RectTransform m_drawCanvasrect;
|
|||
|
byte[] mFrameData;
|
|||
|
IntPtr mFrameDataPtr;
|
|||
|
|
|||
|
private TimeSpan lastElapsed;
|
|||
|
public double videoFPS { get; private set; }
|
|||
|
public ulong mFrame { get; private set; }
|
|||
|
bool bInit = false;
|
|||
|
bool bHadData = false;
|
|||
|
|
|||
|
private void Awake()
|
|||
|
{
|
|||
|
mFrame = 0;
|
|||
|
m_drawCanvas = GameObject.Find("GameRawImage").GetComponent<RawImage>();
|
|||
|
m_drawCanvasrect = m_drawCanvas.GetComponent<RectTransform>();
|
|||
|
}
|
|||
|
|
|||
|
public void Initialize()
|
|||
|
{
|
|||
|
m_drawCanvas.color = Color.white;
|
|||
|
|
|||
|
if (m_rawBufferWarper == null)
|
|||
|
{
|
|||
|
mDataLenght = mWidth * mHeight * 4;
|
|||
|
mFrameData = new byte[mDataLenght];
|
|||
|
|
|||
|
// <20>̶<EFBFBD><CCB6><EFBFBD><EFBFBD>飬<EFBFBD><E9A3AC>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>
|
|||
|
var bitmapcolorRect_handle = GCHandle.Alloc(mFrameData, GCHandleType.Pinned);
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
mFrameDataPtr = bitmapcolorRect_handle.AddrOfPinnedObject();
|
|||
|
|
|||
|
|
|||
|
//MAME<4D><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BGRA32<33><32><EFBFBD>úú<C3BA>
|
|||
|
//m_rawBufferWarper = new Texture2D(mWidth, mHeight, TextureFormat.BGRA32, false);
|
|||
|
m_rawBufferWarper = new Texture2D(mWidth, mHeight, TextureFormat.ARGB32, false);
|
|||
|
m_rawBufferWarper.filterMode = FilterMode.Point;
|
|||
|
}
|
|||
|
|
|||
|
//mFrameDataPtr = framePtr;
|
|||
|
m_drawCanvas.texture = m_rawBufferWarper;
|
|||
|
bInit = true;
|
|||
|
|
|||
|
float targetWidth = ((float)mWidth / mHeight) * m_drawCanvasrect.rect.height;
|
|||
|
m_drawCanvasrect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, targetWidth);
|
|||
|
}
|
|||
|
|
|||
|
public void StopVideo()
|
|||
|
{
|
|||
|
bInit = false;
|
|||
|
m_drawCanvas.color = new Color(0, 0, 0, 0);
|
|||
|
}
|
|||
|
|
|||
|
void Update()
|
|||
|
{
|
|||
|
if (!bHadData)
|
|||
|
return;
|
|||
|
|
|||
|
if (!bInit)
|
|||
|
{
|
|||
|
Initialize();
|
|||
|
return;
|
|||
|
}
|
|||
|
m_rawBufferWarper.LoadRawTextureData(mFrameDataPtr, mDataLenght);
|
|||
|
m_rawBufferWarper.Apply();
|
|||
|
}
|
|||
|
|
|||
|
public void SubmitVideo(int width, int height, byte[] data, long frame_number)
|
|||
|
{
|
|||
|
|
|||
|
mFrame = (ulong)frame_number;
|
|||
|
var current = Essgeeinit.sw.Elapsed;
|
|||
|
var delta = current - lastElapsed;
|
|||
|
lastElapsed = current;
|
|||
|
videoFPS = 1d / delta.TotalSeconds;
|
|||
|
mFrameData = data;
|
|||
|
|
|||
|
if (!bHadData)
|
|||
|
{
|
|||
|
mWidth = width;
|
|||
|
mHeight = height;
|
|||
|
bHadData = true;
|
|||
|
}
|
|||
|
//Debug.Log($"frame_number -> {frame_number}");
|
|||
|
}
|
|||
|
|
|||
|
public byte[] GetScreenImg()
|
|||
|
{
|
|||
|
return (m_drawCanvas.texture as Texture2D).EncodeToJPG();
|
|||
|
}
|
|||
|
}
|