Unity播放视频的几种方式
简介 :许多游戏都是在开场CG播放后,进入主菜单的界面,例如炉石传说等。因此对unity播放视频的方式产生了兴趣,在查阅许多博客以及官方文档后,总结出以下几种方式,并以videoplayer方式制作一个简单的播放器
一、
首先是以MovieTexture方式播放视频,参考雨松MOMO的博客
这里原博客已经写的很详细了,这里不作过多阐述,仅以总结的方式描述
视频会以MovieTexture的方式导入unity
PC端
1.建立一个3d物体plane,修改plane的主纹理为导入的movietexture
2.通过UI直接绘制电影纹理movietexture
手机端
因为MovieTexture无法在手机上使用,因此在手机端上使用Handheld.PlayFullScreenMovie方式播放
备注:需要将视频放在Assets/StreamingAssets/路径下,、
二、
untiy在5.6版本推出了videoplayer控件,用以取代MovieTexture
导入的视频将默认以videoclip的格式保存,仍然保留MovieTexture格式的切换
以下是生成videoplayer控件的几种方式
1.新建一个空白的Video Player:选择菜单栏的GameObject->Video->Video Player或者在Hierarchy面板上选择Create->Video->Video Player或者右击Hierarchy面板空白处选择Video->Video Player。
2.直接将导入的VideoClip拖入场景或者Hierarchy面板,生成的VideoPlayer控件的VideoClip将会自动被赋值,如果场景中存在MainCamera,Camera也会被自动赋值为MainCamera,模式默认选择Camera Far Plane。
3.将导入的VideoClip拖动到场景中的Camera物体上,生成的VideoPlayer控件的VideoClip和MainCamera将会自动被赋值,模式默认选择Camera Far Plane。
4.将导入的VideoClip拖动到场景中的2D或者3D物体上,生成的VideoPlayer控件的VideoClip和Renderer将会自动被赋值,模式默认选择Material Override。
5.将导入的VideoClip拖动到场景中的UI物体上,生成的VideoPlayer控件的VideoClip将会自动被赋值,模式默认选择Render Texture。
视频来源
| videoclip | 导入的本地视频 |
| URL | 网络视频 |
以下是基本设置
| Play On Awake | 脚本载入时自动播放 |
| Wait For First Frame | 决定是否在第一帧加载完成后才播放,只有在Play On Awake被勾选是才有效 |
| Loop | 循环 |
| Playback Speed | 播放速度 |
Video Player视频渲染的方式
| Camera Far Plane | 基于摄像机的渲染,渲染在摄像机的远平面上,需要设置用于渲染的摄像机,同时可以修改alpha通道的值做透明效果,可用于背景播放器 |
| Camera Near Plane | 基于摄像机的渲染,渲染在摄像机的近平面上,需要设置用于渲染的摄像机,同时可以修改alpha通道的值做透明效果,可用作前景播放器 |
| render Texture | 将视频画面保存在Render Texture上,以供物体或者RawImage使用,可以用来做基于UGUI的播放器 |
| Material Override | 将视频画面复制给所选Render的Material。需要选择具有Render组件的物体,可以选择赋值的材质属性。可制作360全景视频和VR视频 |
| API Only | 未知 |
Video Player监听事件
| errorReceived | 错误监听到时被执行 |
| frameDropped | 有丢帧发生时被执行 |
| frameReady | 新的一帧准备好时被执行 |
| loopPointReached | 播放结束或播放到循环的点时被执行 |
| prepareCompleted | 视频准备完成时被执行 |
| seekCompleted | 查询帧操作完成时被执行 |
| started | 在Play方法调用之后立刻调用 |
视频的声音输出有两种方式
| direct | 直接和视频画面一起输出 |
| Audio Source | 添加一个Audio Source组件,以Audio Source的方式输出 |
看了许多博客,有关于声音输出的两个问题
1.direct方式没有声音输出
这个问题在我运行中并没有碰到,因此无法理解其原因,大多解决办法是通过Audio Source方式添加Audio Source组件播放声音,留待考究。
2.有声视频和无声视频切换会造成无声
留待考究
三、
下面通过Video Player方式制作一个简单的视频播放器
以Render Texture的方式将视频渲染到新建的movie材质上,再新建一个UI-RawImage,将movie材质赋给它,再创建几个UI-Botton用来实现开始、暂停、倍速、快进等功能

新建一个空对象用来挂载脚本,再将脚本中的函数与UI的事件进行绑定
using UnityEngine;
using UnityEngine.Video;
using UnityEngine.UI;
public class MyVideo : MonoBehaviour
{
public VideoPlayer vPlayer;
public GameObject rawImage;
private double totaltime; //视频总时长
private float skiptime = 10; //快进or快退的时间
void Start()
{
vPlayer.loopPointReached += EndReached;
totaltime = vPlayer.length;
}
//当视频播放完毕时关闭视频
void EndReached(VideoPlayer vPlayer)
{
rawImage.SetActive(false);
}
//关闭视频
public void close()
{
vPlayer.Stop();
rawImage.SetActive(false);
}
//播放or暂停
public void startandpause()
{
if(vPlayer.isPaused==true)
{
vPlayer.Play();
}
else if (vPlayer.isPlaying == true)
{
vPlayer.Pause();
}
}
//倍速播放
public void playspeed(int value)
{
float speed=1;
switch (value)
{
case 0:
speed =1;
break;
case 1:
speed =0.5f;
break;
case 2:
speed =1.5f;
break;
case 3:
speed =2.0f;
break;
}
vPlayer.playbackSpeed = speed;
}
//快进
public void next()
{
vPlayer.time += skiptime;
}
//快退
public void last()
{
vPlayer.time -= skiptime;
}
}
参考:
github地址:https://github.com/Stardust-Alter/unity-video-player
