99 lines
3.2 KiB
C#
99 lines
3.2 KiB
C#
|
|
#if UNITY_EDITOR
|
|||
|
|
using System;
|
|||
|
|
using System.IO;
|
|||
|
|
using RenderStreaming;
|
|||
|
|
using Stary.Evo;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using UnityEditor.Recorder;
|
|||
|
|
using UnityEditor.Recorder.Input;
|
|||
|
|
|
|||
|
|
public class EditorGameViewRecorder : IVideoRecorder, IController
|
|||
|
|
{
|
|||
|
|
private RecorderController recorderController;
|
|||
|
|
|
|||
|
|
public bool IsRecording => recorderController != null && recorderController.IsRecording();
|
|||
|
|
|
|||
|
|
/// <summary> Save the video to Application.persistentDataPath. </summary>
|
|||
|
|
/// <value> The full pathname of the video save file. </value>
|
|||
|
|
private string VideoSaveExtension => Path.Combine(Application.persistentDataPath, "Recording");
|
|||
|
|
|
|||
|
|
private string VideoSavePath
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
var timeStamp = DateTime.Now.ToString("yyyy-MM-ddTHH-mm-ss");
|
|||
|
|
var filename =
|
|||
|
|
$"meeting-recording-{this.GetSystem<IGlobalConfigSystem>().GetConnectionId()}-{timeStamp}";
|
|||
|
|
return Path.Combine(Application.persistentDataPath, VideoSaveExtension, filename);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private string _videoSavePath;
|
|||
|
|
public Action OnStartedRecordingVideo { get; set; }
|
|||
|
|
public Action<string> OnStoppedRecordingVideoAction { get; set; }
|
|||
|
|
|
|||
|
|
public void StartRecording()
|
|||
|
|
{
|
|||
|
|
if (IsRecording)
|
|||
|
|
return;
|
|||
|
|
_videoSavePath = VideoSavePath;
|
|||
|
|
|
|||
|
|
var controllerSettings = ScriptableObject.CreateInstance<RecorderControllerSettings>();
|
|||
|
|
recorderController = new RecorderController(controllerSettings);
|
|||
|
|
|
|||
|
|
var movieSettings = ScriptableObject.CreateInstance<MovieRecorderSettings>();
|
|||
|
|
movieSettings.name = "Game View MP4 Recorder";
|
|||
|
|
movieSettings.Enabled = true;
|
|||
|
|
movieSettings.OutputFormat = MovieRecorderSettings.VideoRecorderOutputFormat.MP4;
|
|||
|
|
movieSettings.OutputFile = _videoSavePath;
|
|||
|
|
movieSettings.CaptureAudio = false;
|
|||
|
|
|
|||
|
|
movieSettings.ImageInputSettings = new GameViewInputSettings
|
|||
|
|
{
|
|||
|
|
OutputWidth = 1920,
|
|||
|
|
OutputHeight = 1080
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
controllerSettings.AddRecorderSettings(movieSettings);
|
|||
|
|
controllerSettings.SetRecordModeToManual();
|
|||
|
|
controllerSettings.FrameRate = 30.0f;
|
|||
|
|
controllerSettings.CapFrameRate = true;
|
|||
|
|
|
|||
|
|
recorderController.PrepareRecording();
|
|||
|
|
|
|||
|
|
var started = recorderController.StartRecording();
|
|||
|
|
if (!started)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("Editor Recorder 启动失败,请确认已进入 Play Mode,并安装 com.unity.recorder");
|
|||
|
|
recorderController = null;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Debug.Log($"Editor 开始录制: {_videoSavePath}");
|
|||
|
|
OnStartedRecordingVideo?.Invoke();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StopRecording()
|
|||
|
|
{
|
|||
|
|
if (!IsRecording)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("当前没有正在进行的 Editor 录制");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
recorderController.StopRecording();
|
|||
|
|
|
|||
|
|
if (!File.Exists(_videoSavePath))
|
|||
|
|
OnStoppedRecordingVideoAction?.Invoke(_videoSavePath + ".mp4");
|
|||
|
|
else
|
|||
|
|
Debug.LogError($"Editor MP4 文件不存在,可能还在写入或输出路径变化: {_videoSavePath}");
|
|||
|
|
|
|||
|
|
recorderController = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public IArchitecture GetArchitecture()
|
|||
|
|
{
|
|||
|
|
return MainArchitecture.Interface;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|