Unity提供了Video Player组件来专门处理视频,只需将视频文件直接拖入Hierarchy便可以自动创建。

视频播放器 (Video Player) 组件 - Unity 手册 (unity3d.com)

视频文件

Unity支持的视频文件包括.mp4、.mov、.webm、.wmv。另外,视频文件还支持从一个网址播放。

视频类型

一些MP4在线视频测试URL

http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4

http://vjs.zencdn.net/v/oceans.mp4

https://media.w3.org/2010/05/sintel/trailer.mp4

http://mirror.aarnet.edu.au/pub/TED-talks/911Mothers_2010W-480p.mp4

http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4

http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4

http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4

http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4

http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4

http://vfx.mtime.cn/Video/2019/03/18/mp4/190318214226685784.mp4

http://vfx.mtime.cn/Video/2019/03/19/mp4/190319104618910544.mp4

http://vfx.mtime.cn/Video/2019/03/19/mp4/190319125415785691.mp4

http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4

http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4

http://vfx.mtime.cn/Video/2019/03/14/mp4/190314102306987969.mp4

http://vfx.mtime.cn/Video/2019/03/13/mp4/190313094901111138.mp4

http://vfx.mtime.cn/Video/2019/03/12/mp4/190312143927981075.mp4

http://vfx.mtime.cn/Video/2019/03/12/mp4/190312083533415853.mp4

http://vfx.mtime.cn/Video/2019/03/09/mp4/190309153658147087.mp4

其他格式(MP4, flv, mkv, 3gp) 视频下载

https://www.sample-videos.com/index.php#sample-mp4-video

视频渲染模式

Video Player组件可以设置自己的Render Mode。根据不同的模式,指定Camera、Render Texture或Renderer等

视频渲染模式

  • Camera Far Plane:将视频渲染在摄像机远处,这样前景的对象就会挡住视频;
  • Camera Near Plane:将视频渲染在摄像机近处,这样视频就会在最前面(与摄像机组件Far Clip Plane和Near Clip Plane有关)
  • Render Texture:将视频渲染在一张Renderer Texture上
  • Material Override:将视频渲染在一张Renderer(比如mesh Renderer)绑定的material上,可以单独设置Material Property。当设置为 None 时,使用与 Video Player 组件相同的 GameObject 上的 Renderer。
  • API Only:将视频渲染到 VideoPlayer.texture Scripting API 属性中。您必须使用脚本将纹理分配到其预期目标。

Camera Far Plane

视频自适应

在选用Camera Far Plane、Camera Near Plane、Render Texture这三种渲染模式下,可以设置视频缩放比例

自适应模式 效果
No Scaling 不缩放视频,视频在游戏界面居中播放
Fit Vertically 缩放视频源以垂直适合游戏界面,如有必要,裁剪左右两侧或在每一侧留下空隙。视频源纵横比被保留。
Fit Horizontally 缩放视频源以水平适合游戏界面,裁剪顶部和底部区域或在需要时在上方和下方留下空隙。视频源纵横比被保留。
Fit inside 缩放源以适合游戏界面,而无需裁剪。根据需要在左右或上下留下空隙。源纵横比被保留。
Fit Outside 缩放源以适合游戏界面,而不会在左右或上下或上下留下空隙,并根据需要进行裁剪。源纵横比被保留。
Stretch 水平或垂直缩放以适合游戏界面。不保留源纵横比。

为保证视频完整显示且保持原纵横比,FIt Inside比较好。

跳过视频

一般视频需要渲染在UI摄像机上,使用Camera Far Plane模式,因为UI摄像机和主摄像机不同,所以可以让视频渲染在场景的前面,UI的后面。

新建SkipVideo脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class SkipVideo : MonoBehaviour
{
public Button skipButton;
public VideoPlayer videoPlayer;
void Start()
{
skipButton.onClick.AddListener(() =>
{
videoPlayer.Stop();
});
}
}

跳过

视频渲染在材质上

在场景中创建一个Plane面板,接着给它绑定一个新材质,最后将视频渲染模式设为Material Override。将Mesh Renderer拖入Renderer中,这个视频就被渲染在Plane面板上了。

将Plane的X设为90,Y设为180

Unity默认是不渲染Plane的背面的。

Material Override

视频Render Texture

创建Render Texture,将Render Mode改为Render Texture,并将新建的Render Texture放在Target Texture上面。

然后在场景中创建UI——Raw Image,将新建的Render Texture放进来。

Render Texture模式

播放工程外视频

通过URL,不只能播放网络视频,还能播放工程外部的本地视频。使用file://前缀即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class ChooseVideo : MonoBehaviour
{
public VideoPlayer videoPlayer;
public InputField inputField;
public Button button;
void Start()
{
button.onClick.AddListener(() =>
{
videoPlayer.source = VideoSource.Url;
videoPlayer.url = string.Format("file://{0}", inputField.text);
videoPlayer.Play();
});
}
}

播放本地

自定义视频显示

视频的渲染模式可以选择API Only,不依赖Unity,自动将视频渲染出来,然后拿到视频底层输出的Texture贴图,接着自行将它渲染出来。

例如,有多个视频文件,如果需要融合播放,就可以自己做个Shader,将多个videoPlayer.texture传进去,最后将它们融合并渲染出来。

视频进度

使用Slider调节视频的进度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class AdjustVideoProgress : MonoBehaviour
{
public VideoPlayer videoPlayer;
public Slider slider;
void Start()
{
slider.minValue = 0f;
slider.maxValue = (float)videoPlayer.clip.length;
slider.onValueChanged.AddListener(value =>
{
videoPlayer.time = value;
});
videoPlayer.Play();
}
}