【Unity】VideoPlayer根据视频命名规则读取并播放视频

2024-03-25 05:08

本文主要是介绍【Unity】VideoPlayer根据视频命名规则读取并播放视频,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

发代码之前补一下挖到的坑。

VideoPlayer 通过URL读取视频的时候,路径必须准确!如发现读取后Unity崩溃,基本就是读取的路径有问题。

 

补充1:

该代码不适合频繁切换和程序长时间运行,因为切换过程可能会存在内存泄露的问题(unity的锅),我后来找到处理方法,但是处理方法不太稳定,后续再补充填坑。

补充2:

这VideoPlayer组件真的有毒,解决内存溢出,然后发现切换视频有几率造成虚拟内存回收不了,并且Unity没有提供任何方法来处理,如果需要功能涉及自动切换视频以及需要长时间运行的。建议放弃研究。

【可能是我处理不当,毕竟我真查不到相关问题的信息,如果有大佬有处理方法,望不吝赐教】

【用的是2018,3.5 版本的unity , 2019仅测试过短时间内快速连续切换视频,长时间没测过】

补充3:

由于询问过很多人,他们没说没发生这种情况,所以如若你坚持使用没发现问题的话,可以忽略我以上的内容。

其实我觉得应该是大部分人没有进行长时间挂机验证。在任务管理器把提交大小显示出来,然后长时间运行VideoPlayer组件,并且进行切换视频,你会发现提交大小会随着时间变大,最终把虚拟内存撑爆(当然,不会马上出现撑爆,我自己挂了几个小视频进行切换也需要两天才把20G虚拟内存撑满)。

 

该代码之所以扔出来.. 看图

(稍作修改...修改后没再次运行测试)

代码就大概这样...找streamingAssets下的movies文件夹中的视频,  但只抓 具备命名规则的  如 A.mp4 B.mp4等

(可自行修改规则- 规则适宜ASCII码连续的字符 或直接拿数字)。

根据index标识直接抓取,每次只抓对应标号的视频名。

抓到后构成路径,通过URL在VideoPlayer中读取视频。

然后根据计时进行视频切换。

 

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Video;public class VideoAutoPlayByName : MonoBehaviour
{private VideoPlayer videoPlayer;string folderName = "/Movie";                                                                   //文件夹名字private string path = "";public string[] likePaths;private int beginIndexABC = (int)System.Text.ASCIIEncoding.ASCII.GetBytes("A")[0];              //ABC播放规则的索引值public int endIndexABC = (int)System.Text.ASCIIEncoding.ASCII.GetBytes("Z")[0];private int currentIndex = 0;private float elapsedTime = 0;                  //消逝时间public float durationTime = 30;                 //持续多少秒后更换视频public bool isAuto = false;                                                                     //是否开启自动更换视频public bool defaultLooping = false;                 //是否默认循环播放private void Start(){FindVideoPlayer();InitPathString();}private void Update(){UpdateIndex();}private void InitPathString(){path = Application.streamingAssetsPath + folderName + "s/";currentIndex = (int)System.Text.ASCIIEncoding.ASCII.GetBytes("A")[0];likePaths = new string[endIndexABC - beginIndexABC + 1];for (int i = 0; i < likePaths.Length; i++){likePaths[i] = "* " + (char)(beginIndexABC + i) + ".mp4";}}public void ReadMoviesByName(){//检索目录下的文件DirectoryInfo directoryInfo = new DirectoryInfo(path);FileInfo[] fileInfos = directoryInfo.GetFiles(likePaths[currentIndex - beginIndexABC]);if (fileInfos.Length > 0)SetVideoUrl(fileInfos[0].Name);else{currentIndex++;if (currentIndex > endIndexABC){currentIndex = beginIndexABC;}ReadMoviesByName();}}private void UpdateIndex(){if (isAuto && endIndexABC - beginIndexABC > 1){elapsedTime += Time.deltaTime;if (elapsedTime >= durationTime){currentIndex++;if (currentIndex > endIndexABC){currentIndex = beginIndexABC;}ReadMoviesByName();elapsedTime = 0;}}}//读取视频文件private void SetVideoUrl(string videoName){if (File.Exists(path + videoName)){videoPlayer.Stop();videoPlayer.url = path + videoName;videoPlayer.Play();}else{Debug.Log("文件不存在!!");}}private void FindVideoPlayer(){videoPlayer = FindObjectOfType<VideoPlayer>();if (videoPlayer == null){Debug.LogError("缺少名为'Plane'背景板物体");//自行创建  不创建就直接return了return;}videoPlayer.isLooping = defaultLooping;}
}

 

这篇关于【Unity】VideoPlayer根据视频命名规则读取并播放视频的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843911

相关文章

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD