
本专栏节选调整自同样是我编写的MMD学习手册,需要更全面的MMD介绍可以去看文档:https://docs.qq.com/doc/DWGpIeExER0xTYUFG 或者同一文集中的其他专栏。
由于MMD自带的编码格式导出的视频实在过于巨大,很容易就超过百G了,所以一般情况下是通过安装UtVideo之类的编解码器套件,来获得更多可以使用的视频编码格式。
首先是如何安装Ut Video Codec Suite。前往UtVideo的GitHub页面(https://github.com/umezawatakeshi/utvideo),点击Releases的最新版本(Latest)下载

下载utvideo-23.2.0-win.exe和utvideo-23.2.0-win.zip都可以。

如果是exe文件,双击后选择目录安装就行了,安装后是下图这些内容。如果需要卸载,在安装时选择的文件夹里点击unins000.exe就能进行卸载。

如果是zip压缩包,解压后则是下图这些内容。需要右键install.bat以管理员身份运行进行安装,卸载则是双击uninstall.bat。安装后会在浏览器弹出作者的博客与nico静画网页,同时还有ReadMe文件。

需要科普的是,32位MMD支持通过VFW(Video for Windows)接口获取编码器导出视频,安装UtVideo后带VCM(Video Compression Manager)后缀的就是通过VFW接口添加的编码器。
所以另一个能导出H264编码视频的x264vfw编码器,从名字来看就知道是通过VFW接口使用的。

当然现在并不建议使用32位MMD,而64位MMD不支持VFW,所以大家接触最多的应该是下面这些通过DMO(DirectX Media Objects)加载的UtVideo编码器。

zip压缩包里的utvideo.reg与utvideo-unreg.reg文件是注册与清理VCM编码器注册表的,对于DMO没有影响。
虽然这些编码器看上去名字一长串,但是去掉UtVideo和DMO后就相对来说比较清晰了。
首先是T2和Pro的前缀,这在ReadMe中有解释。T2理论上实现了更低的压缩率和更高的速度。Pro则是实现了10bit色深,其他编码默认都是8bit(但是8bit之间也有差别,后面会讲)。
然后是BT.601 和BT.709,又称为Rec.601和Rec.709,它们是两个不同的视频标准,在实际使用时主要是色域区别。现在的视频都是Rec.709,甚至有Rec.2020,或者其他专业流程的色彩标准。所以在当下,只用BT.709就行了。
接下来是分类最多的颜色模型(以什么方式表示颜色),所列编码器分为RGB和YUV两大类。RGB很容易理解,就是每个像素用红绿蓝三个值表示颜色,A就是alpha通道也就是透明度的意思。YUV则分为Y与UV,Y表示亮度值,UV(或者说Cb和Cr)表示蓝色差和红色差。意思是这个像素相比Y值,实际上在蓝色和红色偏差了多少,所以只需要Y通道就能够显示黑白画面,通过Cb与Cr也能够还原出彩色画面。
那么YUV(YCbCr)后面的444,422和420又是什么意思呢?假设一个视频使用了422的颜色采样方式,那么第一个4,代表着以水平的4个像素为最小单位采样(这是固定不变的);第二个2,代表着存储2个UV值来表示这4个像素;第三个2,代表着到了这4个像素的下一行,重新按照这个方式存储2个UV值;如果为0则是重复使用上一行的U/V值。
不论什么方式,每个像素都有独立的Y值,只是UV值的精度有区别。虽然数据量减少了很多,但是肉眼看上去并没有差很多,这就是利用了人对亮度比颜色的更敏感的原理。
体现在直观的画面结果上,444是每个像素都有独立的YCbCr值,画面没有任何损失;422是水平方向的CbCr值采样率减半(Y值没有变化),也就是横向每2个像素共用1个CbCr值;420则是在422的基础上,垂直方向的CbCr值采样率再减半,也就是每2*2个像素共用1个CbCr值。
ReadMe提到,420采样方式在使用了NV12格式时需要分辨率为4的倍数,虽然导出时电脑使用的第一顺位格式是YV12,但是使用420导出视频时最好使用常规分辨率。至于NV12和YV12是什么并不需要了解,只是数据存储方式不同。
(本来这里有444和420的画面对比图,但是专栏图片压缩太狠看不出来就没了,本来也几乎没有区别。)
最后是详细设置。首先是最下面的Assume interlace video(假设隔行视频),别勾。然后是Frame divide count(帧分割计数),勾选Automatic division(自动分割)就行。
Entropy coding的两个熵编码理论上Huffman更快,FSE压缩效率更高。Intra-frame prediction type(帧内预测类型)理论上Predict Left(左侧预测)更快,Predict Median(中值预测)压缩效率更高。
总之,理论最快是Huffman+Predict Left,效果最好是FSE+Predict Median。

但是,经过不严谨的实际测试之后(CPU是12700k,GPU是4070ti,硬盘是NVMe固态硬盘),我并没有测出这些设置会对导出时间和文件大小产生显著区别(T2也测试了,没放在下图里)。导出3840*1920分辨率、30帧率、总共150帧的动画时,所有编码器的导出时间差距没有超过1秒,因为是手动计时,所以基本上是误差。文件体积差距也体现在编码格式上,420的视频体积显著更小。所以可能低配置电脑或者其他某些画面内容受这些设置影响比较大?也有可能测试的视频时长有点短。

综上所述,去掉完全没用的BT.601,如果你是导出后直接投稿(或者只是通过FFmpeg进行简单的压制),选择YUV422或者YUV420是完全没有问题的,视觉上没有明显差距,体积小很多(而且网站都会再次压缩),如果要在剪辑软件进行后期就要选择RGB了。
至于视频后期为什么不选择YUV444,ReadMe中说明了所有YUV编码的内部格式都进行了数值范围限制,使其符合规范(大多数时候被称为TV范围),因为YUV本来就是源于电视,用于模拟信号的标准(YCbCr则是其在数字时代的版本)。比如每个通道的8bit数值范围是0-255,而RGB数值的 Limit Range则是16-235。在UtVedio中,只有使用RGB编码才能获得完全的范围。至于10bit色深的Pro(10bit的YUV也是 Limit Range)和有透明度的RGBA则是按需选择。
ReadMe里还有FourCC编码和最基础的格式名称(就是前面所说的YV12和NV12),实在太复杂,知道了也没用就不讲了,感兴趣可以自己去了解。
对于“pvideoout和compression连接失败”的问题,在写教程期间只遇到过一次,而且重新导出就正常了,所以没办法研究。目前明确会出现这个问题的原因有:电脑显卡的显存不足(可以在“任务管理器”里查看)、导出视频的分辨率不正确(前文有提到)。
不论显存够不够,都建议给MMD留充足的资源(CPU和GPU的占用,内存和显存等),这样才能以最快速度导出。下图的动态也有一直出现连接失败的解决方法(链接:网页链接)。

不过我认为按需下载,最好不安装自己不需要和不知道的东西(因为K-Lite安装的东西很多)。所以建议在尝试下载K-Lite之前,按照前面所说的原因排查,或者重新安装一遍UtVideo。不过我也不能确保有用,正如前面所说,我只遇到过一次,没办法研究。
导出时不要勾选导出WAVE,因为可能会导致视频导出失败,最好在导出后通过FFmpeg或者剪辑软件合并音视频。
至于无法播放导出后的视频,下个PotPlayer(https://potplayer.tv/?lang=zh_CN)之类的视频播放器就行了。
最后讲一个其他编码器:ffdshow(https://ffdshow-tryout.sourceforge.net/download.php)。它的64位版本下载和全部默认设置安装之后(安装位置可以改,方便卸载),在MMD会有一个ffdshow video encoder的选项,但是我没有找到能够更改编码设置的地方。通过它导出的视频是bt470bg(可以看作bt601)的YUV420,同时视频码率低不少。按照前文的测试标准,文件体积可以小到130MB,作为对比,UtVideo的YUV420是412MB,无压缩的avi是4.14G。虽然如此,但是并不推荐使用这个编码导出视频,还是因为bt601色域,画面颜色差了太多,UtVideo的各项参数已经比较平衡了。如果你的电脑配置实在过低可以考虑一下。或许ffdshow能够更改编码设置但是我不知道,如果有人知道可以分享一下。