Video in Unity
视频概念
硬解码:通过硬件(GPU)来解码视频,优点是效率高,降低功耗,缺点支持格式少
软解码:利用CPU来解码视频
**帧率:**视频是由于一幅幅图组合而成,帧率越高,表现的越丝滑
**码率:**也叫比特率,是一定时间内传输多少比特(bit)。计算方法:如一帧图大小是0.8kb,那么码率30帧就是0.8kbx8(一个byte有8bit)=6.4kbx30= 192 kb/s
推荐一个视频解码器:下载 K-Lite 编解码器包 (codecguide.com)
或者直接下载potPlayer和VLN软件也会自带一些解码器
Unity中播放视频;
- VideoPlayer
- AVPro插件
- CRIWARE中国官网网站
Unity视频视频格式问题
在unity中采用VideoPlayer播放视频会有很多日志警告
这里采用HandBrake软件对视频进行编码
Unexpected timestamp values detected. This can occur in H.264 videos not encoded with the baseline profile…
将视频进行baseline编码
参考:Bug - UWP HoloLens 2 App Crash after some seconds when reading video - Unity Forum
Is it only happening in the build and not on the Desktop? Can you try transcoding your file in baseline? I see it is High@L4.2. You can do that using FFmpeg or the software you used to encode your file.
Code (CSharp):
- ffmpeg -i input.mp4 -c:v libx264 -preset fast -profile:v baseline out.mp4
First video frame not zero: 2 (0.083333s). Result may be out of sync….
开始帧没对齐 用视频重新转一下就ok
WindowsVideoMedia error unhandled Color Standard: 0 falling back to default this may result in rendering issues
参考:Video - Null Reference Exception when playing video - Unity Forum
Question - Video file problem - Unity Forum
Yeah, the “Unexpected timestamp values detected” warning tells you that we have to offset the video timestamps, and frame accuracy will be impacted negatively because it was not encoded using the baseline profile. For most users, it is not an issue. But if you care, you should encode your file using the baseline profile.
The “WindowsVideoMedia error unhandled color standard: 0” warn that the video file doesn’t specify its color standard and we took a guess and chose BT.709 as it is the most popular. In Unity, we support BT.601, BT.709, and BT.2020. Again for most users, it is not an issue. But if you care or see a color shift because your file is not BT.709, you should specify the color standard while encoding your video files.
将色彩空间修改成 BT601 BT701 BT2020
即可
AudioSampleProvider buffer overflow. XXX frames discarded
AudioSampleProvider buffer overflow_skip on drop-CSDN博客
播放透明视频
在unity中呈现透明视频播放主要有一下几种方式:
- 利用Unity自带的
VideoPlayer
播放透明视频 - 利用
AVpro插件
播放格式为Hap alpha
或者Hap Q alpha
的.mov
或.avi
- 利用
Avpro
播放通道分离的.MP4
视频 - 利用shader 分离进行透明分离(暂不讨论)
本文最后会介绍一个自己做的小工具用于转换透明视频
利用Unity自带的VideoPlayer组件播放透明视频
unity在5.6版本增加了播放视频的的功能,对应的就是VideoPlayer组件. 在Unity中暂时支持两种透明格式的视频,链接说明
.webm
是Google基于 以 Matroska(就是我们熟知的 MKV)容器格式为基础开发的新容器格式,里面包括了 VP8 视频和 Ogg Vorbis 音轨 .apple prores 4444
视频格式,此格式不太熟,具体看官方说明 ,附上一个apple prores 4444 视频说明
将导入的.webm视频放入unity中查看
如上,那么这个视频就是支持透明通道了 接着只要按照寻常的方法用VideoPlayer组件对其进行播放即可
制作webm视频
一般在pr或者 Media Encoder 中制作视频导出的时候 没有是webm格式,这个时候就需要下载插件,插件链接
导出的时候(搬图)
注意: 一般webm视频 我们不需要其他的一些操作就可以支持透明视频,在android平台上面 需要一些操作
在官方文档中也有说明:视频文件兼容性 - Unity 手册
Webm 与 VP8
.webm 文件格式对规范进行了改进,因此可在与 VP8 视频编解码器结合使用时携带原生的 Alpha 信息。这意味着任何 Editor 平台都可以读取使用这种透明度格式的视频。由于 Unity 支持的大多数平台都使用软件实现方案来解码这些文件,因此不需要为这些平台进行转码。一个需要注意的例外情况是 Android。该平台的原生 VP8 支持中不包括透明度支持,这意味着必须启用转码,以便 Unity 使用其内部 Alpha 表示方法也就是我们要手动对其进行转码
利用Avpro 播放编码格式为Hap alpha或者Hap Q alpha 的.mov或.avi
hap codec
格式支持Windows和mac os x平台 ,并且有以下几处优点:
- CPU使用率极低
- GPU解压缩
- 内存使用率低
- 支持非常高分辨率
- 支持alpha通道透明
缺点:
- 文件过大
Avpro支持AVI 和MOV 但是更加推荐Mov.
hap codec 有至少四种编码 hap
hap alpha
hapq
(高质量) hapq alpha
然后在 AvPro中选择 DirectShow
导出mov文件
Quick time Hap
导出hap alpha 格式的mov视频可以下载quick time 然后下载编码格式插件
导出的时候设置:
直接在PR或者Media Encoder中导出
如果觉得麻烦,可以直接在pr中导出hap alpha 编码格式,插件下载链接
然后在pr 或者media encoder 中导出选择hap 编码格式为hap alpha
或者 hap q alpha
利用ffmpeg 转换
- ffmpeg -i input.mov -vcodec hap -format hap output-hap.mov
- ffmpeg -i input.mov -vcodec hap -format hap_alpha output-hap.mov
- ffmpeg -i input.mov -vcodec hap -format hap_q output-hap.mov
注意:
- 可以添加
-chunks 4
将解码添加到多线程中 加快视频解码过程 - 视频长宽必须是4的倍数
利用AVpro 播放通道分离的mp4视频
这算是一种通用方法了,几乎平台都支持,唯一的缺点就是会增加视频的分辨率 这将会导致一些播放硬件的不支持
在Avpro的demo场景Demo_Transparency
就有两个透明龙视频 一个是左右分离 一个是上下分离
可以在AE软件中直接制作 也可以直接 用ffmpeg 转换
在用ffmpeg转换中 导出的mov编码要是 rgb+a
透明视频工具
这是基于FFmpeg 写的视频转换工具 主要就是调用ffmpeg命令
工具我上传到了GitHub
参考
https://blog.csdn.net/lvcoc/article/details/86303249
题外话
2020年的春节注定是难忘的,新型冠状病毒从武汉爆发衍生到全国各地 ,为了隔离病毒,防止蔓延,大多数地方封城,封村.希望全国上下齐心协力战胜这次灾难!!!
————— 在家躺尸n天的我