【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实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf