Unity实现摄像头录像功能

这篇具有很好参考价值的文章主要介绍了Unity实现摄像头录像功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity实现摄像头录像功能

前言

在之前的很多展馆展示的项目中,甲方有很多要求实现用摄像头录像的功能。使用Unity实现调用USB摄像头画面的功能非常容易实现,但是实现录屏的功能有一些困难,我使用了几种方法都没有实现出想要的效果,后来我在网上找到一款叫做AVProMovieCapture的插件,实现了录屏的良好效果,同时也实现了使用Unity实现摄像头录像的效果,具体实现方法如下所示:

实现步骤

1.在项目中导入AVProMovieCapture插件,如下图所示:
Unity实现摄像头录像功能
2.在场景中新建plane物体,设置如下图所示:
Unity实现摄像头录像功能3.在场景中拖入ScreenGameObject物体,如下图所示:
Unity实现摄像头录像功能
4.在场景中新建WebCapture物体,在该物体上挂载WebCapture.cs脚本,脚本代码如下图所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace RenderHeads.Media.AVProMovieCapture.Demos
{
    public class WebCapture : MonoBehaviour
    {
        private class Instance
        {
            public string name;
            public WebCamTexture texture;
            public CaptureFromTexture capture;
            public CaptureGUI gui;
        }

        [SerializeField]
        private GUISkin _skin;

        //[SerializeField]
        //private GameObject _prefab;

        [SerializeField]
        private int _webcamResolutionWidth = 1920;

        [SerializeField]
        private int _webcamResolutionHeight = 1080;

        [SerializeField]
        private int _webcamFrameRate = 30;

        //State
        private Instance[] _instances;
        private int _selectedWebcamIndex;
        //显示视频的面板
        public MeshRenderer plane;
        //调用录像的脚本物体
        public CaptureGUI captureObject;

        private void Start()
        {
            //Create instance data per webcam
            int numCams = WebCamTexture.devices.Length;
            _instances = new Instance[numCams];
            for (int i = 0;i < numCams;i++)
            {
                //GameObject go = (GameObject)GameObject.Instantiate(_prefab);

                Instance instance = new Instance();
                instance.name = WebCamTexture.devices[i].name;
                //instance.capture = go.GetComponent<CaptureFromTexture>();
                instance.capture = captureObject.gameObject.GetComponent<CaptureFromTexture>();
                instance.capture._autoFilenamePrefix = "Demo4Webcam-" + i;
                //instance.gui = go.GetComponent<CaptureGUI>();
                instance.gui = captureObject.gameObject.GetComponent<CaptureGUI>();
                instance.gui._showUI = true;

                _instances[i] = instance;
            }

            if (numCams > 0)
            {
                Change(0);
            }
            StartCoroutine(OpenCamera());
            //captureObject = GameObject.Find("ScreenGameObject(Clone)").GetComponent<CaptureGUI>();
        }
        /// <summary>
        /// 开启摄像头
        /// </summary>
        /// <returns></returns>
        IEnumerator OpenCamera()
        {
            yield return new WaitForSeconds(0.5f);
            beginCamera();
            yield return new WaitForSeconds(0.5f);
            captureObject.ToStartCapture();
        }

        private void StartWebcam(Instance instance)
        {
            instance.texture = new WebCamTexture(instance.name,_webcamResolutionWidth,_webcamResolutionHeight,_webcamFrameRate);
            instance.texture.Play();
            if (instance.texture.isPlaying)
            {
                instance.capture.SetSourceTexture(instance.texture);
                plane.material.mainTexture = instance.texture;
            }
            else
            {
                StopWebcam(instance);
            }
        }

        private void StopWebcam(Instance instance)
        {
            if (instance.texture != null)
            {
                if (instance.capture != null && instance.capture.IsCapturing())
                {
                    instance.capture.SetSourceTexture(null);
                    instance.capture.StopCapture();
                }
                instance.texture.Stop();
                Destroy(instance.texture);
                instance.texture = null;
            }
        }

        private void OnDestroy()
        {
            for (int i = 0;i < _instances.Length;i++)
            {
                StopWebcam(_instances[i]);
            }
        }

        private void Change(int index)
        {
            _selectedWebcamIndex = index;
            for (int j = 0;j < _instances.Length;j++)
            {
                _instances[j].gui._showUI = (j == _selectedWebcamIndex);
            }
        }
        /// <summary>
        /// 开启摄像头
        /// </summary>
        public void beginCamera()
        {
            for (int i = 0;i<_instances.Length;i++)
            {
                Instance webcam = _instances[i];
                StartWebcam(webcam);
            }
        }
    }
}

5.运行场景,发现已经调用了摄像头,如下图所示:
Unity实现摄像头录像功能
6.虽然调用了摄像头,但是不知道是否已经进行了录像,查找到工程下的movie文件夹,发现已经录入了视频,从而实现了使用usb摄像头录像的功能,如下图所示:
Unity实现摄像头录像功能
7.实现录像功能,有的需求还需要获取到这些视频并且展示出来,这个也在我之前的项目实现了,具体怎么实现不再赘述了,在这里将核心代码分享在这里:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;


public class Load : MonoBehaviour
{
    public List<string> filePaths;
    public static string[][] pic;
    private List<string> LAN;
    private string movieUrl;
    //遍历的视频数量
    public static int movieNumber = 0;

    private void Start()
    {
        movieUrl = ConfigTest.dic["录像路径"]["url"];
        LAN = new List<string>();
        LAN.Add(movieUrl);
        pic = new string[LAN.Count][];
        Debug.Log(pic.Length);
        LoadIma();
    }

    void LoadIma()
    {
        for (int i = 0;i < pic.Length;i++)
        {
            pic[i] = (load(LAN[i],i));
        }
    }

    string[] load(string LAN,int t)
    {
        filePaths = new List<string>();
        string imgtype = "*.mp4|*.mov|*.avi";
        string[] ImageType = imgtype.Split('|');
        for (int i = 0;i < ImageType.Length;i++)
        {
            //获取所有视频视频的路径
            string[] dirs = Directory.GetFiles(@"" + LAN,ImageType[i]);
            //Debug.Log(dirs.Length);
            //movieNumber = dirs.Length;
            for (int j = 0;j < dirs.Length;j++)
            {
                filePaths.Add(dirs[j]);
                movieNumber = j;
                //Debug.Log(movieNumber);
            }
        }
        return fuzhi(t);
    }

    public string[] fuzhi(int t)
    {
        pic[t] = new string[filePaths.Count];
        for (int i = 0; i < filePaths.Count;i++)
        {
            pic[t][i] = filePaths[i];
        }
        return pic[t];
    }
}

结尾语

网上开发的各种大神有很多,他们开发出许许多多的插件供我们使用,极大节省了我们的开发时间,在这里向他们表示感谢。我作为一名Unity小菜鸟,希望和大家有问题一起讨论,共同进步,大家有问题可以私聊我。文章来源地址https://www.toymoban.com/news/detail-404874.html

到了这里,关于Unity实现摄像头录像功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制

    LiveNVR基础配置 海康 ISUP 接入配置 ,填写相关信息 服务 IP (设备可以访问到的IP) 服务端口 接入密码 (ISUP接入时要填此密码) 填写上 1、海康 ISUP 接入配置 中配置的相关信息,设备ID( 自定义不要重复 ) 填写上 1、海康 ISUP 接入配置 中配置的相关信息,设备ID( 自定义

    2024年02月08日
    浏览(74)
  • vue对接海康摄像头,使用hk3.3(硬盘录像机)开发摄像头分屏翻页操作。

    默认展示4*4规格,分屏之后自己写翻页方法,对摄像头一一展示(1x1, 2x2, 3x3, 4x4),有俩个场景。 1、刚开始默认展示的时候进行分页。 2、点击分屏操作之后进行分页。 思路: 1、拿到所有的通道号,比如有[1, 2, 3…, 100]; 2、 点击分屏之后就会把这个数组变为 1*1[[1], [

    2024年02月13日
    浏览(68)
  • 海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储

    文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131679108 上一篇:没有了 下一篇:敬请期待…   Hik防爆摄像头录像,因为防爆摄像头会有对应的APP软件,与普通的网络摄像头和球机不一样,默认认为它不可以通过web网页配置,所以弄

    2024年02月16日
    浏览(41)
  • 基于QT设计的无人机地面站(摄像头录像拍摄)

    通过QT设计一款无人机地面站软件,需要包含基本的RTSP拉流功能,对接无人机平台的RTSP流。此外,需要完成拍照、录像、OSD叠加功能;完成按钮控制云台进行拍照、录像、变焦、指点运动等。在此基础上,完成对应的目标跟踪识别。 技术要求 (1)采用QT平台,设计Windows端及

    2024年02月08日
    浏览(57)
  • python调用摄像头实现拍照功能

    目录 1.介绍 2.系统依赖 (1)OpenCV-Python库 (2)Tkinter库 (3)Pillow库 (4)Time库 3.系统代码 4.效果展示 5.注意事项         这是一个有趣的项目,通过Python程序调用系统的摄像头,实现了拍照的功能.         我的主页还有一些文章介绍了其他有趣的项目,可以动手尝试一下: 代码写不完了

    2024年02月04日
    浏览(52)
  • 利用OBS和手机摄像头录课(录屏/录像)时的方法与参数设置

    目录 1. OBS下载地址 2. OBS录屏设置 2.1 使用向导设置做全局设置 2.2 详细设置 2.2.1 视频设置 2.2.2 音频设置 2.2.3 输出设置 2.2.4 快捷键设置 3. 麦克风降噪设置 4. 使用OBS录屏功能 5. 用手机作为网络摄像头采集图像 5.1 配置手机摄像头 5.2 为OBS中设置手机IP摄像头 6. 本文的OBS参数设

    2024年02月11日
    浏览(40)
  • 海康、大华、tplink监控摄像头和硬盘录像机接入GB28181平台配置细节

    海康、大华、tplink等各种型号监控摄像头或硬盘录像机(NVR/HVR)接入GB28181平台,配置过程都非常简单明了,但有些细节需要注意,避免走弯路踩泥坑。 首先要说明一点的是,只要监控设备和GB28181平台的网络是连通的,都可以顺畅的接入,不需要为监控设备配置外网地址,更不

    2024年02月07日
    浏览(64)
  • 254、跟你一起学习两招:一台录像机如何添加两个不同网段的摄像头

    录像主机怎样添加不同网段ip的摄像头?这个在实际项目有可能会遇到,也有不少的朋友在问起,之前发布的内容中我们有一个大概的介绍,本期我们来详细总结下具体如何实现录像机添加不同网段ip的摄像头?常用的有两种方法。 方法一、使用双网口录像机添加不同网段的

    2024年02月09日
    浏览(84)
  • 安卓玩机搞机技巧综合资源-----手机隐藏拍照录像 取证软件 寻找隐藏摄像头 【十六】

    接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红米机型分区类型

    2024年02月09日
    浏览(43)
  • vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)

    ffmpeg下载 https://ffmpeg.org/download.html 找ffmpeg-release-essentials.zip点击下载,下载完解压 ffmpeg.exe 程序运行 添加成功后验证是否生效任意地方打开cmd窗口输入 ffmpeg 打印如下表示成功 新建一个app.js文件,同级目录下npm安装 node-rtsp-stream 我是直接写在项目里了,你们可以单独写在外

    2024年04月25日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包