VideoPlayer 介绍:

Unity正式发布了5.6版本后,作为5.x版本的最后一版还是有不少给力的更新的。其中新加入了一个Video Player控件,用以取代之前的MovieTexture。


Video Player提供了多种视频渲染的方式,包括Camera Far Plane,Camera Near Plane,Render Texture,Material Override,Api Only。

Camera Far Plane:基于摄像机的渲染,渲染在摄像机的远平面上,需要设置用于渲染的摄像机,同时可以修改alpha通道的值做透明效果,可用于背景播放器。

Unity--VideoPlayer的使用案例_赋值

Camera Near Plane:基于摄像机的渲染,渲染在摄像机的近平面上,需要设置用于渲染的摄像机,同时可以修改alpha通道的值做透明效果,可用作前景播放器。

Unity--VideoPlayer的使用案例_赋值_02

Render Texture:将视频画面保存在Render Texture上,以供物体或者RawImage使用,可以用来做基于UGUI的播放器。

Unity--VideoPlayer的使用案例_Unity_03

Material Override:将视频画面复制给所选Render的Material。需要选择具有Render组件的物体,可以选择赋值的材质属性。可制作360全景视频VR视频。

Unity--VideoPlayer的使用案例_Unity_04

Api Only:不要在任何地方绘制视频内容,但仍可通过API中的VideoPlayer的纹理属性使其可用。


本地视频播放:

直接将视频拖到VideoClip上

Unity--VideoPlayer的使用案例_ios_05

网络视频播放:

将网络视频的链接写到URL上面

Unity--VideoPlayer的使用案例_ios_06

这个时候我们会发现,播放的时候没有声音。

我们只要添加一个Audio Source组件,将他赋给VideoPlayer里面的Audio Source就有声音了,如下图所示。

Unity--VideoPlayer的使用案例_ide_07

VideoPlayer脚本控制:

脚本控制(需引用UnityEngine.Video):
VideoPlayer的脚本控制与AudioSource相似,有常规的Play,Pause,Stop方法,也有用于进度控制的time,isPlaying,isLooping,frame,frameCount等属性。
VideoPlayer可以使用一系列事件来监听播放的各个动作:

  • errorReceived: 错误监听到时被执行。
  • frameDropped :有丢帧发生时被执行。
  • frameReady :新的一帧准备好时被执行。
  • loopPointReached :播放结束或播放到循环的点时被执行。
  • prepareCompleted :视频准备完成时被执行。
  • seekCompleted :查询帧操作完成时被执行。
  • started:在Play方法调用之后立刻调用。


下面是部分代码实现,具体工程可以点击这里下载,​​Unity——VideoPlayer完整运行实例​​:

工程截图:

Unity--VideoPlayer的使用案例_Unity_08

VideoPlayer初始化:

private void Init(string url)
{
show = true;
isVideo = true;
mute = false;
time_Count = 0;
time_Current = 0;
sliderVideo.value = 0;
//设置RenderTexture或RawImage上渲染VideoPlayer
vPlayer.renderMode = VideoRenderMode.RenderTexture;
//设置为URL模式
vPlayer.source = VideoSource.Url;
//设置播放路径
vPlayer.url = url;
//在视频中嵌入的音频类型
vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//当VideoPlayer全部设置好的时候调用,帧立即可用
vPlayer.prepareCompleted += OnPrepareFinished;
//准备播放所需要的资源,预加载部分或者全部要播放的视频
vPlayer.Prepare();
}

VideoPlayer的prepareCompleted执行回调,按照Unity官方文档,直接调用Play()方法,也会先调用Prepare()方法,等待准备完毕,才会播放:

void OnPrepareFinished(VideoPlayer player)
{
//把图像赋给RawImage
image.texture = vPlayer.texture;
//帧数/帧速率=总时长 如果是本地直接赋值的视频,我们可以通过VideoClip.length获取总时长
sliderVideo.maxValue = vPlayer.frameCount / vPlayer.frameRate;

time = sliderVideo.maxValue;
hour = (int)time / 60;
mint = (int)time % 60;
text_Count.text = string.Format("/ {0:D2}:{1:D2}", hour, mint);

sliderVideo.onValueChanged.AddListener(delegate { ChangeVideo(sliderVideo.value); });

player.Play();
}