Unity NatCorder

  • 前言
  • 一、NatCorder
  • 二、使用步骤
    • 1.引入库
    • 2.Ui
    • 3.ReplayCam官方脚本
    • 4.UiCanvas
    • 5.缓存路径
  • 总结

前言

一、NatCorder

Unity全平台录屏工具,工具的具体内容在其他博客里都能找到,但找了很多博客内容都差不多,用的时候还要自己去看一下源码,官方的demo在笔记本上都会录制摄像头看到的画面,很不任性,

二、使用步骤

1.引入库

我使用的是NatCorder1.5.1,unity2019版本.在官方三个demo场景Replaycam里面修改来的.最后的效果.添加了一个开始时录屏和结束录屏的按钮,一个录制时长的Text.

2.Ui

如果用到录制摄像头的功能,可以吧里面的预制UI隐藏掉或者删掉,同时添加一个开始和结束录屏的Button和显示录屏时长的Text,
录制视屏的脚本都在ReplayCam上面挂着,最后通过调用它上面的ReplayCam脚本里面的方法,录制.

3.ReplayCam官方脚本

官方脚本,大体上没动过,添加了一些自己理解的注释,和一个
internal Action replayAction;的委托方法,等会要在其他地方赋值,测试时发现录制完成后还要等点时长,可能是转码保存,如果不得他调用完录制完成方法就退出,视屏无法正常播放.

/*
*   NatCorder
*   Copyright (c) 2019 Yusuf Olokoba
*/namespace NatCorder.Examples
{#if UNITY_EDITORusing UnityEditor;
#endifusing UnityEngine;using UnityEngine.UI;using System.Collections;using Clocks;using Inputs;using System;public class ReplayCam : MonoBehaviour{/*** ReplayCam Example* -----------------* This example records the screen using a `CameraRecorder`.* When we want mic audio, we play the mic to an AudioSource and record the audio source using an `AudioRecorder`* -----------------* Note that UI canvases in Overlay mode cannot be recorded, so we use a different mode (this is a Unity issue)*/[Header("Recording")]public int videoWidth = 1280;public int videoHeight = 720;[Header("Microphone")]public bool recordMicrophone;public AudioSource microphoneSource;private MP4Recorder videoRecorder;private IClock recordingClock;private CameraInput cameraInput;private AudioInput audioInput;/// <summary>/// 接収录制完成是的委托方法/// </summary>internal Action replayAction;public void StartRecording(){SetWidthAndHight();// Start recordingrecordingClock = new RealtimeClock();videoRecorder = new MP4Recorder(videoWidth,videoHeight,30,recordMicrophone ? AudioSettings.outputSampleRate : 0,recordMicrophone ? (int)AudioSettings.speakerMode : 0,OnReplay);// Camera.main 设置录制那个摄像机的画面cameraInput = new CameraInput(videoRecorder, recordingClock, Camera.main);if (recordMicrophone){StartMicrophone();audioInput = new AudioInput(videoRecorder, recordingClock, microphoneSource, true);}}private void StartMicrophone(){#if !UNITY_WEBGL || UNITY_EDITOR // No `Microphone` API on WebGL :(// Create a microphone clipmicrophoneSource.clip = Microphone.Start(null, true, 60, 48000);while (Microphone.GetPosition(null) <= 0) ;// Play through audio sourcemicrophoneSource.timeSamples = Microphone.GetPosition(null);microphoneSource.loop = true;microphoneSource.Play();
#endif}public void StopRecording(){// Stop the recording inputsif (recordMicrophone){StopMicrophone();audioInput.Dispose();}cameraInput.Dispose();// Stop recordingvideoRecorder.Dispose();}private void StopMicrophone(){#if !UNITY_WEBGL || UNITY_EDITORMicrophone.End(null);microphoneSource.Stop();
#endif}/// <summary>/// 视频录制完成时调用,在下面上个平台上播放录制的视屏/// </summary>/// <param name="path"></param>private void OnReplay(string path){replayAction();Debug.Log("Saved recording to: " + path);// Playback the video
#if UNITY_EDITOREditorUtility.OpenWithDefaultApp(path);
#elif UNITY_IOSHandheld.PlayFullScreenMovie("file://" + path);
#elif UNITY_ANDROIDHandheld.PlayFullScreenMovie(path);
#endif}/// <summary>/// 设置录制大小/// </summary>private void SetWidthAndHight(){videoWidth = UnityEngine.Screen.width;videoHeight = UnityEngine.Screen.height;}}
}

4.UiCanvas

挂载在上图Canvas上,主要是通过这个脚本来调用ReplayCam脚本上的方法.完成录屏和一些界面提示,

using NatCorder.Examples;
using UnityEngine;
using UnityEngine.UI;
public class UiCanvas : MonoBehaviour
{private Text uiText;private Text btnText;public ReplayCam cam;private int timeNum;private RecordType recordType;void Awake(){uiText = transform.Find("Text").GetComponent<Text>();btnText = transform.Find("Button/Text").GetComponent<Text>();}// Start is called before the first frame updatevoid Start(){transform.Find("Button").GetComponent<Button>().onClick.AddListener(Btn);cam.replayAction += replayAction;}private void OnEnable(){recordType = RecordType.Null; SetRecordType();}private void Btn(){SetRecordType();}void SetRecordType(){switch (recordType){case RecordType.Null:recordType = RecordType.StartRecord;break;case RecordType.StartRecord:StartRectord();recordType = RecordType.StopRecord;break;case RecordType.StopRecord:StopRectord();recordType = RecordType.StartRecord;break;default:break;}btnText.text = recordType == RecordType.StopRecord ? "停止录屏" : "开始录屏";}// Update is called once per framevoid Update(){}/// <summary>/// 开始录屏,调用ReplayCam.StartRecording()方法/// </summary>public void StartRectord(){timeNum = 0;cam.StartRecording();//定时的方法TimerManager.instance.DoLoop(1000, SetTimeText);}/// <summary>/// 结束录屏,调用ReplayCam.StopRectord()方法/// </summary>public void StopRectord(){cam.StopRecording();TimerManager.instance.RemoveHandler(SetTimeText);uiText.text = "正在转译编码,缓存视屏";}/// <summary>/// 设置当前录屏时长/// </summary>public void SetTimeText(){timeNum++;uiText.text = "录屏时长:" + timeNum.ToString() + "秒";}/// <summary>/// sdk录屏,保存完成后调用这个方法/// </summary>private void replayAction(){uiText.text = "视屏保存完成,时长:" + timeNum.ToString() + "秒";}
}
public enum RecordType
{Null,StartRecord,StopRecord}

5.缓存路径

缓存路径的代码在MP4Recorder脚本那上面,我在Pc上开发,所以修改了子Pc端缓存的路径,在这个方法里也开始设置缓存视屏的名字.

  [Doc(@"MP4RecorderCtor")]public MP4Recorder (int videoWidth, int videoHeight, int videoFramerate, int audioSampleRate, int audioChannelCount, Action<string> recordingCallback, int videoBitrate = (int)(960 * 540 * 11.4f), int videoKeyframeInterval = 3) {videoWidth = videoWidth >> 1 << 1;videoHeight = videoHeight >> 1 << 1;var readbackFormat = TextureFormat.RGBA32;var recordingDirectory = Application.persistentDataPath;var recordingFilename = string.Format("recording_{0}.mp4", DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff"));switch (Application.platform) {case RuntimePlatform.OSXEditor:recordingDirectory = Directory.GetCurrentDirectory();goto case RuntimePlatform.OSXPlayer;case RuntimePlatform.OSXPlayer:readbackFormat = TextureFormat.ARGB32;goto case RuntimePlatform.IPhonePlayer;case RuntimePlatform.WebGLPlayer:case RuntimePlatform.WindowsEditor:recordingDirectory = Directory.GetCurrentDirectory();goto case RuntimePlatform.IPhonePlayer;case RuntimePlatform.WindowsPlayer://在Win中视屏缓存路径在包体Exe程序所在目录recordingDirectory = Directory.GetCurrentDirectory();goto case RuntimePlatform.IPhonePlayer;case RuntimePlatform.IPhonePlayer: {var recordingPath = Path.Combine(recordingDirectory, recordingFilename);Debug.Log("下载路径:"+ recordingPath);var nativeRecorder = MediaRecorderBridge.CreateMP4Recorder(videoWidth, videoHeight, videoFramerate, videoBitrate, videoKeyframeInterval, audioSampleRate, audioChannelCount);this.internalRecorder = new MediaRecorderiOS(nativeRecorder, videoWidth, videoHeight, readbackFormat, recordingPath, recordingCallback);break;}case RuntimePlatform.Android: {var recordingPath = Path.Combine(recordingDirectory, recordingFilename);var nativeRecorder = new AndroidJavaObject(@"com.yusufolokoba.natcorder.MP4Recorder", videoWidth, videoHeight, videoFramerate, videoBitrate, videoKeyframeInterval, audioSampleRate, audioChannelCount);this.internalRecorder = new MediaRecorderAndroid(nativeRecorder, videoWidth, videoHeight, recordingPath, recordingCallback);break;}default:Debug.LogError("NatCorder Error: MP4Recorder is not supported on this platform");this.internalRecorder = null; // Self-destruct >:Dbreak;}}

总结

记录NatCorder在Pc端录制视屏的简单demo.
基于natcorder1.5.1版本写的,
找我拿也行,下载也行,下面的下在连接是1.7版本的
csdn下在地址
Gitee地址

Unity NatCorder录屏相关推荐

  1. Unity官方录屏插件Unity Recorder的简单使用

    Unity官方录屏插件Unity Recorder的简单使用 插件简介 导入插件 利用TimeLine录屏 普通录屏 插件功能 参考链接 另 插件简介 Unity Recorder是一个编辑器中的录制 ...

  2. Unity IOS 录屏

    用到的是ios的replaykit,现在使用的unity 2017.1.f3版本已经自己集成了,所以调用相应提供的接口就可以,很简单 但是目前测试会在安装后第一次录屏的时候出现黑屏录屏失败的情况,所以 ...

  3. Recorder丨Unity官方录屏插件使用介绍

    一.利用TimeLine录屏 1.目标: 结合TimeLine,使用Unity Recorder进行录屏并导出视频. 2.操作方法: 1.应用商城导入插件 2.TimeLine左侧右键添加 Recor ...

  4. Unity编辑器录屏神器:Unity Recorder

    摘要:汇报工作进展时你还在使用截屏或者录屏软件?来试试Unity Recorder插件,一站解决截屏.录屏.全景图.全景视频的录制,特别对于异形.超大分辨率有奇效.(本插件仅能在Unity编辑器中使用 ...

  5. unity游戏录屏---shareREC

    1:sdk版本-2.0.2版本,但是用demo里的sdk,用2.0.2的会崩. 2:unity版本 5.3.6... 3:官网:http://rec.mob.com/   文档很清晰了 4:maxFr ...

  6. Recorder教程☀️ Unity官方录屏插件使用介绍

    目录

  7. Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)

    截屏和录屏unity端代码都已经分享过 : Unity功能记录(十七) ------ 截屏功能 Unity插件(二) ------ NatCorder(录屏保存到相册) 但是之前一个个的其实并没有用在 ...

  8. Unity录屏功能插件NatCorder使用简记

    Unity录屏功能插件NatCorder使用简记 简单介绍 插件下载 使用简介 代码 参考链接 简单介绍 NatCorder 是一个轻量级且易于使用的全功能视频录制 API,适用于 iOS.Andro ...

  9. Unity录屏插件Recorder

    Unity Recorder是一个编辑器中的录制工具(仅能用于编辑器中),可以在运行模式下将Unity场景及动画.Timeline录制成动画或视频. 相对于直接录屏有这么几点好处: 可以自定义输出分辨 ...

最新文章

  1. 【Minimum Depth of Binary Tree】cpp
  2. vs2013 编译 notepad++ 源代码 2014-7-23
  3. oracle php
  4. IT架构的本质:工作12年,我的五点感悟
  5. android espresso跨程序,Android Espresso:依次运行多个测试
  6. MySQL 数据库导出导入操作
  7. c语言贪吃蛇咬到尾巴,【图片】C语言小游戏~贪吃蛇【c语言吧】_百度贴吧
  8. MySQL函数、存储过程
  9. 独家 | 强化学习必知二要素——计算效率和样本效率
  10. 1:72 美M26龙式重型坦克拖车
  11. 锂离子电容器_离子电容器:从Mac的App到iOS IPA
  12. java五子棋核心算法_五子棋的核心算法(转)
  13. Unity中UI组件
  14. dp2px px2dp
  15. 利用NI模拟量输出板卡LabVIEW输出正弦波形的方法
  16. 漫威金刚狼男主弃影炒币了?
  17. 【转】用户管理模块:如何保证用户数据安全?
  18. html js 在线预览 pdf word xls等
  19. 纯HTML+CSS+Jquery实现的修改密码框(密码强度动态验证,再次确认验证,密码长度动态显示)均实现,可直接运行使用
  20. 人工智能算法之梯度下降法、协同过滤、相似度技术、ALS算法(附案例分析)、模型存储与加载、推荐系统的冷启动问题

热门文章

  1. 华为手机android9隐藏游戏的方法,Android 9.0隐藏彩蛋揭秘,让手机秒变涂鸦板
  2. vue列表项吸顶 js+css两种 骚操作
  3. 如何将word图片粘贴到FCKEditor里面
  4. Android 垃圾分类APP(四)垃圾分类之图像输入
  5. 86、Reliable Image Dehazing by NeRF
  6. vue3面包屑导航的制作
  7. 分期付款真的很划算吗?谈谈那些你不知道的事儿
  8. Educational Codeforces Round 94 (Rated for Div. 2)题解ABCD
  9. 自动下载cs231n课件
  10. Postman入门教程之详细下载及安装教程