Video in Unity
视频概念
(推荐一个视频解码器:下载 K-Lite 编解码器包 (codecguide.com) 和一个编码器HandBrake/HandBrake: HandBrake’s main development repository
或者直接下载potPlayer和VLN软件也会自带一些解码器)
- 硬解码:通过硬件(GPU)来解码视频,优点是效率高,降低功耗,缺点支持格式少
- 软解码:利用CPU来解码视频
- 帧率:视频是由于一幅幅图组合而成,帧率越高,表现的越丝滑
- 码率:也叫比特率,是一定时间内传输多少比特(bit)。计算方法:如一帧图大小是0.8kb,那么码率30帧就是0.8kbx8(一个byte有8bit)=6.4kbx30= 192 kb/s
- encoder profile
Profile | 核心功能 | 兼容性 | 适合场景 | Unity+AvPro 建议 |
---|---|---|---|---|
Baseline | 仅支持 I/P 帧,无 B 帧,无高级算法 | 最广(支持所有设备) | 实时通信(如视频会议)、低端设备 | 若需兼容 Android 4.0 以下,选此项 |
Main | 增加 B 帧支持,基础 H.264 功能 | 广(支持 95% 以上设备) | 标准清晰度视频(如 720p 电影) | 移动端优先选择,平衡兼容性与效率 |
High | 增加更多高级算法(如 CABAC 熵编码) | 高(支持 90% 以上现代设备) | 高清 / 4K 视频、游戏过场动画 | 推荐选项:兼顾兼容性与画质 |
High 10 | 支持 10 位色深(更广色域) | 中(需较新设备) | HDR 视频、专业影视制作 | 仅当项目明确需要 10 位色深时使用 |
High 4:2:2 | 支持 4:2:2 色度采样(更高色彩精度) | 低(仅专业设备) | 广播级视频、调色需求高的内容 | 不推荐,Unity 很少需要如此高精度 |
High 4:4:4 | 支持 4:4:4 色度采样(无损色彩) | 极低(仅高端设备) | 无损视频传输、动画渲染 | 不推荐,体积极大且兼容性差 |
- encoder level
Level | 最大分辨率 | 最大帧率(fps) | 最大比特率(Mbps) | 典型应用场景 |
---|---|---|---|---|
1.0 | 176×144 (QCIF) | 15 | 0.064 | 监控摄像头、极低画质视频 |
3.0 | 720×576 (SD) | 30 | 10 | 标清视频、手机短视频 |
4.0 | 1920×1080 (FHD) | 30 | 20 | 1080p 视频、游戏内过场动画 |
4.1 | 1920×1080 (FHD) | 60 | 24 | 1080p 60fps 视频、高动态游戏画面 |
5.0 | 3840×2160 (4K) | 30 | 100 | 4K 视频、电影预告片 |
5.1 | 3840×2160 (4K) | 60 | 135 | 4K 60fps 视频、专业影视制作 |
总结就是首选high profile 移动端 main, level在handbreake软件中选auto
- CRF
还有就是CRF(或者叫RF)强烈建议选择 固定质量 (Constant Quality / CRF) 编码,而不是平均码率 (Average Bitrate / ABR)
CRF保证在不损质量情况下动态调节码率,保证视频质量一致性.对于简单的场景,它会使用较低的码率;对于复杂的场景,它会使用较高的码率。这通常会带
来比固定码率更好的质量-文件大小平衡。通常分辨率越高的视频,可以适当提高 RF 值(即牺牲一点点质量),因为高分辨率的细节更多,轻微的质量损失不
容易被察觉。反之,低分辨率的视频如果 RF 值太高,画面劣化会更明显
关键帧间隔
如果要seek 拖动进度条就需要添加关键帧间隔 方便定位
keyint=120
(对于60fps视频,每2秒一个关键帧) keyint=60 (对于30帧 每2秒一个关键帧)关闭B帧
B帧(Bidirectional frames)可以提高压缩效率,但会增加解码的复杂性,在某些旧设备或性能受限的Unity播放器上可能导致卡顿或兼容性问题。关闭B帧有助于提高兼容性和播放流畅性。bframes=0
Unity中播放视频常见的三种方式
- VideoPlayer
- AVPro插件
- CRIWARE中国官网网站
Unity视频视频格式问题
在unity中采用VideoPlayer播放视频会有很多日志警告
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天的我