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)目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
