视频压制03《VSedit的使用》

由 enjoypt 发布

写在最前面

本人只是个视频压制爱好者,自身水平非常拉稀,勉勉强强压过几个电影。本文只是为了让啥都不会的新手能上手完成一套适用于PT站点压制作品的流程而写,可以说这篇文章的水平极低,错误也会频频出现,喜欢较真的爬。本文不对压出成片的质量做任何的保证,压了垃圾质量的片子也麻烦后果自负。
再次强调,本文章只是让新手熟悉完整的压制流程,对于视频的压制质量没有任何的保障!!

对于VS脚本相关的代码,个人并不觉得写的十分的工整,因为这是本人第一次尝试自己从0开始写VS脚本,所以不合理的地方会非常多,完美主义者请立刻爬。


vsedit的简单使用

VS操作使用中也就需要知道几个简单的快捷键即可:

F5:preview即预览视频

请输入图片描述


F6:检查脚本

请输入图片描述

通过上图我们也能看到,VS的上半部分是代码窗口,下面的LOG则是运行脚本时候显示一些信息,比如报错信息之类的。


Preview界面的一些操作

请输入图片描述


VapourSynth代码的简单不负责讲解

下面先贴上我压制某部电影时的完整脚本附件,然后再分段讲解这些代码,参数的意思,并且也会附上官方的说明文档以供大家参考。这里要提一点,很多参数我也只是知道他是干啥的,但是原理什么的我确实也不是很清楚,也比较懒得去了解清楚。

https://int9cn.lanzoui.com/iNnHYqtf2gd


黑边切除相关代码

这段代码可以限制压制时对于内存的占用。

core.max_cache_size = 1536

选择source视频文件的路径,也就是之前从原盘中提取的视频轨道。

source_path = r'K:\0encode\test\00000.mpls_2eng.mkv'

载入source视频文件:

src = core.lsmas.LWLibavSource(source_path)

很多原盘视频画面,多多少少都会有一些瑕疵,例如四边的脏线,以及电影上下方的大黑边需要切除,下面便是黑边切除,脏线修复相关的代码。

首先需要切除原盘视频的黑边,切除的时候需要精确到每一行像素:

clip = depth(core.std.Crop(clip=src,top=20,bottom=20,left=0,right=0),16)

例如这一行代码中,top=20代表着视频的上边,切除20行像素,bottom同理。left=0为视频的左边切除0列像素。depth16转换位深为16位

【注意】crop参数只能进行偶数的切除!!

在切除黑边的时候我们要注意不能多切,假设一个电影的黑边看上去很宽,一般我们从100开始切上下的黑边,如果还有,每次以4行为一个步进逐步,多次的切除黑边。大部分电影的上下黑边都对称,且都是偶数的黑边,例如20像素,当我们切除掉偶数条黑边后,发现还有一行黑边怎么办呢?接下来我们就需要使用FillBorders填充那一条多余的黑边,然后再利用rize切除单数边。

Crop/CropAbs参数官方文档


FillBorders是填充像素的一个参数,官方描述这是一个简单的滤镜,可以填充剪辑的边界,而不会更改剪辑的尺寸。

一般来说,我们遇到单数黑边的情况下,切单数边之前先用FillBorders填充,避免色度重采样造成新的脏边。

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

Fillborders官方说明文档


一般我们使用resize参数来切除多余的单数黑边/不能完美修复的脏线:

clip = core.resize.Spline36(fixed, 1918, 1038,src_top=1,src_height=1038, src_width=1918,src_left=1)

通过这行我也看不懂的代码我们可以了解到,1918代表着我们切除了左右两边各1列的像素,因为左右两边各1列的像素我在后面的修复过程中发现不能比较完美的修复这两列脏线,而且这两列像素还是高度重复的像素,所以我选择切除这两列像素。

通过crop的代码我们可以得知,我们对上下黑边各切除了20像素,但是仍有一条多余的黑边,所以可以通过下放的算式得出我们最终需要的视频尺寸:

$$ 1080-20-20-1-1=1038 $$

Resize参数官方说明文档

至此,我们对于视频尺寸的调整算是正式的完成了,在上述代码中,我们移除了视频上下多余的黑边,以及左右不能完美修复的脏线。下面就要进入脏线修复相关的代码讲解了。


脏线修复

通过FixBrightness参数来调节列或行的亮度(不推荐新手使用):

fixed = awf.FixBrightnessProtect2(clip,row=[0,clip.height-1],adj_row=[5,5])
fixed = awf.FixBrightnessProtect2(fixed,row=clip.height-1,adj_row=50,prot_val=[0,36])
fixed = awf.FixBrightnessProtect2(fixed,column=[0,fixed.width-1],adj_column=[20,20])

row为横向的行数,row=[0,clip.height-1]则是第一行与最后一行的意思。adj是前面对应行的调整值,正数调高亮度,负数调低亮度。

但是这种调整亮度的方式理解起来较为复杂,可以算作一个高阶的用法,这里贴出官方的技术文档,为了照顾新手,我会选择另一种参数来告诉新手如何调节亮度。

FixBrightness官方技术文档


另一种调节亮度的方式(推荐新手使用):

src=haf.FixRowBrightnessProtect2(src,1,+34)

其中1代表着行数,+34为增加34亮度,亮度的调整范围在±100间。


bbmod修复脏线:

fixed = awf.bbmod(fixed, top=1, bottom=1, left=1, right=1, thresh=60, blur=999)

显而易见,top bottom left right代表着视频的四条边,thresh和blur新手并不用理会。有心思研究的话可以查看技术文档,或者自行调节这两个数值通过对比来感受差异。

AHD/awsmfunc官方技术文档


edgefixer修复脏线:

edgefixer对于图像的破坏较大,所以不建议作为修复脏线手段的首选。当然,有些特定情况下,edgefixer修复脏线效果好的出奇,这就需要各位在实践中自行感受总结了。

fixed = core.edgefixer.Continuity(fixed, bottom=1, left=1)

对于初学者来说,只需填写四边需要修复的边数即可。


至此,脏线的修复也算是告一段落了。值得一提的是,能完美的修复脏线固然是很好的事情,但是新手不必过于纠结脏线的修复,大部分人都感知不到。很多制作垃圾的原盘,脏线异常的恶心人,这种情况下,推荐直接bbmod+edgefixer,如果效果大差不差的,对于新手入门压制来说也是足够了。


样片抽取

由于debanding&deblock并不算是初学者入门学习的内容,所以这里就不赘述了,以后有空单独写一篇文章来介绍debanding&deblock。

电影视频的画面裁剪以及脏线修复工作完成之后,就是抽取样片,测试压制参数的环节了,一般的压制组都会给出组内通用的压制参数,所以样片的抽取测试环节,我们主要考虑CRF值的测试。通过对比几组不同CRF值的样片来选取一个码率和画质相对平衡的CRF值来进行全片的正式压制,一般一部120分钟左右的电影,我们可以考虑抽取5~8K帧的样片来进行码率的测试,CPU不好的朋友可以适当的调整抽取的帧数,但是码率可能控制的没有那么的准确了。


第一种抽取样片的方式:

sample = awf.SelectRangeEvery(db, every=4500, length=20)

这段代码的意思是,每4500帧抽取20帧,一部120分钟的电影,通过这个参数,大约会抽取4000帧,大家根据自己机器的配置自行调节即可。


第二种抽取样片的方式:

select = core.std.SelectEvery(src[8000:-8000], cycle=2000, offsets=range(70))

这段代码的意思是,除去片头片尾各8000帧,每2000帧随机抽取70帧。


视频对比

不论是抽取完样片还是压制完全片,我们都需要对比Source与Enocde之间的差异,由于本文章省去了滤镜使用的部分,所以直接对比Source与Enocde之间的差异。

clip = depth(awf.FrameInfo(clip, 'source'), 10)

这段代码是指定了source的“路径”,并且设置为10bit(x265)。如果需要压制x264视频,请改为8。

encode = core.lsmas.LWLibavSource(r'K:\0encode\test\crf20.3.hevc')

指定了encode视频素材的路径。

encode = awf.FrameInfo(encode, 'encode')

将encode素材打上encode标签。

整体理解这段代码就是指定了source和encode的路径,并且给他们在preview时打上标签信息。FrameInfo和LWLibavSource只需要知道是打标签和加载视频即可,想要深入理解的可以查阅文档。

awsmfunc技术文档

L-SMASH技术文档


对比Source与Enocde:

comparison = core.std.Interleave([clip, encode])

Interleave官方技术文档

至此,压制部分的教程到一段落。



暂无评论

发表评论