蓝光视频压制的一般流程

蓝光视频压制的一般流程…

准备视频源

从蓝光原盘目录里获取完整的电影视频应该从BDMV/PLAYLIST.mpls文件入手而不是直接找BDMV/STREAM中的.m2ts文件。下面两张图摘自BD-ROM白皮书,可大致理解下蓝光目录中.mpls .clip .m2ts几个文件之间的关系。

pic1

能分析蓝光中.mpls文件的软件有很多,我推荐使用MKVToolNix混流中的方法。需要确定的是完整的一部电影到底是BDMV/STREAM文件夹中的那(几)个.m2ts以及它们之间的播放顺序。你可以选择像我上一篇教程中的推荐的先REMUX出一个mkv文件来处理,也可以选择直接处理.m2ts文件。在我的教程中我不会详细讨论直接处理.m2ts方法,只会给一些提示。另外在我的教程中会摒弃AviSynth,以VapourSynth的使用为主。

浏览电影

借助VapourSynth快速浏览电影画面,帮助我们获得对电影画面整体的感受。参考VapourSynth使用教程,假设你已经把需要用到的插件放在了自动加载路径,且做好了ffmsindex。我们主要使用VapourSynth Editor辅助我们处理影片。

1
2
3
4
5
6
import vapoursynth as vs
core = vs.get_core()
clip = core.ffms2.Source(r"C:\Users\Win7\Desktop\workshop\00800.mkv")
#clip = core.std.SelectEvery(clip, cycle=100, offsets=0)
clip = clip[::100]
clip.set_output()

这两种表达方式效果一样,表示每100帧取一帧。浏览影片的时候可以适当调整这个值,然后在VapourSynth Editor的调试窗口(F5)观看影片画面。

如果是选择直接处理.m2ts文件不建议直接使用ffms2.Source,而应该考虑d2vsource这个插件。其中涉及到一个frame accurate的问题。如果是多段.m2ts拼接,建议还是按先REMUX的办法处理。

设置滤镜

在蓝光电影的压制过程中,我们一般不需要用太多的滤镜。一般只需要裁黑边、修复画面边缘的小问题。如果是压制720p还需要resize。另外不常用的有debanding等。注意处理真人电影的时候一般不做降噪处理,反到是为了保持噪点和细节而想尽一切办法。

切黑边

切黑边的要求的是像素点得是偶数。VapourSynth Editor调试窗口提供了一个简单的切边功能,虽然没有staxrip的方便,但也勉强能用。

1
clip = core.std.CropRel(clip, left=0, top=138, right=0, bottom=138)

FillBorders

有很多电影在最边缘的一个像素点的一条线上会出现亮度偏高或者完全黑边的情况,这个时候就用FillBorders滤镜处理。注意只有一个像素的坏点才用这种办法处理。

1
clip = core.fb.FillBorders(clip, left=0, top=0, right=0, bottom=0, mode="fillmargins")

Resize

做720p才用到,算法采用Spline36。高度按比例计算,具体办法和要注意点待补充,可以用staxrip提供的解决方案。

1
clip = core.resize.Spline36(clip, width=1280, height=xxx)

其他

以上只列举了基本的几个滤镜,虽然在真人电影的压制中用的滤镜不多,但也还是有一些复杂用法的。例如debanding,一般用f3kdb这个插件。debanding也不是套用在整个视频当中,只有需要debanding的画面才做debanding。这样我们还需要将视频分段处理。需要分段处理视频的我准备以后另外再写一个补充教程。

测试参数

x264编码时需要设置很多参数,其中有一些是设置视频规格的考虑播放设备兼容性的设置,这些设置基本都是固定的,例如

1
--level 4.1 --vbv-bufsize 78125 --vbv-maxrate 62500

还有一些是设置编码采用算法复杂程度的,一般越复杂的算法能得到越高质量体积比的视频,每个小组或者网站都会有一个自己最低的要求,例如

1
--preset veryslow --merange 32

还有一些常规性的设置,针对一类视频要求不变的设置,例如

1
--deblock -3:-3

以上这几类参数一旦被采用一般是不会再变的。但是还有一类参数,是用来控制码率的,这些参数需要在针对具体视频时需要调整的,例如

1
--crf ? --aq-mode ? --aq-strength ? --qcomp ? --ipratio ? --pbratio ? --psy-rd ?:?"

在正式开始编码视频前我们需要抽取一些视频样本来进行参数测试,抽取样本的.vpy脚本例子

1
2
3
4
5
6
7
8
9
import vapoursynth as vs
core = vs.get_core()
clip = core.ffms2.Source(r"C:\Users\Win7\Desktop\workshop\00800.mkv")
clip = core.std.CropRel(clip, left=0, top=138, right=0, bottom=138)
#clip = core.fb.FillBorders(clip, left=0, top=0, right=0, bottom=0, mode="fillmargins")
#clip = core.resize.Spline36(clip, width=1280, height=?)
# 从2001帧开始,每隔20000帧,抽取1000帧作为测试片段
clip = core.std.SelectEvery(clip[2000::], cycle=20000, offsets=range(1000))
clip.set_output()

第一遍我们测试bframes这个参数,我们先给它一个较大的值,一般是16,其他参数固定的参数就按固定的参数值来,控制码率的参数按默认值或者你个人觉得合理的值来

1
--level 4.1 --vbv-bufsize 78125 --vbv-maxrate 62500 --crf 18 --preset veryslow --merange 32 --bframes 16 ...

跑一遍样本视频。用vspip给x264提供输入,命令行

1
vspipe --y4m <test.vpy> - | x264 --demuxer y4m <x264 options> - -o test.mkv

跑完后,看输出信息有一段

1
x264 [info]: consecutive B-frames: 7.3% 6.3% 6.7% 15.3% 6.9% 42.2% 3.0% 4.3% 8.0% 1.1% 0.1% ...

一共应该有17个百分数,找到最后一个大于x%(x取1或者5,看你自己的标准)的数,从0开始数它是第几个百分数,以后针对这部视频的处理都以这个位数为bframes值。

然后就是测试--crf ? --aq-mode ? --aq-strength ? --qcomp ? --ipratio ? --pbratio ? --psy-rd ?:?这一串值了。每次测试测一个,先测试crf。

crf是最关键的,先从16到19(这个数值是我的举例)每隔1取一个值,做一遍测试。做这种测试的时候最好写一个脚本来控制。都跑完了之后我们就要写一个对比视频效果的.vpy脚本来确定crf的合适值了,样板如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import vapoursynth as vs
core = vs.get_core()
clip = core.ffms2.Source(r"C:\Users\Win7\Desktop\workshop\00800.mkv")
clip = core.std.CropRel(clip, left=0, top=138, right=0, bottom=138)
clip = core.std.SelectEvery(clip[5000:], cycle=20000, offsets=range(1000))
# text显示帧信息和自定义标签
clip = clip.text.FrameProps(props=["_PictType"]).text.Text(text="SOURCE")
clip2 = core.ffms2.Source(r"C:\Users\Win7\Desktop\workshop\00800_crf16.mkv")
clip2 = clip2.text.FrameProps(props=["_PictType"]).text.Text(text="CRF16")
clip3 = core.ffms2.Source(r"C:\Users\Win7\Desktop\workshop\00800_crf17.mkv")
clip3 = clip2.text.FrameProps(props=["_PictType"]).text.Text(text="CRF17")
clip4 = core.ffms2.Source(r"C:\Users\Win7\Desktop\workshop\00800_crf18.mkv")
clip4 = clip2.text.FrameProps(props=["_PictType"]).text.Text(text="CRF18")
# 将视频交替显示
clip = core.std.Interleave(clips=[clip, clip2,clip3, clip4], mismatch=1)
clip.set_output()

我们在VapourSynth Editor你挑去一些帧来观察,确定合适的crf范围,再在这个范围里面设置更小的间隔来确定crf的具体值。

只有crf这个关键性的参数才有这样两级测试的待遇,其他参数一般只需要一级测试即可。甚至在你经验丰富之后直接给的一些参数的值,已简化参数测试的过程。

一旦所有的参数确定了之后我们就可以用这些参数完整的跑一边整部视频了。

音频的处理

音频处理最直接的方式就是直接拷贝。不过有的时候蓝光原盘的音轨实在太大,可以选择从中提取core作为重编码作品的音轨。

eac3to是用来处理音频的最常用工具。具体的用法以后另开教程补充。

混流

混流的过程简单,还是使用MKVToolNix这个工具,记得把字幕和章节信息原封不动的混进来。

至此,蓝光压制的过程算是完成了。