【Unity】代码控制视频的播放(视频播放器-更新)

news2024/11/25 21:48:47

 结果如上图,之前写过一个使用代码控制视频播放器的Demo,但是好多小伙伴说我附带的链接没法下载,这次我直接做一个完整版的,不用下载,照着一步一步做就能做出来。

之前写了如何设置RawImage进行自动播放,大家可以看一下基础操作这篇文章:,大佬勿怪。

【Unity】在UI界面上显示播放视频_夜梦说开发(VR)的博客-CSDN博客

 

面板结构如上图。

Bg是背景,rawimage是视频播放图片以及播放器

主要组件Rawimage面板展示:

这次的功能有开始,暂停,重播,音量调节,时间显示,面板关闭,面板开启没有做,大家可以自由发挥。

上代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

/// <summary>
/// 视频播放器    对应组件需要创建
/// </summary>
public class VideoCrol : MonoBehaviour
{
    public static VideoCrol instance;

    #region

    /// <summary>
    /// 播放视频的Rawimage
    /// </summary>
    public GameObject videoImage;

    /// <summary>
    /// 视频播放器组件
    /// </summary>
    private VideoPlayer vPlayer;

    /// <summary>
    /// 开始,暂停,重播按钮
    /// </summary>
    public Button BtnPlay, BtnPause, BtnReStart;

    /// <summary>
    /// 视频进度条
    /// </summary>
    public Slider videoSlider;

    /// <summary>
    /// 关闭界面按钮
    /// </summary>
    public Button BtnX;

    /// <summary>
    /// 视频播放时间显示文本
    /// </summary>
    public Text NowTime;
    /// <summary>
    /// 视频总时间显示文本
    /// </summary>
    public Text TotalTime;
    /// <summary>
    /// 视频总时长
    /// </summary>
    private float tt;
    /// <summary>
    /// 进度条计时时间
    /// </summary>
    private float Index_t;

    /// <summary>
    /// 时间的时分秒
    /// </summary>
    private float hour, min, second;

    private bool IsPlay = true;

    /// <summary>
    /// 声音大小进度条
    /// </summary>
    public Slider voiceSlider;
    /// <summary>
    /// 声音百分比显示
    /// </summary>
    public Text audioNum;
    /// <summary>
    /// 声音播放器
    /// </summary>
    public AudioSource audioSource;
    /// <summary>
    /// 声音整体
    /// </summary>
    public GameObject voiceGameObject;
    /// <summary>
    /// 喇叭按钮
    /// </summary>
    public Button voiceBtn;
    /// <summary>
    /// 控制喇叭是否显示
    /// </summary>
    bool a = true;

    #endregion

    /// <summary>
    /// 视频在Resources下的地址
    /// </summary>
    const string VideoClip = "这里是视频地址";

    void Awake()
    {
        instance = this;
        vPlayer = videoImage.GetComponent<VideoPlayer>();

        SetPlayer((VideoClip)Resources.Load(VideoClip));
    }

    /// <summary>
    /// 对外开放的视频播放接口
    /// </summary>
    /// <param name="path">视频所在位置的地址</param>
    public void SetPlayer(VideoClip clip)
    {
        vPlayer.clip = clip;
    }

    /// <summary>
    /// 点击音量按钮,第一次开启,第二次关闭
    /// </summary>
    public void AudioTrue()
    {
        if (a)
        {
            voiceGameObject.SetActive(true);
            a = false;
        }
        else
        {
            voiceGameObject.SetActive(false);
            a = true;
        }

    }

    public void OnEnable()
    {
        voiceGameObject.SetActive(false);
        BtnReStart.onClick.AddListener(ClickReStart);
        BtnReStart.onClick.AddListener(ClickReStart);
        //BtnX.onClick.AddListener(ClickBtnX);
        BtnPlay.onClick.AddListener(ClickKaishi);
        BtnPause.onClick.AddListener(ClickZanting);
        voiceBtn.onClick.AddListener(AudioTrue);
    }

    public void OnDisable()
    {
        BtnReStart.onClick.RemoveListener(ClickReStart);
        BtnReStart.onClick.RemoveListener(ClickReStart);
        //BtnX.onClick.RemoveListener(ClickBtnX);
        BtnPlay.onClick.RemoveListener(ClickKaishi);
        BtnPause.onClick.RemoveListener(ClickZanting);
        voiceBtn.onClick.RemoveListener(AudioTrue);
        voiceGameObject.SetActive(false);
    }
    
    void Start()
    {
        ClickKaishi();//是否自动播放

        InitVideo();

        AudioChange();
    }

    /// <summary>
    /// 初始化音频音量等内容
    /// </summary>
    private void InitVideo()
    {
        tt = (float)vPlayer.clip.length;

        videoSlider.maxValue = tt;

        min = (int)tt / 60;
        second = (int)tt % 60;

        string minstr = min < 10 ? "0" + min.ToString() : min.ToString();

        string secondstr = second < 10 ? "0" + second.ToString() : second.ToString();

        TotalTime.text = string.Format("{0:D2}:{1:D2}", minstr, secondstr);
    }

    void Update()
    {
        PlayVideo();
        ChangeTime((float)vPlayer.time);
        AudioChange();
    }

    /// <summary>
    /// 判断是否播放 同时进度条跟随变换
    /// </summary>
    private void PlayVideo()
    {
        //播放
        if (IsPlay)
        {
            vPlayer.Play();
            Index_t += Time.deltaTime;
            if (Index_t >= 0.1f)
            {
                videoSlider.value += 0.1f;
                Index_t = 0;
            }
        }
        else
        {
            vPlayer.Pause();
        }
        //进度条到底停止播放
        if (videoSlider.maxValue - videoSlider.value <= 0.1f)
        {
            ClickReStart();
        }
    }

    /// <summary>
    /// 更改视频音量,同时赋值给音量文字
    /// </summary>
    private void AudioChange()
    {
        audioSource.volume = voiceSlider.value;
        audioNum.text = ((int)(voiceSlider.value * 100)).ToString() + "%";
    }

    /// <summary>
    /// 开放的改变视频播放进度
    /// </summary>
    /// <param name="value"></param>
    public void ChangeVideo(float value)
    {
        vPlayer.time = value;
    }

    /// <summary>
    /// 播放时间显示
    /// </summary>
    /// <param name="value"></param>
    void ChangeTime(float value)
    {
        min = (int)value / 60;
        second = (int)value % 60;

        string minstr= min < 10 ? "0" + min.ToString() : min.ToString();

        string secondstr = second < 10 ? "0" + second.ToString() : second.ToString();

        NowTime.text = string.Format("{0:D2}:{1:D2}", minstr, secondstr);
    }

    /// <summary>
    /// 重播按钮
    /// </summary>
    public void ClickReStart()
    {
        videoSlider.value = 0;
        vPlayer.time = 0;
    }

    /// <summary>
    /// 点击开始按钮
    /// </summary>
    public void ClickKaishi()
    {
        if (videoSlider.value == videoSlider.maxValue)
        {
            videoSlider.value = 0;
        }
        videoImage.SetActive(true);
        IsPlay = true;
        BtnPause.gameObject.SetActive(true);
        BtnPlay.gameObject.SetActive(false);
    }

    /// <summary>
    /// 点击暂停按钮
    /// </summary>
    public void ClickZanting()
    {
        IsPlay = false;
        BtnPause.gameObject.SetActive(false);
        BtnPlay.gameObject.SetActive(true);
    }
}

 这个是主要功能脚本,挂在外面的panel上。

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

/// <summary>
/// 挂载在进度条上
/// </summary>
public class SliderChange : MonoBehaviour,IDragHandler,IPointerClickHandler
{
    /// <summary>
    /// 拖动改变视频进度
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        VideoCrol.instance.ChangeVideo(VideoCrol.instance.videoSlider.value);
    }

    /// <summary>
    /// 点击改变视频进度
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerClick(PointerEventData eventData)
    {
        VideoCrol.instance.ChangeVideo(VideoCrol.instance.videoSlider.value);
    }
}

 这个是挂载在视频进度条上的slider,主要是为了让slider可以拖拽。

结果如下图:

 

 

代码有些长,大部分都是直接从外面挂载拖拽的,为了方便阅读,添加了注释,希望小白和想借鉴的朋友借鉴一下,UI自行更换哈。。。后面我会发一个打包链接

第一个链接是2017版的

https://download.csdn.net/download/CSDN_6954/29656145

第二个链接是2019版的,还没上传完成,等后续补充一个。

只需要1积分,给大家的福利哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

movetoThread应用的注意点

分析 官网的说明&#xff1a; void QObject::moveToThread(QThread *targetThread) Changes the thread affinity for this object and its children. The object cannot be moved if it has a parent. Event processing will continue in the targetThread. To move an objec…

流动微管反应器的精密压力控制解决方案

摘要&#xff1a;针对目前连续流反应器或微反应器压力控制中存在手动背压阀控制不准确、电动或气动背压阀响应速度太慢、无法适应不同压力控制范围和控制精度要求、以及耐腐蚀和耐摩擦性能较差等诸多问题&#xff0c;本文提出了相应的解决方案。解决方案的核心是分别采用了低压…

装配式从上世纪就开始了?到现在与BIM还干了这件大事!

​大家好&#xff0c;这里是建模助手。 说起装配式&#xff0c;相信各位都不会陌生。在我国传统建筑业资源浪费率高、污染重而饱受诟病的背景下&#xff0c;施工污染少、建造速度快、资源利用率高的装配式越来越受社会关注。 除了一些常规化的特点&#xff0c;如&#xff1a;…

4.2.2 基础指令的操作

显示日期与时间的指令&#xff1a; date 显示日历的指令&#xff1a; cal 简单好用的计算机&#xff1a; bc 1. 显示日期的指令&#xff1a; date 如果在命令行中想要知道目前Linux系统的时间&#xff0c;那么就直接在命令行界面输入date即可显示&#xff1a; [dmtsaistud…

小程序开发的优点和挑战:全面解析

小程序开发的优点是什么&#xff1f; 对于许多人来说&#xff0c;小程序的出现并没有给他们带来太多惊喜。然而&#xff0c;在过去的几年里&#xff0c;微信一直在努力成为更具影响力的社交平台&#xff0c;并且对于小程序开发的需求也在不断增加。随着小程序应用程序在其生态…

Spring Boot 属性加载原理解析

基于Spring Boot 3.1.0 系列文章 Spring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解Spring Boot 监听器详解Spring Boot banner详解Spring Boot 属性配置解析Spring Boot 属性加载原理解析 在《Spring Boot 框架整体启动流程详…

MAYA柔体与弹簧一起使用 6个例子

例子2 Q弹 隐藏物体设置移动动画 例子 3 柔体和粒子 例子4 坑的反弹 例子5 例子6

021+limou+C语言内存管理

0.在Linux下验证C语言地址空间排布 这里是limou3434的博文系列。接下来&#xff0c;我会带您了解在C语言程序视角下的内存分布&#xff0c;会涉及到一点操作系统的知识&#xff0c;但是不多&#xff0c;您无需担忧。 注意&#xff1a;只能在Linux下验证&#xff0c;因为Windo…

如何在客户验收环节搞垮一个项目,大佬是有一套方法的

通过产品、UI、开发、测试撸起袖子加油干&#xff0c;经历需求、设计、研发、测试层层关卡终于进入到了期待已久的客户验收环节。在项目的尾声&#xff0c;连空气里都充满了快活的气氛。 而励志要搞垮项目的大佬心里就不爽了“小样儿&#xff0c;你们认为你们就赢了吗&#xf…

Nginx的安装和配置

下载 访问官网&#xff1a;https://nginx.org/ 点击最新的版本下载&#xff0c; 进入详情页&#xff0c;选择下载任意版本 解压编译安装 tar zxvf nginx-1.22.1.tar.gz解压之后得到文件夹 nginx-1.22 安装之前保证使用的工具和库存在 # 安装gcc yum install -y gcc # 安装…

STM32开发——串口通讯(第2篇)——WIFI(Esp8266)

目录 1.ESP8266 作为设备 2.ESP8266作为服务器 注意&#xff1a;1.在中断中一般不直接在中断服务函数里处理数据&#xff0c;而是在收到数据后直接丢给队列&#xff0c;再处理数据&#xff1b; 2.在中断服务函数里尽量减少使用延时函数及打印函数。 1.ESP8266 作为设备 1.1…

mongo副本集的一些操作

开启副本集 修改配置文件/etc/mongod.conf replication:replSetName: main重启mongod相关服务systemctl restart mongod 注意:每个在副本集中的成员&#xff0c;无论主副replSetName都一样&#xff0c;表示一个副本集的名称 如果添加的节点的replSetName和主节点不一致&…

退出卸载企业奇安信360

一般退出&卸载企业奇安信需要密码&#xff0c;然后我们又都不知道密码是多少的情况下怎么退出奇安信呢 1.打开奇安信的设置 2.找到 "防护中心"--"自我保护" 然后点击确定 3.找到奇安信的安装目录 找到"D:\奇安信\360Safe\EntClient\conf"下面…

python带你获取TripAdvisor旅游景点的真实评价

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 猫途鹰&#xff08;TripAdvisor&#xff09;是一个旅游点评网站&#xff0c; 如果您想要爬取该网站的数据&#xff0c;需要了解该网站的访问规则和爬取限制。 所使用软件工具&#xff1a; python 3.8 运行代码 pycha…

【PTA】温故知新模拟题

目录 L1-2 日期格式化 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 代码&#xff1a; L1-4 心理阴影面积 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 代码&#xff1a; 7-3…

『论文精读』Vision Transformer(VIT)论文解读

『论文精读』Vision Transformer(VIT)论文解读 文章目录 一. 简介二. 模型架构2.1. 关于image presentation2.2. 关于positional encoding2.3. 关于CNNTransformer2.4. 关于输入图片大小 三. 实验部分3.1. 数据集3.2. 模型及变体3.3. 实验结果3.4. 模型可视化 参考文献 论文下…

CSS3_03:各种卡券优惠券模板制作,开箱即用,学得会,用得着

本文首发于微信公众号&#xff1a;布依前端 微信号&#xff1a;qny-1009 转载请注明出处 原创不易&#xff0c;觉得有用的话&#xff0c;多转发点赞支持 作为前端开发者&#xff0c;经常碰到不规则元素需求&#xff0c;尤其是购物类的优惠券&#xff0c;元素长相怪异&#xff0…

looks调色插件 Red Giant Magic Bullet Looks for Mac

Magic Bullet Looks for Mac版是一款looks调色插件&#xff0c;提供强大的外观和色彩校正功能&#xff0c;无论是对初学者还是影视专业制作人员&#xff0c;从冷酷惊艳的的动作场面到红色&#xff0c;暖色的浪漫色调&#xff0c;都可以帮助快速的完成&#xff0c;满足用户的所有…

LabVIEW开发基于Web数字图像处理

LabVIEW开发基于Web数字图像处理 数字图像处理已在各个领域找到了应用&#xff0c;并已成为一个高度活跃的研究领域。实际实施和实验在教育和研究活动中起着不可或缺的作用。为了方便快捷地实施数字图像处理操作&#xff0c;设计了一个先进的基于Web的数字图像处理虚拟实验室&…

vue3中引入tailwingcss

1、安装依赖 cnpm i -D tailwindcss postcss autoprefixer 2、安装完成后&#xff0c;创建tailwind.config.js 和 postcss.config.js配置文件&#xff0c;继续再控制台输入命令如下&#xff1a; npx tailwindcss init -P 3、修改tailwind.config.js content: ["./ind…