Unity播放网络视频
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mx.UI;
using Mx.Utils;
using UnityEngine.UI;
using UnityEngine.Video;
/// <summary> 视频UI面板 </summary>
public class VideoUIForm : BaseUIForm
{
private ImageAdaptive imageAdaptive;
private RawImage rawImage;
private VideoPlayer videoPlayer;
private bool isPlaying = false;
private Slider slider;
private Text playTimeText;
private Text lengthText;
private GameObject playButtonGo;
private GameObject playIconGo;
private GameObject pauseIconGo;
private bool sliderIsDrag = false;
private float playTime;
private float length;
public override void OnAwake()
{
base.OnAwake();
init();
rigisterButtonEvent();
}
private void init()
{
slider = UnityHelper.FindTheChildNode(gameObject, "Slider").GetComponent<Slider>();
rawImage = UnityHelper.FindTheChildNode(gameObject, "Stage").GetComponent<RawImage>();
rawImage.enabled = false;
videoPlayer = rawImage.gameObject.GetComponent<VideoPlayer>();
if (videoPlayer == null) videoPlayer = rawImage.gameObject.AddComponent<VideoPlayer>();
playTimeText = UnityHelper.FindTheChildNode(gameObject, "PlayTime").GetComponent<Text>();
lengthText = UnityHelper.FindTheChildNode(gameObject, "Length").GetComponent<Text>();
playButtonGo = UnityHelper.FindTheChildNode(gameObject, "BtnPlay").gameObject;
playIconGo = UnityHelper.FindTheChildNode(gameObject, "PlayIcon").gameObject;
pauseIconGo = UnityHelper.FindTheChildNode(gameObject, "PauseIcon").gameObject;
imageAdaptive = rawImage.GetComponent<ImageAdaptive>();
if (imageAdaptive == null) imageAdaptive = rawImage.gameObject.AddComponent<ImageAdaptive>();
videoPlayer.playOnAwake = false; // 设置不自动播放
videoPlayer.waitForFirstFrame = true; // 等待第一帧加载完成再显示
videoPlayer.source = VideoSource.Url;
videoPlayer.aspectRatio = VideoAspectRatio.FitVertically;
videoPlayer.prepareCompleted += onVideoPrepared; // 视频加载完成事件
videoPlayer.loopPointReached += onVideoEnd; // 视频播放完成事件
playIconGo.SetActive(true);
pauseIconGo.SetActive(false);
initFinish = true;
}
void Update()
{
if (!sliderIsDrag)
{
float progress = (float)videoPlayer.time / (float)videoPlayer.length;
if (progress > 0) slider.value = progress;
length = (float)videoPlayer.length;
lengthText.text = formatTime(length);
}
playTime = (float)videoPlayer.time;
playTimeText.text = formatTime(playTime);
playButtonGo.SetActive(!isPlaying);
playIconGo.SetActive(!isPlaying);
pauseIconGo.SetActive(isPlaying);
}
/// <summary>关闭UI窗口事件</summary>
public override void OnCloseUIEvent()
{
base.OnCloseUIEvent();
clearData();
}
public override void OnUIMsgEvent(string key, object values)
{
base.OnUIMsgEvent(key, values);
switch (key)
{
case MsgDefine.UPDATE_PANEL_DATA:
if (values != null)
{
if (initFinish)
{
rawImage.enabled = false;
string path = (string)values;
string encodedUrl = System.Uri.EscapeUriString(path);
videoPlayer.url = encodedUrl;
videoPlayer.Play();
isPlaying = true;
}
}
break;
}
}
/// <summary>注册按钮事件</summary>
private void rigisterButtonEvent()
{
RigisterButtonEvent("BtnClose", (clickObj) => { CloseCurrentUIForm(); });
RigisterButtonEvent("BtnPlayAndPause", (clickObj) => { PlayPauseVideo(); });
RigisterButtonEvent("BtnPlay", (clickObj) =>
{
videoPlayer.Play();
isPlaying = true;
});
}
/// <summary>进度条拖动发送改变</summary>
public void OnSliderDragChange(bool isDrag)
{
sliderIsDrag = isDrag;
}
/// <summary>清理数据</summary>
private void clearData()
{
if (!initFinish) return;
isPlaying = false;
slider.value = 0;
playTimeText.text = "00:00";
lengthText.text = "00:00";
playButtonGo.SetActive(true);
playIconGo.SetActive(true);
pauseIconGo.SetActive(false);
sliderIsDrag = false;
}
/// <summary>视频准备完成</summary>
private void onVideoPrepared(VideoPlayer source)
{
rawImage.texture = source.texture;
source.Play();
rawImage.enabled = true;
isPlaying = true;
// 获取视频的宽度和高度
uint width = source.width;
uint height = source.height;
RectTransform parentRect = transform.parent.GetComponent<RectTransform>();
if (parentRect != null)
{
imageAdaptive.BoundarySize = new Vector2(parentRect.rect.width, parentRect.rect.height);
imageAdaptive.ImageSize = new Vector2(width, height);
}
}
/// <summary>视频播放结束</summary>
private void onVideoEnd(VideoPlayer source)
{
source.Pause();
isPlaying = false;
}
/// <summary>播放或者暂停视频</summary>
public void PlayPauseVideo()
{
if (isPlaying)
{
videoPlayer.Pause();
isPlaying = false;
}
else
{
videoPlayer.Play();
isPlaying = true;
}
}
/// <summary>设置视频播放进度</summary>
public void setVideoProgress(float progress)
{
if (videoPlayer.canSetTime)
{
videoPlayer.time = videoPlayer.clip.length * progress;
}
}
/// <summary>格式化时间</summary>
private string formatTime(float time)
{
int minutes = Mathf.FloorToInt(time / 60f);
int seconds = Mathf.FloorToInt(time % 60f);
return string.Format("{0:00}:{1:00}", minutes, seconds);
}
}
相关文章:
Unity播放网络视频
using System.Collections; using System.Collections.Generic; using UnityEngine; using Mx.UI; using Mx.Utils; using UnityEngine.UI; using UnityEngine.Video; /// <summary> 视频UI面板 </summary> public class VideoUIForm : BaseUIForm { private …...
SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测
SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-LSTM-selfAttention灰狼算法优化卷积长短…...
线性分类器--图像表示
整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量! rbg的图像矩阵转列向量 大小为 32X32 的话,图像矩阵转列向量是多少维? 32x32x3 3072 维列向量...
车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构)
车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,…...
如何在Ubuntu的Linux系统中安装MySQL5.7数据库
前往MySQL数据库官网链接地址下载5.7数据库。 MySQL :: Download MySQL Community Server (Archived Versions)使用ssh的可视化工具将下载的mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz文件上传到Linux服务器,并解压文件 tar -zxvf mysql-5.7.40-linux-glibc2.12-x…...
基于Hadoop的区块链海量数据存储的设计与实现
点我完整下载:基于Hadoop的区块链海量数据存储的设计与实现.docx 基于Hadoop的区块链海量数据存储的设计与实现 Design and Implementation of Mass Data Storage for Blockchain based on Hadoop 目录 目录 2 摘要 3 关键词 4 第一章 引言 4 1.1 研究背景 4 1.2 研…...
运行时错误/缺陷到底是什么缺陷
运行时错误(Run-time Error)是一种跟程序运行状态相关的缺陷。这类缺陷不能通过直接禁用相关特性来屏蔽,而是需要通过分析变量的数值状态来发现可能的异常。简单来说,这些缺陷通常只有当程序执行起来以后,才能逐渐暴露出的缺陷,一…...
应用Web3.0的5种方法提升你的点击量
Web3.0早已成为互联网的全新方向标,为用户带来全新的手机上网感受。它也变成吸引住点击量疯涨的秘密武器。我们将要详细介绍Web3.0的五种使用方法,帮助你更好的了解并应用Web3.0技术性,以提升你的点击量。 1.可靠的身份认证Web3.0技术性提供了…...
计算机服务器中了mallox勒索病毒如何处理,mallox勒索病毒解密文件恢复
科技技术的发展推动了企业的生产运营,网络技术的不断应用,极大地方便了企业日常生产生活,但网络毕竟是一把双刃剑,网络安全威胁一直存在,近期,云天数据恢复中心接到很多企业的求助,企业的计算机…...
408—电子笔记分享
一、笔记下载 链接:https://pan.baidu.com/s/1bFz8IX6EkFMWTfY9ozvVpg?pwddeng 提取码:deng b站视频:408-计算机网络-笔记分享_哔哩哔哩_bilibili 包含了408四门科目(数据结构、操作系统、计算机组成原理、计算机网络)…...
【每日一题】子数组的最小值之和
文章目录 Tag题目来源题目解读解题思路方法一:贡献法单调栈 写在最后 Tag 【贡献法】【单调栈】【数组】【2023-11-27】 题目来源 907. 子数组的最小值之和 题目解读 计算整数数组的连续子数组中最小值的和。 解题思路 本题朴素的解决思想是求出所有的连续子数组…...
【docker】docker总结
一、Docker简介 Docker是开源应用容器引擎,轻量级容器技术。基于Go语言,并遵循Apache2.0协议开源Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux系统上,也可以实现虚拟化容…...
[英语学习][3][Word Power Made Easy]的精读与翻译优化
[序言] 这次翻译校验, 难度有点大, 原版中英翻译已出现了严重地偏差. 昨晚11点开始阅读如下段落, 花费了1个小时也没有理解原作者的核心表达, 索性睡觉了. 今早学习完朗文单词之后, 9点半开始继续揣摩. 竟然弄到了中午11点30, 终于明白原作者要表达的意思了. 废话不多说&#x…...
使用UIActivityViewController分享图片,没有preview
以前都是用第三方sdk来分享的,最近使用官方的UIActivityViewController来做分享,结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…...
linux安装终端连接工具Tabby
参考:https://zhuanlan.zhihu.com/p/645787655...
Linux telnet命令详解:通过TCP/IP网络连接与管理远程机器(附实例教程和注意事项)
Linux telnet命令介绍 telnet命令,全称为teletype network,是一个使用telnet网络协议来连接并管理远程机器的命令。它通过TCP/IP网络使用端口23来建立连接,并提供了一种使用命令行界面(CLI)管理远程系统的方式。虽然t…...
linux 磁盘管理、分区管理常用命令
文章目录 基础命令挂载新硬盘/分区添加内存交换分区swaplvm分区管理模式 基础命令 查看目录文件大小 du -sh /backup du -sh /backup/* du -sh *查看磁盘挂载信息 df -lhT查看某个目录挂载在哪个分区,以及分区的磁盘使用情况 df [目录] #例如:df /ho…...
Milvus入门手册1.0
一、window环境搭建(单机) 1、docker安装 略 2、milvus安装 参考文档:https://milvus.io/docs/install_standalone-docker.md tips: (1)compose.yaml下载比较慢,可以在网络上找一份。 (2&…...
PCL 计算两点云之间的最小距离
目录 一、 算法原理二、 代码实现三、 结果展示四、 相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、 算法原理 pcl::registration::CorrespondenceEstimation是确定目标和查询点集(或特征)之间对应关…...
基于YOLOv5的视频计数 — 汽车计数实现
在视频中计数对象可能看起来有挑战性,但借助Python和OpenCV的强大功能,变得令人意外地易于实现。在本文中,我们将探讨如何使用YOLO(You Only Look Once)目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
