Unity 使用AVProMovieCapture實現Game視圖屏幕錄制

內容將會持續更新,有錯誤的地方歡迎指正,謝謝!
?

Unity 使用AVProMovieCapture實現Game視圖屏幕錄制
? ? ?
TechX 堅持將創新的科技帶給世界!

擁有更好的學習體驗 —— 不斷努力,不斷進步,不斷探索
TechX —— 心探索、心進取!

助力快速掌握 AVProMovieCapture 屏幕錄制

為初學者節省寶貴的學習時間,避免困惑!


文章目錄

  • 一、導入AVProMovieCapture包
  • 二、屏幕捕捉基本設置
  • 三、實現Game視圖屏幕捕捉功能
    • 1、屏幕捕捉功能
    • 2、視頻列表功能
    • 3、視頻播放功能
  • 四、MovieCapture項目地址


一、導入AVProMovieCapture包


在Asset Store資源商店里面可以下載這個插件:

https://assetstore.unity.com/packages/tools/video/avpro-movie-capture-desktop-edition-221914

目前這個插件比較貴,以下提供了老一點的版本,也是可以用的。
https://download.csdn.net/download/caiprogram123/89517225

下載之后解壓,并把這個包導入到Unity中,可以看到RenderHeads/AVProMovieCapture

在這里插入圖片描述



二、屏幕捕捉基本設置


在開始錄制Game視圖時要對錄制做一些基本的設置:

  • 輸出文件夾類型:輸出視頻到哪個位置
    在這里插入圖片描述

  • 輸出子文件夾:輸出視頻位置的子文件夾

  • 分辨率:設置視頻的分辨率
    在這里插入圖片描述

  • 幀率:設置視頻的幀率

  • 視頻前綴:設置視頻名稱的前綴

//視頻輸出路徑
public string videoOutFolder;
//視頻輸出路徑類型
public OutputPath outputFolderType = defaultOutputFolderType;
//視頻輸出文件夾
public string outputFolderPath = defaultOutputFolderPath;//視頻降分辨率
public CaptureBase.DownScale downScale = CaptureBase.DownScale.Original;
//視頻幀率
public float frame = 60;
//視頻前綴
public string prefix = "ScreenCapture";/// <summary>
/// 設置視頻輸出路徑
/// </summary>
private void SetOutFolderPath()
{videoOutFolder = GetFolder(outputFolderType, outputFolderPath);if (!Directory.Exists(videoOutFolder))Directory.CreateDirectory(videoOutFolder);_movieCapture.OutputFolderPath = videoOutFolder;
}/// <summary>
/// 設置視頻畫質
/// </summary>
private void SetDownScale()
{_movieCapture.ResolutionDownScale = downScale;
}/// <summary>
/// 設置幀率
/// </summary>
private void SetFrameRate()
{_movieCapture.FrameRate = frame;}/// <summary>
/// 設置文件前綴
/// </summary>
private void SetPrefix()
{_movieCapture.FilenamePrefix = prefix;
}


三、實現Game視圖屏幕捕捉功能


1、屏幕捕捉功能


在導入包后就可以進行屏幕錄制功能開發,包含開始錄頻、結束錄頻、查看最近錄制,同時在錄制的過程中也能夠看到當前當前錄制視頻的大小和時長。

 private long _lastFileSize;private uint _lastEncodedMinutes;private uint _lastEncodedSeconds;private uint _lastEncodedFrame;private StringBuilder _fileSize = new StringBuilder();private StringBuilder _videoLength = new StringBuilder();/// <summary>/// 開始錄制/// </summary>private void StartCapture(){_lastFileSize = 0;_lastEncodedMinutes = _lastEncodedSeconds = _lastEncodedFrame = 0;if (_movieCapture != null){_movieCapture.StartCapture();startRecord.interactable = false;stopRecord.interactable = true;}}/// <summary>/// 停止錄制/// </summary>private void StopCapture(){if (_movieCapture != null){if (_movieCapture.IsCapturing()){_movieCapture.StopCapture();startRecord.interactable = true;stopRecord.interactable = false;}}}/// <summary>/// 文件大小設置/// </summary>/// <param name="lastFileSize"></param>private void FileSize(){_lastFileSize = _movieCapture.GetCaptureFileSize();_fileSize.Clear();_fileSize.Append((_lastFileSize / (1024f * 1024f)).ToString("F1"));_fileSize.Append("MB");}/// <summary>/// 視頻長度設置/// </summary>private void VideoLength(){if (!_movieCapture.IsRealTime){_lastEncodedSeconds = (uint)Mathf.FloorToInt(_movieCapture.CaptureStats.NumEncodedFrames / _movieCapture.FrameRate);}else{_lastEncodedSeconds = _movieCapture.CaptureStats.TotalEncodedSeconds;}_lastEncodedMinutes = _lastEncodedSeconds / 60;_lastEncodedSeconds = _lastEncodedSeconds % 60;_lastEncodedFrame = _movieCapture.CaptureStats.NumEncodedFrames % (uint)_movieCapture.FrameRate;_videoLength.Clear();_videoLength.Append(_lastEncodedMinutes.ToString("00"));_videoLength.Append(":");_videoLength.Append(_lastEncodedSeconds.ToString("00"));_videoLength.Append(".");_videoLength.Append(_lastEncodedFrame.ToString("000"));}
  • 開始錄制: 開始進行Game視圖錄制
  • 結束錄制: 結束錄制,錄制結束后,視頻會進進行保存
  • 最新錄制: 顯示最近錄制的視頻記錄
  • File Size: 當前錄制視頻的文件大小
  • Video Length: 當前錄制視頻的時長

在這里插入圖片描述

2、視頻列表功能


在視頻錄制完成后,會將視頻信息進行保存,當點擊最新錄制會顯示視頻列表窗口,在這里你可以找到所有的最近錄制的視頻記錄。

public class RecordList : MonoBehaviour
{public RecordItem recordItemPre;private List<RecordItem> records = new List<RecordItem>();/// <summary>/// 初始化記錄表/// </summary>/// <param name="saveInfos"></param>public void InitRecordList(List<VideoInfo> videoList){gameObject.SetActive(true);for (int i = 0; i < records.Count; i++){Destroy(records[i].gameObject);}records.Clear();for (int i = 0; i < videoList.Count; i++){RecordItem recordItem = Instantiate(recordItemPre, recordItemPre.transform.parent);recordItem.InitRecordItem(videoList[i]);records.Add(recordItem);recordItem.gameObject.SetActive(true);}}
}
 public class RecordItem : MonoBehaviour{public Text videoName;public Text videoSize;public Text videoLength;public Text lastModifyTime;public Button view;public VideoControl videoControl;private VideoInfo videoInfo;// Start is called before the first frame updatevoid Start(){view.onClick.AddListener(() => {videoControl.VideoControlInit(videoInfo.videoPath);});}/// <summary>/// 初始化記錄表/// </summary>/// <param name="saveInfo"></param>public void InitRecordItem(VideoInfo videoInfo){this.videoInfo = videoInfo;videoName.text = videoInfo.videoName;videoSize.text = (videoInfo.videoSize / (1024f * 1024f)).ToString("F1") + "MB";videoLength.text = (videoInfo.videoLength / 60).ToString("00") + ":" + (videoInfo.videoLength % 60).ToString("00");lastModifyTime.text = videoInfo.lastModifyTime;}}
  • 名稱: 視頻名稱
  • 大小: 視頻文件大小
  • 時長: 視頻時長
  • 最后修改: 視頻保存時間
  • 查看: 播放視頻

在這里插入圖片描述

3、視頻播放功能


在視頻列表中,點擊查看按鈕就可以播放該視頻。

public class VideoControl : MonoBehaviour
{public Text title;public VideoPlayer player;public Slider videoSlider;public Button close;public Text videotime;public Text videoLength;string videoPath;private void Update(){if (player.isPlaying){SetCurPlayTime();SetPlaySchedule();}}private void Awake(){player.prepareCompleted += OnPrepareCompleted;}private void OnDestroy(){player.prepareCompleted -= OnPrepareCompleted;}public void VideoControlInit(string videoPath){this.videoPath = videoPath;gameObject.SetActive(true);SetVideoPlayPath(videoPath);PlayVideo();}/// <summary>/// 視頻準備/// </summary>/// <param name="videoSource"></param>private void OnPrepareCompleted(VideoPlayer videoSource){SetVideoName();SetVideoLength();}/// <summary>/// 設置視頻名稱/// </summary>private void SetVideoName(){title.text = Path.GetFileNameWithoutExtension(videoPath);}/// <summary>/// 設置播放器路徑/// </summary>/// <param name="path"></param>public void SetVideoPlayPath(string path){player.url = path;}/// <summary>/// 當前視頻播放時間/// </summary>private void SetCurPlayTime(){videotime.text = TimeProcess(player.time);}/// <summary>/// 設置視頻時長/// </summary>/// <param name="length"></param>private void SetVideoLength(){videoLength.text = TimeProcess(player.length);}/// <summary>/// 設置播放進度/// </summary>private void SetPlaySchedule(){videoSlider.value = (float)player.frame / player.frameCount;}/// <summary>/// 時間處理/// </summary>/// <param name="time"></param>/// <returns></returns>private string TimeProcess(double time){int minutes = (int)time / 60;int seconds = (int)time % 60;return minutes.ToString("00") + ":" + seconds.ToString("00");}/// <summary>/// 視頻播放/// </summary>public void PlayVideo(){player.Play();}
}

視頻播放時,會顯示視頻名稱、時長、當前時間和播放進度

在這里插入圖片描述


四、MovieCapture項目地址


項目完整地址:

https://gitcode.com/CTLittleNewbie/ScreenRecord_240520/





TechX —— 心探索、心進取!

每一次跌倒都是一次成長

每一次努力都是一次進步

END
感謝您閱讀本篇博客!希望這篇內容對您有所幫助。如果您有任何問題或意見,或者想要了解更多關于本主題的信息,歡迎在評論區留言與我交流。我會非常樂意與大家討論和分享更多有趣的內容。
如果您喜歡本博客,請點贊和分享給更多的朋友,讓更多人受益。同時,您也可以關注我的博客,以便及時獲取最新的更新和文章。
在未來的寫作中,我將繼續努力,分享更多有趣、實用的內容。再次感謝大家的支持和鼓勵,期待與您在下一篇博客再見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40791.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【云計算】公有云、私有云、混合云、社區云、多云

公有云、私有云、混合云、社區云、多云 1.云計算的形態1.1 公有云1.2 私有云1.3 混合云1.4 社區云1.5 多云1.5.1 多云和混合云之間的關系1.5.2 多云的用途1.5.3 影子 IT 和多云1.5.4 優缺點 2.不同云形態的對比 1.云計算的形態 張三??在家做飯吃&#xff0c;這是 私有云&…

liunx上修改Firefox版本號

在Linux上修改Firefox的版本號并不直接推薦也不鼓勵&#xff0c;因為這可能會影響到瀏覽器的安全性、兼容性和自動更新功能。但如果你因為某些特殊測試場景確實需要修改其顯示的版本號&#xff08;請注意&#xff0c;這樣做可能會引發不可預料的問題&#xff09;&#xff0c;可…

【擴散模型】LCM LoRA:一個通用的Stable Diffusion加速模塊

潛在一致性模型&#xff1a;[2310.04378] Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (arxiv.org) 原文&#xff1a;Paper page - Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (…

ELK優化之Filebeat部署

目錄 1.安裝配置Nginx 2.安裝 Filebeat 3.設置 filebeat 的主配置文件 4.修改Logstash配置 5.啟動配置 6.kibana驗證 主機名ip地址主要軟件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

【鎖】各種鎖的概念

解釋一下什么是樂觀鎖、悲觀鎖、自旋鎖、互斥鎖、讀寫鎖、排他鎖、共享鎖、統一鎖、分段鎖&#xff1f; 定義角度不同&#xff0c;通常把&#xff08;樂觀鎖、悲觀鎖&#xff09;、&#xff08;自旋鎖、互斥鎖&#xff09;、&#xff08;讀寫鎖、排他鎖、共享鎖&#xff09;、…

Redis---9---集群(cluster)

將新增的6387節點&#xff08;空槽號&#xff09;作為master節點加入原集群 Redis—9—集群&#xff08;cluster&#xff09; 是什么 定義 ? 由于數據量過大&#xff0c;單個Master復制集難以承擔&#xff0c;因此需要對多個復制集進行集群&#xff0c;形成水平擴展每個復…

Selenium 切換窗口

環境&#xff1a; Python 3.8 selenium3.141.0 urllib31.26.19說明&#xff1a; driver.current_window_handle # 返回當前窗口的句柄 driver.window_handles # 返回當前由driver啟動所有窗口句柄&#xff0c;是個列表 driver.switch_to.window(handle) # 根據 handle 切換窗口…

5個實用的文章生成器,高效輸出優質文章

在自媒體時代&#xff0c;優質內容的持續輸出是吸引讀者、提升影響力的關鍵。然而&#xff0c;對于許多自媒體創作者來說&#xff0c;頻繁的創作難免會遭遇靈感枯竭、創作不出文章的困擾。此時&#xff0c;文章生成器便成為了得力的助手。文章生成器的優勢能夠快速自動生成高質…

代碼隨想錄算法訓練營第13天|二叉樹的遞歸遍歷、二叉樹的迭代遍歷、二叉樹的統一迭代法、102.二叉樹的層序遍歷

打卡Day13 1.理論基礎2.二叉樹的遞歸遍歷3.二叉樹的迭代遍歷3.二叉樹的統一迭代法4.102.二叉樹的層序遍歷擴展107. 二叉樹的層序遍歷 II199.二叉樹的右視圖637.二叉樹的層平均值429.N叉樹的層序遍歷515.在每個樹行中找最大值116.填充每個節點的下一個右側節點指針117. 填充每個…

如何保證接口冪等性

如何保證接口冪等性 1、冪等性是什么&#xff1f; 接口冪等性是指用戶對于同一操作發起的一次請求或者多次請求的結果是一致的&#xff0c;不會因為多次點擊而產生了不同的結果。 2、使用冪等性的場景有哪些&#xff1f; 頁面點擊保存按鈕時&#xff0c;不小心快速點了兩次…

Python面試題-6

1. 請解釋Python中的動態類型。 Python中的動態類型 Python是一種動態類型語言&#xff0c;這意味著你不需要在編程時聲明變量的類型&#xff0c;而是在運行時自動推斷類型。在Python中&#xff0c;變量的類型是在程序運行時決定的&#xff0c;這意味著同一個變量可以在不改變…

上萬組風電,光伏,用戶負荷數據分享

上萬組風電&#xff0c;光伏&#xff0c;用戶負荷數據分享 可用于風光負荷預測等研究 獲取鏈接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取碼&#xff1a;381i 獲取鏈接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…

一行代碼用git新建分支

1.在本地創建分支 dev git branch dev2.切換分支 git checkout devwebstorm操作如下&#xff1a; 3.推送新分支到遠程 git push --set-upstream origin 分支名webstorm操作如下&#xff1a;提交代碼的時候會自動推送到遠程 4.到git上面可以看看剛剛推送的內容 dev多推送…

Proxmox VE 8虛擬機直通USB磁盤

作者&#xff1a;田逸&#xff08;fromyz&#xff09; 今天有個兄弟發消息&#xff0c;咨詢怎么讓插在服務器上的U盾被Proxmox VE上的虛擬機識別。在很久很久以前&#xff0c;我嘗試過在Proxmox VE 5以前的版本創建windows虛擬機&#xff0c;并把插在Proxmox VE宿主機上的銀行U…

基于STM32設計的智能喂養系統(ESP8266+微信小程序)175

基于STM32設計的牛羊喂養系統(微信小程序)(175) 文章目錄 一、前言1.1 項目介紹【1】項目功能介紹【2】項目硬件模塊組成【3】ESP8266工作模式配置【4】上位機開發【5】項目模塊劃分1.2 項目功能需求1.3 項目開發背景1.4 開發工具的選擇1.5 系統框架圖1.6 系統原理圖1.7 硬件實…

Android ViewPostImeInputStage輸入事件處理

InputDispatcher向InputChannel使用socket寫入輸入事件&#xff0c;觸發InputEventReceiver調用來接收輸入事件。 ViewPostImeInputStage處理view控件的事件 frameworks/base/core/java/android/view/InputEventReceiver.java dispatchInputEvent frameworks/base/core/jav…

SwinTransformer的相對位置索引的原理以及源碼分析

文章目錄 1. 理論分析2. 完整代碼 引用&#xff1a;參考博客鏈接 1. 理論分析 根據論文中提供的公式可知是在 Q Q Q和 K K K進行匹配并除以 d \sqrt d d ? 后加上了相對位置偏執 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

絕了,華為伸縮攝像頭如何突破影像邊界?

自華為Pura70 Ultra超聚光伸縮鏡頭誕生以來&#xff0c;備受大家的關注&#xff0c;聽說這顆鏡頭打破了傳統手機的攝像頭體積與鏡頭的設計&#xff0c;為我們帶來了不一樣的拍照體驗。 智能手機飛速發展的今天&#xff0c;影像功能已經成為我們衡量一款手機性能的重要指標。想…

MySQL中mycat與mha應用

目錄 一.Mycat代理服務器 1.Mycat應用場景 2.mycat安裝目錄結構說明 3.Mycat的常用配置文件 4.Mycat日志 5.mycat 實現讀寫分離 二.MySQL高可用 1.原理過程 2.MHA軟件 3.實現MHA 一.Mycat代理服務器 1.Mycat應用場景 Mycat適用的場景很豐富&#xff0c;以下是幾個典型…

進程輸入輸出及終端屬性學習

進程的標準輸入輸出 當主進程fork或exec子進程&#xff0c;文件描述符被繼承&#xff0c;因此0,1,2句柄也被繼承&#xff0c;從而使得telnet等服務&#xff0c;可以做到間接調用別的shell或程序。比如如果是遠程登錄使用的zsh&#xff0c;那么其會重定向到相應的pts $ ps|gre…