Unity实现播放Ogg格式视频功能实现

前言

我在之前做过的项目中,涉及到视频播放这一块功能的开发上,一般我就直接用Unity自己封装的VideoPlayer开发就可以了,VideoPlayer的功能比较强大,同时也比较稳定。但是在有的比较老的项目中,有时候还会使用播放ogg视频格式的开发功能。我在之前的几个项目中也做过类似的功能,所以就在这里记录一下使用Unity开发播放Ogg视频的功能。

步骤

一、在场景中新建一个RawImage组件,用来当做显示视频纹理的画布,如下图所示:

二、新建SpriteInfo.cs脚本,实现将Ogg视频传入的功能,代码如下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;public class SpriteInfo : MonoBehaviour
{public MovieTexture currentMov;//电影private string videoFileName;private string videoName;public double startTime;//配置文件类private ConfigTest configTest;// Use this for initializationprivate void Awake(){configTest = GameObject.Find("configTest").GetComponent<ConfigTest>();DontDestroyOnLoad(this.gameObject);}void Start (){videoName = configTest.dic["MoiveName"]["Name0"];videoFileName = Application.streamingAssetsPath + "/moive/" + videoName;StartCoroutine(DownloadMovie());}/// <summary>/// 加载影片的协程/// </summary>/// <returns>返回www</returns>IEnumerator DownloadMovie(){startTime = (double)Time.deltaTime;if (File.Exists(videoFileName)){WWW www = new WWW("file://" + videoFileName);currentMov = (MovieTexture)www.GetMovieTexture();while (!currentMov.isReadyToPlay)yield return www;//Debug.Log("影片加载用时:" + startTime);}}

三、新建MoviePlayer.cs脚本,实现视频播放功能,代码如下所示:

using System.Collections;
//using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;[RequireComponent(typeof(AudioSource))]
public class MoviePlayer : MonoBehaviour
{public MovieTexture movieTexture;private AudioSource audio0;private string movieDir;public float time;private SpriteInfo spriteInfo;private float movieTime;private static MoviePlayer instance;public bool isPlaying = false;private RawImage ri;/// <summary>/// 控制影片的播放/// </summary>private BoFangManager boFangManager;public static MoviePlayer Instance{get{return instance;}}private void Awake(){audio0 = GetComponent<AudioSource>();ri = GetComponent<RawImage>();spriteInfo = GameObject.Find("spriteInfo").GetComponent<SpriteInfo>();boFangManager = GameObject.Find("pauseBackGround").GetComponent<BoFangManager>();}// Use this for initializationvoid Start (){instance = this;Play0();}// Update is called once per framevoid Update (){MoiveTimeEnd();
#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID)//ShowButton0();
#else//ShowButton();
#endif}/// <summary>/// 初始化播放影片/// </summary>void Play0(){ri.texture = spriteInfo.currentMov;audio0.clip = spriteInfo.currentMov.audioClip;movieTexture = (MovieTexture)ri.texture;isPlaying = true;movieTexture.Play();audio0.Play();//Debug.Log("Play");}/// <summary>/// 播放暂停/// </summary>public void Pause(){boFangManager.ShowThis();isPlaying = false;audio0.Pause();movieTexture.Pause();//Debug.Log("暂停");}/// <summary>/// 继续播放/// </summary>public void Play(){isPlaying = true;audio0.Play();movieTexture.Play();//Debug.Log("播放");}/// <summary>/// 停止播放/// </summary>public void Stop(){isPlaying = false;audio0.Stop();movieTexture.Stop();SceneManager.LoadScene("Main");Destroy(spriteInfo.gameObject);//Debug.Log("Stop");}/// <summary>/// 影片播放完之后的逻辑/// </summary>public void MoiveTimeEnd(){if (isPlaying){if (!movieTexture.isPlaying){Stop();StartCoroutine(ToTakePhoto());}}}/// <summary>/// 跳转到拍照界面的协程/// </summary>/// <returns></returns>IEnumerator ToTakePhoto(){yield return new WaitForEndOfFrame();SceneManager.LoadScene("Main");}/// <summary>/// 电脑端暂停/// </summary>private void ShowButton(){if (isPlaying){if (Input.GetMouseButtonUp(0)){Pause();}}}/// <summary>/// 安卓移动暂停/// </summary>private void ShowButton0(){if (isPlaying){if (Input.touchCount <= 0){return;}if (Input.touchCount == 1)//一根手指接触屏幕{if (Input.touches[0].phase == TouchPhase.Ended){Pause();}}}}/// <summary>/// 继续播放/// </summary>public void ContinuePlay(){if (!isPlaying){boFangManager.HideThis();audio0.Play();movieTexture.Play();StartCoroutine(SetIsPlay());}}/// <summary>/// 设置isPlaying为true,否则会冲突/// </summary>/// <returns>返回一帧的时间</returns>IEnumerator SetIsPlay(){yield return new WaitForEndOfFrame();isPlaying = true;}/// <summary>/// 重新播放的功能/// </summary>public void ReStart(){if (!isPlaying){boFangManager.HideThis();audio0.Stop();movieTexture.Stop();StartCoroutine(ReStartPlay());}}/// <summary>/// 重新播放执行的协程/// </summary>/// <returns>返回一帧时间</returns>IEnumerator ReStartPlay(){yield return new WaitForEndOfFrame();isPlaying = true;audio0.Play();movieTexture.Play();}/// <summary>/// 停止播放电影后进入拍照的场景/// </summary>public void StopPlay(){if (!isPlaying){audio0.Stop();movieTexture.Stop();Destroy(spriteInfo.gameObject);SceneManager.LoadScene("Main");}}
}

四、将以上两个脚本挂载到场景中的物体上,并且为其赋值,运行项目,已经实现了该功能,如下图所示:

Unity实现播放Ogg格式视频功能实现相关推荐

  1. 解决 Ubuntu 无法播放 MP4 格式视频的问题的办法

    解决 Ubuntu22.04 无法播放 MP4 格式视频的问题的办法 问题原因:         系统中的终端上安装缺少的编解码器. 解决办法: 第一条命令将更新存储库: sudo apt-get u ...

  2. video插件播放m3u8格式视频(存原生)

    video插件播放m3u8格式视频(存原生) 这里使用原生的javascript实现m3u8格式视频播放. 使用了包括video.min.js库和HLS插件. 1-基础使用 <!DOCTYPE ...

  3. html背景mov,科技常识:html5自动播放mov格式视频的实例代码

    今天小编跟大家讲解下有关html5自动播放mov格式视频的实例代码 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关html5自动播放mov格式视频的实例代码 的相关资料,希望小伙伴们看了有 ...

  4. html怎样自动播放视频,html5自动播放mov格式视频的实例代码

    这个不算啥新奇吧?但还是记录一下. 这个问题应该这么看. 1.首先网站要支持.MOV格式文件 就是说,网站要能识别.MOV格式文件. 如何识别?设置MIME类型.以IIS为例.除了可以在IIS界面上直 ...

  5. 通过Vue+flvjs在HTML5中播放flv格式视频文件—demo及api

    目前主流浏览器不能直接嵌入并且播放FLV文件,所以直接用video标签播放是行不通的. 因此提供两种解析方法 嵌入一个swf媒体播放文件,并利用该文件来播放你预设的文件. 这里推荐dplayer--h ...

  6. 使用Gstreamer播放未知格式视频(python)

    使用Gstreamer播放未知格式视频(python) 1.播放含Audio的未知格式视频   使用Gstreamer中的decodebin来实现.实现图解: 实现代码如下: import gi gi ...

  7. iOS设备播放mkv格式视频无声音解决

    iOS设备播放mkv格式视频无声音解决 拿iPhone看随时随地看电影美剧十分方便,无奈mkv格式视频总是没有声音.google一下才知,视频中的ac3格式的音频由于版权问题,大部分免费的播放器都被不 ...

  8. srs服务器播放文件,使用SRS+ffmpeg搭建流媒体服务器播放m3u8格式视频

    1.简介 srs是一个简单的流媒体开源直播软件,ffmpeg是完整的跨平台解决方案,用于记录,转换和流传输音频和视频. 2.相关 官网下载页面:点击我到达 在线演示播放页面:点击我到达 Git页面:点 ...

  9. video标签播放m3u8格式视频-------html页面

    m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过 编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般 ...

  10. android无法播放视频文件格式,基于Android引入IjkPlayer无法播放mkv格式视频的解决方法...

    写在前面 项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,默认是不支持mkv和rmvb格式视频的播放的. 用了一天时 ...

最新文章

  1. 使程序在后台执行,并将日志输出至文件
  2. P(Y=y|x;θ)表示什么意思
  3. 【Python-ML】非线性映射降维-KPCA方法
  4. linux dmesg命令(显示开机信息)
  5. WinHand.cpp Line 199 错误 WinHand.cpp Line 218 错误
  6. 获取页面所有属性并生成html6,JavaScript基础练习题(三)
  7. kettle安装教程
  8. python删除txt文本文件第一行数据
  9. 计算机论文要求多少字,论文需要写多少字
  10. WSJ新闻标题的中心词提取
  11. ubuntu搜狗拼音输入法无法切换英文
  12. python计算机器人运动学分析_orocos_kdl学习(二):KDL Tree与机器人运动学
  13. 【JS】每日一题:模块化
  14. java添加tomcat_Java以及Tomcat配置
  15. [语录]足球解说员贺炜语录
  16. 【汇正财经】证券市场的基本功能有哪些?
  17. 訾博 2021年1月29日 周五 晴 致敬“最可爱的人”
  18. MYSQL字段属性之int() 和 tinyint()的区别
  19. mysql中IGNORE使用
  20. linux yum pcre安装路径,yum 安装的pcre源码目录在哪

热门文章

  1. spring5教程(一)——Overview
  2. 好听无损的flac格式歌曲怎么转换成mp3格式的
  3. python提取图像HOG特征
  4. 7- 代码段权限检查与 jmp
  5. 微信公众号推送消息模板(抖音挺火的推送消息给女朋友)
  6. 最后的作业——NP完全问题证明
  7. 网络调试分析的工具①
  8. 饥荒联机 显示服务器小麻烦,饥荒联机版新手从入门到精通教程
  9. 计算机网络与通信技术教案,计算机网络技术教案
  10. 2019年最新web前端笔试题