EasyAR Unity3D录屏功能

2020-04-14  本文已影响0人  橙果子

录屏功能成为了每个AR APP 的标配。确实,通过录屏技术我们可以记录我们当前操作手机时所看到的一些惊艳画面(尤其对于AR而言),目前市面上有许多的录屏集成方案,但单纯对于AR开发而言,EasyAR SDK2.0无疑是最好的选择。2.0的Pro版本为我们集成了录屏技术,甚至不需要写任何代码,便可以轻松实现。

录屏官网没有文档介绍, 但是有Demo提供, EasyAR 4.0参考如下

EasyAR官网demo下载地址

image.png

EasyAR打包报错 Recorder not available when using muti-thread rendening

录屏报错截图

解决方案

录屏报错解决方案

2.0版本录屏功能介绍如下

开发预览:

1.点击按钮,出现start文字(大约2s后字体消失,主要是给用户一个提示)


image.png

2.可以拖动识别后出现的物体(旋转或放大,以前的教程: EasyAR开发技巧---模型交互操作 ),主要是体现录屏的效果

3.再次点击按钮,出现视频保存路径


image.png

然后录制的视频就会默认保存到(/sdcard/Movies) 路径下
比如:


image.png
image.png

4.EasyAR SDK 的强大之处在于录屏时不会录取UI层

开发素材:

按钮(不得商用):链接: [图片上传失败...(image-fd1ea-1586849405563)]

https://pan.baidu.com/s/1slbkAzr 密码: 4qbs

Step 1:准备

我们在官网下载EasyAR 2.0 Pro 版本的samples
ps:以后我们的开发都在官方的sample 基础上进行开发,这样可以提高我们的开发效率。


image.png

然后解压之后,在unity里打开" HelloARRecording "

image.png

在unity中打开" HelloARRecording " 场景,首先填写Key值。在官网上申请Key(需要开通Pro功能)

image.png

我们可以尝试着将其打包成APK在移动端运行看下效果(录屏功能目前只支持在移动端测试,pc端不支持)。

Step2:给模型添加交互

接下来我们需要给模型添加手势交互操作,这样在录屏起来效果更加明显。默认的场景下有两张识别图,我们选择一张作为测试。


image.png

添加脚本:这是一段移动端手势交互操作的脚本,在之前的文章中也有说过( EasyAR开发技巧---模型交互操作 )。大家可以将其作为模版来使用,只需要修改一些简单的变量数值来达到你想要的效果。

脚本下载地址:链接: [图片上传失败...(image-db439-1586849405562)]

https://pan.baidu.com/s/1gePtFVX 密码: 4g2n

using  UnityEngine;

using  System.Collections;

public   class   Gesture  :  MonoBehaviour  {

     private   Touch  oldTouch1;  

     private   Touch  oldTouch2;  

     void  Update()
    {
         if  ( Input .touchCount <=  0 )
        {
             return ;
        }
         if  ( 1  ==  Input .touchCount)
        {
             Touch  touch =  Input .GetTouch( 0 );
             Vector2  deltaPos = touch.deltaPosition;
            transform.Rotate( Vector3 .down * deltaPos.x,  Space .World);
        }
         Touch  newTouch1 =  Input .GetTouch( 0 );

         Touch  newTouch2 =  Input .GetTouch( 1 );

         if  (newTouch2.phase ==  TouchPhase .Began)

        {
            oldTouch2 = newTouch2;

            oldTouch1 = newTouch1;

             return ;
        }
         float  oldDistance =  Vector2 .Distance(oldTouch1.position, oldTouch2.position);

         float  newDistance =  Vector2 .Distance(newTouch1.position, newTouch2.position);

         float  offset = newDistance - oldDistance;

         float  scaleFactor = offset /  200f ;

         Vector3  localScale = transform.localScale;

         Vector3  scale =  new   Vector3 (localScale.x + scaleFactor,

            localScale.y + scaleFactor,

            localScale.z + scaleFactor);

         if  (scale.x >=  0.05f  && scale.y >= 0.05f  && scale.z >=  0.05f )
        {
            transform.localScale = scale;
        }
        oldTouch1 = newTouch1;
        oldTouch2 = newTouch2;

    }

}

然后添加给指定的模型就ok


image.png

Step 3:UI

创建UI之前,我们先来分析一下与录屏功能有关的组件和脚本。
1.首先是绑定在" EasyAR_Startup " 组件上的脚本----" HelloARRecording.cs ",它是我们实现录屏功能的主要脚本文件。里面有两个重要的方法--- StartRecord(),StopRecord() ,分别控制录屏的开始与结束。

StartRecord()

   public   void  StartRecord()
        {
             string  path_root =  Application .persistentDataPath +  "/" ;
             if  ( Application .platform ==  RuntimePlatform .Android)
                path_root =  "/sdcard/Movies/" ;
             ARBuilder .Instance.RecorderBehaviour.OutputFile = path_root +  "EasyAR_Recording_"  + System. DateTime .Now.ToString( "yyyy-MM-dd_HH-mm-ss" ) +  ".mp4" ;

             ARBuilder .Instance.RecorderBehaviour.StartRecording();
            isRecording =  true ;
            StartShowMessage =  true ;
        }

注意保存的默认路径: "/sdcard/Movies/" + "yyyy-MM-dd_HH-mm-ss.mp4"

StopRecord():
public   void  StopRecord()
        {
             ARBuilder .Instance.RecorderBehaviour.StopRecording();
            isRecording =  false ; }

2.关于 Recorder 组件与它上面绑定的 RecorderBehaviour 脚本


image.png

该脚本主要是处理录屏后视频的保存质量等信息。


image.png

我们接下来实现UI部分,关于UI,你可以用unity自带的,也可以用NGUI。
关于NGUI的插件资源:链接: [图片上传失败...(image-d825be-1586849449526)]

https://pan.baidu.com/s/1geFQmen 密码: py7u

在本次的案例中我使用的是NGUI,首先创建一个" 2D Sprite " 命名为Button。


image.png

修改它的图片:


image.png

并绑定Button事件。然后创建一个Label,用于显示我们的文字提示信息。将label调整好合适大小,默认label 里的text内容为空。
效果如下:


image.png

Step 4:修改脚本

我们主要在" HelloARRecording " 这上面做功夫,它是我们实现录屏的核心代码。原" HelloARRecording " 脚本是通过OnGUI来实现按钮,但是没有文字提示,体验不是很好,所以我们主要修改的内容是:
1.用我们的Button替换OnGUI的显示,并绑定事件。

2.点击Button 时有相应的文字提示。

首先注释掉OnGUI()方法,创建两个 协程 ,主要控制文字的显示时间。

示例:

开头定义label之后:

IEnumerator  showMessage1()
        {
            label.gameObject.SetActive ( true );
            label.text =  "Start" ;
             yield   return   new   WaitForSeconds ( 2f );
            label.gameObject.SetActive ( false );
        }
IEnumerator  showMessage2()
        {
            label.gameObject.SetActive ( true );
            label.text =  "Recorded at "  +  ARBuilder .Instance.RecorderBehaviour.OutputFile;
             yield   return   new   WaitForSeconds ( 2f );
            label.gameObject.SetActive ( false );
        }

接着我们写一个方法: Record(),主要是通过一个bool标志位来实现按钮的点击。

         public   void  Record()
        {
             if  (!isClick) {

                StartRecord ();

                StartCoroutine (showMessage1());
                isClick =  true ;
            }  else  {

                StopRecord ();

                StartCoroutine (showMessage2());

                isClick =  false ;
            }

        }

然后我们在unity里为该Button绑定Record() 方法即可。
代码比较简单,完整代码:链接: [图片上传失败...(image-42252e-1586849449525)]

https://pan.baidu.com/s/1geBM7fX 密码: j7m8。

然后我们在移动端测试,点击按钮,就会开始录制,并且时长不受限制,录制效果很赞。

实现了录屏功能,另一个需求就是分享我们的视频到朋友圈等等,所以下一部分我们会接着实现分享功能。

HelloARRecording.cs附上代码

//=============================================================================================================================
//
// Copyright (c) 2015-2017 VisionStar Information Technology (Shanghai) Co., Ltd. All Rights Reserved.
// EasyAR is the registered trademark or trademark of VisionStar Information Technology (Shanghai) Co., Ltd in China
// and other countries for the augmented reality technology developed by VisionStar Information Technology (Shanghai) Co., Ltd.
//
//=============================================================================================================================
 
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
 
namespace EasyAR
{
    public class HelloARRecording : MonoBehaviour
    {
        private const string title = "Please enter KEY first!";
        private const string boxtitle = "===PLEASE ENTER YOUR KEY HERE===";
        private const string keyMessage = ""
            + "Steps to create the key for this sample:\n"
            + "  1. login www.easyar.com\n"
            + "  2. create app with\n"
            + "      Name: HelloARRecording (Unity)\n"
            + "      Bundle ID: cn.easyar.samples.unity.helloarrecording\n"
            + "  3. find the created item in the list and show key\n"
            + "  4. replace all text in TextArea with your key";
 
        public GUISkin skin;
        private bool isRecording = false;
        private bool isShowing = false;
        public bool StartShowMessage = false;
        private bool isClick = false;
        public UILabel label;
        private void Awake()
        {
            var EasyARBehaviour = FindObjectOfType<EasyARBehaviour>();
            if (EasyARBehaviour.Key.Contains(boxtitle))
            {
#if UNITY_EDITOR
                UnityEditor.EditorUtility.DisplayDialog(title, keyMessage, "OK");
#endif
                Debug.LogError(title + " " + keyMessage);
            }
            EasyARBehaviour.Initialize();
 
            if (ARBuilder.Instance.RecorderBehaviour)
                ARBuilder.Instance.RecorderBehaviour.StatusUpdate += OnRecorderUpdate;
 
            if (Application.platform == RuntimePlatform.Android)
            {
                DirectoryInfo dir = new DirectoryInfo("/sdcard/Movies/");
                if (!dir.Exists)
                    Directory.CreateDirectory("/sdcard/Movies/");
            }
        }
 
        public void StartRecord()
        {
            string path_root = Application.persistentDataPath + "/";
            if (Application.platform == RuntimePlatform.Android)
                path_root = "/sdcard/Movies/";
            ARBuilder.Instance.RecorderBehaviour.OutputFile = path_root + "EasyAR_Recording_" + System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".mp4";
 
            ARBuilder.Instance.RecorderBehaviour.StartRecording();
            isRecording = true;
            StartShowMessage = true;
        }
 
        public void StopRecord()
        {
            ARBuilder.Instance.RecorderBehaviour.StopRecording();
            isRecording = false;
            
        }
 
 
        public void Record()
        {
            if (!isClick) {
             
                StartRecord ();
                /*
                label.text = "Start";
                label.GetComponent<TweenScale> ().PlayForward ();
                */
                StartCoroutine (showMessage1());
                isClick = true;
            } else {
             
                StopRecord ();
                /*
                label.GetComponent<TweenScale> ().PlayReverse ();
 
                label.text ="Recorded at " + ARBuilder.Instance.RecorderBehaviour.OutputFile;
                */
                StartCoroutine (showMessage2());
 
                isClick = false;
            }
 
 
        }
         void OnRecorderUpdate(RecorderBaseBehaviour recorder, RecorderBaseBehaviour.Status status, string msg)
        {
            Debug.Log("Recorder Status: " + status + " msg: " + msg);
            if (status == RecorderBaseBehaviour.Status.OnStopped)
                isRecording = false;
        }
 
        /*
        void OnGUI()
        {
            if (StartShowMessage)
            {
                if (!isShowing)
                    StartCoroutine(showMessage());
                StartShowMessage = false;
            }
            if (isShowing)
            {
                if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
                    GUI.Box(new Rect(10, Screen.height / 2, Screen.width - 20, 60), "Recorded at " + ARBuilder.Instance.RecorderBehaviour.OutputFile);
                else
                    GUI.Box(new Rect(10, Screen.height / 2, Screen.width - 20, 60), "Recording is available only on Android & iOS. Win32 & Mac will be supported in later EasyAR versions.");
            }
 
            if (!isRecording)
            {
                if (GUI.Button(new Rect(Screen.width / 2 - 80, Screen.height - 85, 160, 80), "Record", skin.GetStyle("Button")))
                    StartRecord();
            }
            else
            {
                if (GUI.Button(new Rect(Screen.width / 2 - 80, Screen.height - 85, 160, 80), "Stop", skin.GetStyle("Button")))
                    StopRecord();
            }
        }
 
*/
         
        IEnumerator showMessage1()
        {
            label.gameObject.SetActive (true);
            label.text = "Start";
            yield return new WaitForSeconds(2f);
            label.gameObject.SetActive (false);
        }
        IEnumerator showMessage2()
        {
            label.gameObject.SetActive (true);
            label.text = "Recorded at " + ARBuilder.Instance.RecorderBehaviour.OutputFile;
            yield return new WaitForSeconds(2f);
            label.gameObject.SetActive (false);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读