
Unity中实现VideoPalyer控件操作本地视频
发布日期:2021-05-10 09:24:55
浏览次数:21
分类:原创文章
本文共 9913 字,大约阅读时间需要 33 分钟。
一、搭建基础的视频显示UI(其中时间进度条、音量进度条、及其对应的显示文字UI可以不用搭建)
注意:要想实现鼠标移入显示进度条、音量和时间控件,需要给视频显示控件RawImage添加BoxCollider 2D碰撞体,且调整碰撞体大小为自己想要触发的区域即可。
二、编写视频控制脚本
/**** Title:"可视化" 项目* 主题:视频播放控制* Description:* 功能:* 1、加载本地视频进行播放、暂停、停止* 2、获取视频总时长、当前播放时长(对应进度条)* 3、实现进度条控制视频音量大小* 4、实现鼠标进入显示进度条、音量和时间控件* 5、实现鼠标退出隐藏进度条、音量和时间控件* Date:2019* Version:0.1版本* Author:Coffee* Modify Recoder:*/using Global;using kernal;using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine;using UnityEngine.UI;using UnityEngine.Video;namespace Control{ public class Ctrl_VideosOperation : MonoBehaviour { #region 视频组件 #region 基础组件 //视频播放组件 private VideoPlayer videoPlayer; //视频组件 private AudioSource audioSource; //音频组件 private RawImage rawImage; //显示组件 public bool satrtplay = false; //开始播放视频开关 private string videoPath = string.Empty; //视频路径 #endregion #region 拓展组件 //视频控制器 public Slider m_sliderVideo; //音量控制器 public Slider m_sliderSource; //视频总时长 public Text m_textCount; //当前视频时间 public Text m_textTime; //是否拿到视频总时长 public bool m_isShow; //视频是否播放完成 private bool m_isVideo; //时 分的转换 private int hour, mint; private float m_time; private float m_timeCount; private float m_timeCurrent; #endregion #endregion void Awake() { //初始化配置 InitSettings(); } private void Start() { if (m_sliderSource != null) { //调节音量方法 m_sliderSource.onValueChanged.AddListener(delegate { ChangeSource(m_sliderSource.value); }); } } private void Update() { if (satrtplay && videoPlayer.isPlaying) { rawImage.texture = videoPlayer.texture; if (m_sliderVideo!=null) { //帧数/帧速率=总时长 如果是本地直接赋值的视频,我们可以通过VideoClip.length获取总时长 m_sliderVideo.maxValue = (videoPlayer.frameCount / videoPlayer.frameRate); m_time = m_sliderVideo.maxValue; hour = (int)m_time / 60; mint = (int)m_time % 60; m_textCount.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString()); //m_isShow = !m_isShow; m_isVideo = false; } } if (satrtplay) { if (m_sliderVideo!=null) { if (Mathf.Abs((int)videoPlayer.time - (int)m_sliderVideo.maxValue) == 0) { videoPlayer.frame = (long)videoPlayer.frameCount; videoPlayer.Pause(); m_isVideo = true; satrtplay = false; hour = 0; mint = 0; return; } else if (videoPlayer.isPlaying) { m_time = (float)videoPlayer.time; hour = (int)m_time / 60; mint = (int)m_time % 60; m_textTime.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString()); m_sliderVideo.value = m_time; } } } } #region 公有方法 /// <summary> /// 加载封面 /// </summary> public void LoadFirstPicture() { Play(); Invoke("Pause", Global_Parameter.INTERVAL_TIME_0DOT2); } /// <summary> /// 获取本地视频 /// </summary> /// <param name="videoPath">视频路径</param> /// <returns></returns> public bool LoadVideo(string videoPath) { bool success = false; if (!string.IsNullOrWhiteSpace(videoPath)) { //设置视频组件格式 videoPlayer.source = VideoSource.Url; //获取视频 videoPlayer.url = "file:///" + videoPath; this.videoPath = videoPath; success = true; } return success; } /// <summary> /// 播放 /// </summary> /// <returns>false:表示没有指定装载视频(或装载失败)</returns> public bool Play() { bool success = false; if (!string.IsNullOrWhiteSpace(videoPath)) { //设置音效大小 audioSource.volume = Global_Parameter.INTERVAL_TIME_0DOT5; if (m_sliderSource!=null) { m_sliderSource.value = audioSource.volume; } videoPlayer.Play(); success = true; } return success; } /// <summary> /// 暂停 /// </summary> /// <returns>false:表示没有指定装载视频(或装载失败)</returns> public bool Pause() { bool success = false; if (!string.IsNullOrWhiteSpace(videoPath)) { videoPlayer.Pause(); success = true; } return success; } /// <summary> /// 停止 /// </summary> /// <returns>false:表示没有指定装载视频(或装载失败)</returns> public bool Stop() { bool success = false; if (!string.IsNullOrWhiteSpace(videoPath)) { videoPlayer.Stop(); success = true; // 加载封面 LoadFirstPicture(); } return success; } /// <summary> /// 改变视频进度 /// </summary> /// <param name="value"></param> public void ChangeVideo() { if (videoPlayer.isPrepared) { videoPlayer.time = m_sliderVideo.value; //Debug.Log((long)value); //Debug.Log("VideoPlayer Time:" + m_vPlayer.time); m_time = (float)videoPlayer.time; hour = (int)m_time / 60; mint = (int)m_time % 60; m_textTime.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString()); } if (m_isVideo == false) { m_isVideo = true; } } #endregion #region 私有方法 /// <summary> /// 初始化配置 /// </summary> private void InitSettings() { //添加音频、视频组件 audioSource = this.gameObject.AddComponent<AudioSource>(); videoPlayer = this.gameObject.AddComponent<VideoPlayer>(); rawImage = this.gameObject.GetComponent<RawImage>(); //这3个参数不设置也会没声音 唤醒时就播放关闭 videoPlayer.playOnAwake = false; audioSource.playOnAwake = false; audioSource.volume = 0; audioSource.Pause(); } /// <summary> /// 改变音量大小 /// </summary> /// <param name="value"></param> private void ChangeSource(float value) { audioSource.volume = value; //text.text = string.Format("{0:0}%", value * 100); } /// <summary> /// 鼠标进入显示视频拓展内容(显示进度条、音量和时间) /// </summary> private void OnMouseEnter() { ShowVideoExternInfo(true); } /// <summary> /// 鼠标退出显示视频拓展内容(隐藏进度条、音量和时间) /// </summary> private void OnMouseExit() { ShowVideoExternInfo(false); } //是否显视频的拓展内容(显示进度条、音量和时间) private void ShowVideoExternInfo(bool isshow=false) { if (m_sliderSource != null && m_sliderVideo != null && m_textCount != null && m_textTime != null) { m_sliderSource.gameObject.SetActive(isshow); m_sliderVideo.gameObject.SetActive(isshow); m_textCount.gameObject.SetActive(isshow); m_textTime.gameObject.SetActive(isshow); } } #endregion }//Class_end}
三、使用方法
①将该设备播放控制脚本(Ctrl_VideosOperation.cs)添加给视频显示组件(我这里是:Image_Videos (3))
②新建一个空物体(取名:_TestVideosOperation)作为测试视频操作脚本的挂载物体(Test_VideosOpreation.cs)
③测试视频操作脚本的挂载物体(Test_VideosOpreation.cs)如下:
/**** Title:"可视化" 项目* 主题:测试视频播放控制* Description:* 功能:XXX* Date:2019* Version:0.1版本* Author:Coffee* Modify Recoder:*/using System.Collections;using System.Collections.Generic;using UnityEngine;using Control;using System.IO;using kernal;using Global;using UnityEngine.EventSystems;namespace TestInfo{ public class Test_VideosOpreation : MonoBehaviour { public GameObject showRawImage; //显示面板 private Ctrl_VideosOperation _VideosOperation; //视频控制脚本 void Start() { if (showRawImage!=null) { _VideosOperation = showRawImage.GetComponent<Ctrl_VideosOperation>(); } //获得本地的视频路径 string _VideoPath=@"C:\测试视频\第1章 基本概念清晰版.mp4"; _VideosOperation.satrtplay = _VideosOperation.LoadVideo(VideoPath); _VideosOperation.LoadFirstPicture(); } void Update() { //开始播放 if (Input.GetKeyDown(KeyCode.P)) { _VideosOperation.Play(); } //暂停播放 if (Input.GetKeyDown(KeyCode.L)) { _VideosOperation.Pause(); } //停止播放 if (Input.GetKeyDown(KeyCode.S)) { _VideosOperation.Stop(); } } }//Class_end}
④运行测试,效果图如下:
参考:
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月18日 16时46分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
嘿!为你的应用创建滚动日志吧?
2021-05-09
一个JAVA应用启动缓慢问题排查 --来自jdk securerandom 的问候
2021-05-09
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
2021-05-09
httprunner学习23-加解密
2021-05-09
jenkins学习13-凭据管理(删除多余的凭据)
2021-05-09
有道云笔记 同步到我的博客园
2021-05-09
阿里云“网红"运维工程师白金:做一个平凡的圆梦人
2021-05-09
AnalyticDB for PostgreSQL 6.0 新特性介绍
2021-05-09
Alibaba Cloud Linux 2 LTS 正式发布,提供更高性能和更多保障!
2021-05-09
李笑来必读书籍整理
2021-05-09
vue书籍整理
2021-05-09
记Java中有关内存的简单认识
2021-05-09
Mybatis配置解析
2021-05-09
http头部 Expect
2021-05-09
Hadoop(十六)之使用Combiner优化MapReduce
2021-05-09
C#实现outlook自动签名
2021-05-09
MySQL 5.5 My.cnf 模版
2021-05-09
使用mysqladmin ext了解MySQL运行状态【转】
2021-05-09
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2021-05-09