You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.5 KiB
118 lines
3.5 KiB
1 year ago
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
using UnityEngine.Video;
|
||
|
|
||
|
[RequireComponent(typeof(VideoPlayer))]
|
||
|
public class VideoCapture : MonoBehaviour
|
||
|
{
|
||
|
public RawImage rawImage;
|
||
|
public float scale = 1;
|
||
|
public bool useWebCam = true;
|
||
|
public int webCamIndex = 0;
|
||
|
|
||
|
public RenderTexture renderTexture { get; private set; }
|
||
|
|
||
|
private WebCamTexture webCamTexture;
|
||
|
private RenderTexture videoTexture;
|
||
|
|
||
|
private VideoPlayer videoPlayer;
|
||
|
private int rawImageWidth = 2560;
|
||
|
private int width, height;
|
||
|
|
||
|
private void Awake()
|
||
|
{
|
||
|
videoPlayer = this.GetComponent<VideoPlayer>();
|
||
|
}
|
||
|
|
||
|
public void Initialize( int width, int height )
|
||
|
{
|
||
|
this.width = width;
|
||
|
this.height = height;
|
||
|
|
||
|
if( useWebCam )
|
||
|
{
|
||
|
PlayWebCamera();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PlayVideo();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void PlayWebCamera()
|
||
|
{
|
||
|
WebCamDevice[] devices = WebCamTexture.devices;
|
||
|
if( devices.Length <= webCamIndex )
|
||
|
{
|
||
|
webCamIndex = 0;
|
||
|
}
|
||
|
|
||
|
webCamTexture = new WebCamTexture(devices[webCamIndex].name);
|
||
|
|
||
|
RectTransform rectTransform = rawImage.GetComponent<RectTransform>();
|
||
|
rawImage.texture = webCamTexture;
|
||
|
|
||
|
webCamTexture.Play();
|
||
|
|
||
|
rectTransform.sizeDelta = new Vector2(rawImageWidth, rawImageWidth * webCamTexture.height / webCamTexture.width);
|
||
|
float aspect = (float)webCamTexture.width / webCamTexture.height;
|
||
|
this.transform.localScale = new Vector3(aspect, 1, 1) * scale;
|
||
|
this.GetComponent<Renderer>().material.mainTexture = webCamTexture;
|
||
|
|
||
|
InitializeTexture();
|
||
|
}
|
||
|
|
||
|
private void PlayVideo()
|
||
|
{
|
||
|
videoTexture = new RenderTexture((int)videoPlayer.clip.width, (int)videoPlayer.clip.height, 24);
|
||
|
|
||
|
videoPlayer.renderMode = VideoRenderMode.RenderTexture;
|
||
|
videoPlayer.targetTexture = videoTexture;
|
||
|
|
||
|
RectTransform rectTransform = rawImage.GetComponent<RectTransform>();
|
||
|
rectTransform.sizeDelta = new Vector2(rawImageWidth, (int)(rawImageWidth * videoPlayer.clip.height / videoPlayer.clip.width));
|
||
|
rawImage.texture = videoTexture;
|
||
|
|
||
|
videoPlayer.Play();
|
||
|
|
||
|
float aspect = (float)videoTexture.width / videoTexture.height;
|
||
|
|
||
|
this.transform.localScale = new Vector3(aspect, 1, 1) * scale;
|
||
|
this.GetComponent<Renderer>().material.mainTexture = videoTexture;
|
||
|
|
||
|
InitializeTexture();
|
||
|
}
|
||
|
|
||
|
private void InitializeTexture()
|
||
|
{
|
||
|
GameObject go = new GameObject("Camera", typeof(Camera));
|
||
|
|
||
|
go.transform.parent = this.transform;
|
||
|
go.transform.localScale = new Vector3(-1, -1, 1);
|
||
|
go.transform.localPosition = new Vector3(0, 0, -2);
|
||
|
go.transform.localEulerAngles = Vector3.zero;
|
||
|
|
||
|
Camera camera = go.GetComponent<Camera>();
|
||
|
camera.orthographic = true;
|
||
|
camera.orthographicSize = 0.5f ;
|
||
|
camera.depth = -5;
|
||
|
camera.depthTextureMode = 0;
|
||
|
camera.clearFlags = CameraClearFlags.Color;
|
||
|
camera.backgroundColor = Color.black;
|
||
|
camera.useOcclusionCulling = false;
|
||
|
camera.nearClipPlane = 1.0f;
|
||
|
camera.farClipPlane = 5.0f;
|
||
|
camera.allowMSAA = false;
|
||
|
camera.allowHDR = false;
|
||
|
|
||
|
renderTexture = new RenderTexture(width, height, 0, RenderTextureFormat.RGB565, RenderTextureReadWrite.sRGB)
|
||
|
{
|
||
|
useMipMap = false,
|
||
|
autoGenerateMips = false,
|
||
|
wrapMode = TextureWrapMode.Clamp,
|
||
|
filterMode = FilterMode.Point,
|
||
|
};
|
||
|
|
||
|
camera.targetTexture = renderTexture;
|
||
|
}
|
||
|
}
|