using System.Collections; using System.Collections.Generic; using System; using System.IO; using UnityEngine; using RenderHeads.Media.AVProMovieCapture; public class ScreenCaptureManager : MonoBehaviour { public static ScreenCaptureManager instance; public CaptureBase m_Capture; public CaptureFromScreen captureFromScreen; private string m_FileNamePrefix; public string m_FilePath; void Awake() { instance = this; } // Start is called before the first frame update void Start() { CaptureInit(); } /// /// 设置视频格式 /// public void CaptureInit() { m_Capture = GameObject.Find("ScreenCapture").GetComponent(); captureFromScreen = GameObject.Find("ScreenCapture").GetComponent(); m_Capture._useMediaFoundationH264 = true; m_Capture._autoFilenameExtension = "mp4"; string[] strList = File.ReadAllLines(Application.streamingAssetsPath + "/VideoPlayBackConfig.ini"); if (strList.Length != 0) { m_Capture._downScale = (CaptureBase.DownScale)Enum.Parse(typeof(CaptureBase.DownScale), strList[1].Split('=')[1].Trim()); string str = strList[3].Split('=')[1]; int x = int.Parse(str.Split('*')[0]); int y = int.Parse(str.Split('*')[1]); m_Capture._maxVideoSize = new Vector2(x, y); m_Capture._frameRate = CaptureBase.FrameRate.Ten; } } public void StartCapture(string path, string videoMame) { m_Capture._outputFolderPath = path; m_Capture._autoFilenamePrefix = videoMame; if (!m_Capture.IsCapturing()) { m_FilePath = path;//m_Capture.LastFilePath; m_Capture.StartCapture(); } } public void PauseCapture() { m_Capture.PauseCapture(); } public void ResumeCapture() { m_Capture.ResumeCapture(); } public void StopCapture() { if (m_Capture != null && m_Capture.IsCapturing()) { m_Capture.StopCapture(); } } /// /// 设置输出视频前缀 /// private void FilenamePrefix(string traintype, string shiptype, string subjectname, string user) { m_FileNamePrefix = string.Format("${0}${1}${2}${3}$", traintype, shiptype, subjectname, user); //m_Capture._autoFilenamePrefix = string.Format("${0}${1}${2}${3}$", traintype,shiptype,subjectname, user); m_Capture._autoFilenamePrefix = m_FileNamePrefix; } /// /// 输出文件路径 /// private void FolderPath() { string date = string.Format("{0}_{1}_{2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); m_Capture._outputFolderPath = Path.Combine("ScreenCaptures", date); } private void OnDestroy() { StopCapture(); } [ContextMenu("Start ScreenShoot")] private void StartScreenShoot() { string[] str = m_FilePath.Split('\\'); string fileName = str[str.Length - 1].Split('.')[0]; string date = string.Format("{0}_{1}_{2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); string projectFolder = Path.GetFullPath(Path.Combine(Application.dataPath, "..", "PrintScreens", date)); if (!Directory.Exists(projectFolder)) Directory.CreateDirectory(projectFolder); StartCoroutine(ScreenShoot(Path.Combine(projectFolder, fileName + ".png"))); } private IEnumerator ScreenShoot(string filePath) { yield return new WaitForEndOfFrame(); RenderTexture rt = new RenderTexture(Screen.width, Screen.height, 24); Texture2D screenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); Camera ca = GameObject.FindGameObjectWithTag("ThirdCamera").GetComponent(); ca.targetTexture = rt; ca.Render(); ca.targetTexture = null; RenderTexture.active = rt; screenShot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); ca.targetTexture = null; RenderTexture.active = null; Destroy(rt); yield return 0; byte[] bytes = screenShot.EncodeToPNG(); File.WriteAllBytes(filePath, bytes); } }