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

本文介绍了如何在Unity中利用C#脚本实现Ogg视频格式的播放功能。首先,通过创建RawImage组件作为视频纹理的显示区域,然后创建SpriteInfo和MoviePlayer两个脚本,分别用于读取和播放视频。在SpriteInfo脚本中加载Ogg视频文件,而在MoviePlayer脚本中实现播放、暂停、停止等控制操作。最后,将脚本挂载到场景并设置参数,即可在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 initialization private 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 initialization void Start () { instance = this; Play0(); } // Update is called once per frame void 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"); } } }
四、将以上两个脚本挂载到场景中的物体上,并且为其赋值,运行项目,已经实现了该功能,如下图所示:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值