视频格式和视频的编解码器,会影响 Unity 在不同平台是否能正常播放视频
一、视频格式
视频文件本质上就是一个“数据容器” ,它不仅可以包含视频数据本身它还包括
-
音频
-
字幕
-
轨道信息(轨道还可以有多个,比如不同语言的字幕,不同语言的音频)
等等其它内容
不同格式的视频文件,比如.mp4、.mov、.avi、.webm等,他们表示视频文件中的数据是使用某种容器格式排列的
二、编码器和解码器
为了节省带宽和存储空间,视频中每个轨道(不同的音频,字幕等等信息) ,都使用“编解码器”进行编码和解码
编码器负责压缩数据,解码器负责解压数据,通过他们对视频数据进行压缩和解压
常见的视频编解码格式为 H.264,常见的音频编解码格式为 AAC
硬件解码:
目前大多数的设备都有专用于解码视频的硬件,一般是由 GPU(图形处理器,显卡的核心硬件)来进行硬件解码的
使用 GPU 进行硬件解码可以降低 CPU 的工作负荷,降低功耗, 节省电量,节省性能
这种硬件加速可通过本机自定义 API 实现,这些 API 因平台而异
Unity 帮助我们进行了封装,提供了通用的 API 供我们使用
Unity 也会自己帮助我们判断来进行硬件解码
- 优点:效率高,降低功耗
- 缺点:无法支持所有视频格式文件,画质不是特别清晰
软件解码:
软件解码相当于就是 Unity 自己利用 CPU 进行计算来进行解码 ,此软件解码方案使用 VP8 视频编解码器和 Vorbis 音频编解码器
如果平台的硬件解码方式在分辨率、多个音频轨道或 Alpha 通道支持方面带来 了不必要的限制,则软件解码将非常有用
但是软件解码会增加 CPU 的工作负荷 ,Unity 也提供了基于软件的视频解码
- 优点:能够解码所有视频格式文件,画质更加清晰
- 缺点:增加 CPU 工作负荷,更耗电,解码时会造成明显卡顿
Unity 两种方式都有提供,但具体使用的哪种要根据平台而定
三、视频兼容性
我们可以在 Windows、MacOS 这两个常用操作系统上使用 Unity 进行开发,我们可以将很多不同格式的视频文件导入 Unity 中
但是如果我们想要正常的在 Unity 编辑器中预览视频文件,那么视频文件必须和这些平台兼容(必须是该平台支持的视频格式)
而视频是否兼容对应平台,主要由两个因素决定:
-
视频文件格式
-
视频文件使用的编解码器
扩展名 | Windows | MacOS | Linux |
---|---|---|---|
.asf | ✔️ | ||
.avi | ✔️ | ||
.dv | ✔️ | ✔️ | |
.m4v | ✔️ | ✔️ | |
.mov | ✔️ | ✔️ | |
.mp4 | ✔️ | ✔️ | |
.mpg | ✔️ | ✔️ | |
.ogv | ✔️ | ✔️ | ✔️ |
.vp8 | ✔️ | ✔️ | ✔️ |
.webm | ✔️ | ✔️ | ✔️ |
.wmv | ✔️ |
一般我们在 Windows(微软的操作系统)上使用 Unity 开发游戏,或者在 macOS(苹果的操作系统)上开发游戏
所以我们主要看这两个平台上支持的格式
Windows 和 macOS 都支持的格式:.dv、.m4v、.mov、.mp4、mpg、mpeg、.ogv、vp8、webm
建议选择最常见的.mp4,是不会错的
就算使用了都支持的文件格式,但是如果制作视频时使用的编解码器在平台上不受支持,也会导致视频不能正常使用或者引起 Unity 报错
建议大家使用 H.264 编解码器制作视频,它是大多数平台支持的最佳视频编解码器,提供最佳的跨平台兼容性
如果想了解更多 Windows 和 macOS 操作系统支持的编解码器:
Windows: https://docs.microsoft.com/en-us/windows/win32/medfound/supported-media-formats-in-media-foundation
macOS: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/OSX_Technology_Overview/MediaLayer/MediaLayer.html
四、目标平台兼容性
我们刚才提及的兼容性内容都是基于 Unity 编辑器的,考虑的都是使用 Unity 编辑器进行开发的平台能不能播放视频
但是视频最终在哪个平台播放对于玩家来说才是更重要的
比如:我们在 Windows 上开发,最终要发布为 IOS、Android 平台上,那么这个视频最终目的是要在 IOS、Android 这两个操作系统上能正常播,Windows 能不能正常播其实都不是那么重要了,不能播无非就是不能预览
但是如果在目标平台上不能播放,那么玩家体验是极其不好的
所以目标平台的兼容性问题考虑的就是目标平台是否可以正常播放视频
(一)视频与Unity编辑器平台兼容,与目标平台不兼容
比如:
视频和 Windows 或者 MacOS 操作系统兼容,但是与要发布游戏的 IOS 或者 Android 平台不兼容
解决方案:
Unity 视频剪辑导入器提供了转码功能,当我们发布应用时可以进行转码来解决该问题(之后讲解)
Unity 自带转码功能,可以将视频编解码器转码为 H.264、H.265、VP8
所谓的转码,就是将视频原本的编解码规则变为其它的标准
(二)视频与Unity编辑器平台不兼容,与目标平台兼容
比如:
视频和 Windows 或者 MacOS 操作系统不兼容,但是与要发布游戏的 IOS 或者 Android 平台兼容
解决方案:
一般这种情况下,我们是更希望使用兼容发布平台的格式和编解码器的,所以我们可以将这些资源放置在 StreamingAssets 文件夹中
在使用视频时,我们根据所在的平台选择性使用对应内容
Define | 功能 |
---|---|
UNITY_EDITOR | 用于从游戏代码中调用 Unity Editor 脚本的 #define 指令。 |
UNITY_EDITOR_WIN | 用于 windows 上的 Editor 代码的 #define 指令。 |
UNITY_EDITOR_OSX | 用于 Mac OSX 上的 Editor 代码的 #define 指令。 |
UNITY_EDITOR_LINUX | 用于 Linux 上的 Editor 代码的 #define 指令。 |
UNITY_STANDALONE_OSX | 用于专门为 Mac OSx(包括 Universal、PPc 和 intel 架构)编译或执行代码的 #define 指令。 |
UNITY_STANDALONE_WIN | 用于专门为 windows 独立平台应用程序编译/执行代码的 #define 指令。 |
UNITY_STANDALONE_LINUX | 用于专门为 Linux 独立平台应用程序编译/执行代码的 #define 指令。 |
UNITY_STANDALONE | 用于为任何独立平台(Mac OSX、Windows 或 Linux)编译/执行代码的 #define 指令。 |
UNITY_Wii | 用于为 Wii 游戏主机编泽/执行代码的 #define 指令。 |
UNITY_IOS | 用于为 IOS 平台编译/执行代码的 #define 指令。 |
UNITY_IPHONE | 已弃用。改用 UNITY_IOS。 |
UNITY_ANDROID | 用于 Android 平台的 #define 指令。 |
UNITY_PS4 | 用于运行 PlayStation 4 代码的 #define 指令。 |
UNITY_XBOXONE | 用于执行 Xbox One 代码的 #define 指令。 |
UNITY_LUMIN | 用于 Magic Leap OS 平台的 #define指令。也可以使用 PLATFORM_LUMIN。 |
UNITY_TIZEN | 用于 Tizen 平台的 #define 指令。 |
UNITY_TVOS | 用于 Apple Tv 平台的 #define 指令。 |
UNITY_WSA | 用于通用 windows 平台的 #define 指令。此外,根据 .NET Core和使用 .NET 脚本后馎来编译 C# 文件时会定义 NETFX_CORE. |
UNITY_WSA_10_0 | 用于通用 windows 平台的 #define 指令。此外,根据 .NET Core来编译 C# 文件时会定义 WINDOWS_UWP. |
UNITY_WINRT | 与 UNITY_WSA 相同。 |
UNITY_WINRT_10_0 | 等效于 UNITY_wSA_10_0 |
UNITY_WEBGL | 用于 webGL 的 #define 指令. |
UNITY_FACEBOOK | 用于 Facebook 平台(webGL 或 windows 独立平台)的 #define 指令。 |
UNITY_ANALYTICS | 用于从游戏代码中调用 Unity Analytics 方法的 #define 指令。5.2 及更高版本。 |
UNITY_ASSERTIONS | 用于断言控制过程的 #define 指令。 |
UNITY_64 | 用于 64 位平台的 #define 指令. |
(三)视频与Unity编辑器平台和目标平台都兼容
在这种情况下,我们不需要进行额外的处理,直接正常关联视频进行播放即可
这种情况也是我们更加希望达到的,这样我们就不需要转码,也不需要根据平台判断了
总结:
- 最保险的组合就是 .mp4 格式 + h.264 编解码器
- 如果游戏想要发布的平台很多,那么编解码器可以使用 VP8
- H.265 是新的编码协议,也即是 H.264 的升级版
- H.265 标准保留 H.264 原来的某些技术,同时对一些相关的技术加以改进
- 新技术使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置
- 可使用 h.265 编解码器的平台 :
- macOS 11.13+
- windows windows 10
- IOS 11.0+