using System.Collections; using UnityEngine; using System.IO; using NatSuite.Recorders; using NatSuite.Recorders.Clocks; using NatSuite.Recorders.Inputs; using System; using EZXR.Glass.Core; using EZXR.Glass.Device; namespace EZXR.Glass.Recording { public class RecordingManager : MonoBehaviour { private static RecordingManager instance; public static RecordingManager Instance { get { return instance; } } /// /// 保存状态,0是默认状态,1是正在保存,2是保存完毕 /// public int savingStatus; public bool isRecording; private int width = 1280; private int height = 960; private IMediaRecorder recorder; private CameraInput cameraInput; bool beSave = false; private Coroutine captureCoroutine; private const string gallery_savedDir = "/storage/emulated/0/Pictures/Screenshots"; private void Awake() { instance = this; DontDestroyOnLoad(gameObject); //ARRenderRGB.SetRGBResolution(width, height); } // Start is called before the first frame update void Start() { NormalRGBCameraDevice rgbCameraDevice = new NormalRGBCameraDevice(); int[] sizeRgbCamera = rgbCameraDevice.getCameraSize(); width = sizeRgbCamera[0]; height = sizeRgbCamera[1]; } private void Update() { if (savingStatus == 2) { savingStatus = 0; instance = null; Debug.Log("RecordingManager Saved"); Destroy(gameObject); } } private void OnApplicationPause(bool pause) { if (pause) { HandleRecordingClose(); } } private async void GetPathAsync() { savingStatus = 1; var path = await recorder.FinishWriting(); Debug.Log("Saved Recording to : " + path); Utilities.Android.SendIntent("ToSystem", "com.ezxr.glass.systemui", "RecordingResult", "录屏已保存"); SaveToGallery(path); } public void HandleRecordingOpen() { ARRenderRGB.Instance.HandleARRenderOpen(); var frameRate = 30; var sampleRate = 0; var channelCount = 0; var clock = new RealtimeClock(); recorder = new MP4Recorder(width, height, frameRate, sampleRate, channelCount); Camera renderCam = ARRenderRGB.Instance.gameObject.GetComponent(); cameraInput = new CameraInput(recorder, clock, renderCam); Debug.Log("UNITY LOG ========= Start Record"); isRecording = true; } public void HandleRecordingClose() { if (ARRenderRGB.Instance != null) { ARRenderRGB.Instance.HandleARRenderClose(); } if (cameraInput != null) { cameraInput.Dispose(); } Debug.Log("UNITY LOG ========= Stop Record"); GetPathAsync(); } public void HandleScreenCapture() { Debug.Log("UNITY LOG ========= ScreenCapture, size: " + width + ", " + height); if (captureCoroutine != null) return; ARRenderRGB.Instance.HandleARRenderOpen(); captureCoroutine = StartCoroutine(WaitForScreenCapture()); } private IEnumerator WaitForScreenCapture() { yield return new WaitUntil(() => ARRenderRGB.Instance.isReady); //RGB 相机打开时曝光适配需要时间,0.41s是尝试值,如果实际测试有不够亮,再进行调整 yield return new WaitForSeconds(0.41f); bool status = ARRenderRGB.Instance.HandleARRenderShot(); if (!status) { Debug.Log("UNITY LOG ========= HandleARRenderShot failed! "); Utilities.Android.SendIntent("ToSystem", "com.ezxr.glass.systemui", "RecordingResult", "截屏失败"); captureCoroutine = null; yield break; } else { Debug.Log("UNITY LOG ========= HandleARRenderShot success! "); Utilities.Android.SendIntent("ToSystem", "com.ezxr.glass.systemui", "RecordingResult", "截屏已保存"); } //fix: RT depth为0会引起渲染层级和blend错乱 RenderTexture rt = new RenderTexture(width, height, 24, RenderTextureFormat.DefaultHDR); Camera renderCam = ARRenderRGB.Instance.gameObject.GetComponent(); renderCam.targetTexture = rt; renderCam.Render(); RenderTexture.active = rt; Texture2D screenShot = new Texture2D(width, height, TextureFormat.RGB24, false); screenShot.ReadPixels(new Rect(0, 0, width, height), 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素   screenShot.Apply(); //testRenderer.sharedMaterial.SetTexture("_MainTex", screenShot); // 重置相关参数,以使用camera继续在屏幕上显示   renderCam.targetTexture = null; RenderTexture.active = null; // added to avoid errors GameObject.Destroy(rt); var imageName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg"; var imagePath = Path.Combine(Application.persistentDataPath, imageName); var bytes = screenShot.EncodeToJPG(); File.WriteAllBytes(imagePath, bytes); Debug.Log("UNITY LOG ========= ScreenCapture, save jpg at path: " + imagePath); SaveToGallery(imagePath); captureCoroutine = null; ARRenderRGB.Instance.HandleARRenderClose(); //if (toastCoroutine != null) StopCoroutine(toastCoroutine); //toastCoroutine = StartCoroutine(WaitForToastTips()); } private void SaveToGallery(string src_path) { Debug.Log("UNITY LOG =========, save to gallery from: " + src_path); var dst_dir = NativeLib.GetScreenshotsPath(); if (string.IsNullOrEmpty(dst_dir) || !Directory.Exists(dst_dir)) { dst_dir = Path.GetDirectoryName(gallery_savedDir); } var dst_path = Path.Combine(dst_dir, Path.GetFileName(src_path)); File.Move(src_path, dst_path); Debug.Log("UNITY LOG =========, saved to gallery at: " + dst_path); NativeLib.AddToAlbum(dst_path); Debug.Log("UNITY LOG =========, AddToAlbum at: " + dst_path); //var src_name = Path.GetFileNameWithoutExtension(src_path); //AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //AndroidJavaObject currentActivity = unityPlayerClass.GetStatic("currentActivity"); //AndroidJavaObject contentResolver = currentActivity.Call("getContentResolver"); //// 调用insertImage保存到相册 //AndroidJavaClass galleryClass = new AndroidJavaClass("android.provider.MediaStore$Images$Media"); //AndroidJavaObject galleryObject = new AndroidJavaObject("java.io.File", src_path); //AndroidJavaObject galleryUri = galleryClass.CallStatic("insertImage", // contentResolver, galleryObject.Call("getAbsolutePath"), src_name, ""); //Debug.Log("UNITY LOG =========, saved to gallery!"); //File.Delete(src_path); savingStatus = 2; } } }