• 前言

    这几天阴差阳错地加入了某内站的rip组,也开始上手了一些视频编码和压制技术,但是这其中的坑确实不少,而且计算机图形本身也是一个复杂的领域,想要从技术上入门还是有一定难度的。
    本文对于一些计算机图像的芝士就不作介绍了,主要以操作和避坑为主。

环境

  • python 3.7
  • VapourSynth R48
  • 滤镜
  • x264,x265 encoder
  • VapourSynthEditor-r18(非必须,我还是习惯vscode写代码)
  • 安装过程

    • 装好python,VapourSynth
    • 进入VapourSynth安装位置,找到plugins文件夹,将滤镜放入其中;找到core文件夹,将它链接到环境变量中,同时也将x265,x264的encoder放入。

操作

  1. 编写vpy脚本,这里引用洞房大佬的h265 1080p参数,其中一些地方根据自己配置调整即可
    	import vapoursynth as vs
    	import sys
    	import mvsfunc as mvf
    	import havsfunc as haf
    	#import sgvsfunc as sgvs
    
    	core = vs.get_core(threads=16) #使用CPU现成数
    	core.max_cache_size=4000 #限制内存消耗
    
    	########lwl压制滤镜###########
    	source=r"这里是文件的绝对路径"
    	src = core.lsmas.LWLibavSource(source,repeat=True,threads=16)
    
    	#########dg加载滤镜############
    	# core.avs.LoadPlugin(r"E:\plugins64\DGDecodeNV.dll")
    	# src = core.avs.DGSource(r"E:\1\1.dgi")
    
    	#########帧率调节
    	######23.976######
    	#src = core.std.AssumeFPS(src, fpsnum=24000, fpsden=1001)
    	########24###########
    	#src = core.std.AssumeFPS(src, fpsnum=24000, fpsden=1000)
    	########60##################
    	#src = core.std.AssumeFPS(src, fpsnum=60000, fpsden=1001)
    
    	##指定压制帧数#####################
    	#src = core.std.Trim(src, first=105241, last=210481)
    
    
    	##压前半段#####################
    	# src = core.std.Trim(src, first=0, last=(src.num_frames // 2) - 1)
    
    	##压后半段#####################
    	#src = core.std.Trim(src, first=(src.num_frames // 2), last=src.num_frames - 1)
    
    	##切边#####################
    	src8 = core.std.Crop(src, 0, 0, 274, 274)
    	src16  = mvf.Depth(src8, 16)
    	src8y  = core.std.ShufflePlanes(src8, 0, vs.GRAY)
    	src16y = core.std.ShufflePlanes(src16, 0, vs.GRAY)
    
    	##KNL降噪##############
    	Y = core.resize.Bicubic(src16, src16.width / 2, src16.height / 2, src_left = -0.5)
    	down444 = core.std.ShufflePlanes([Y,src16], [0,1,2], vs.YUV)
    	nr16y = core.knlm.KNLMeansCL(src16, d=2, a=2, s=5, h=0.4, device_type="GPU")
    	nr16uv = core.knlm.KNLMeansCL(down444, d=1, a=2, s=5, h=0.2, channels="YUV", device_type="GPU")
    	nr16 = core.std.ShufflePlanes([nr16y,nr16uv], [0,1,2], vs.YUV)
    
    	##Debanding#######
    	dbed = core.f3kdb.Deband(nr16,8,48,48,48,0,0,output_depth=16)
    	dbed = core.f3kdb.Deband(dbed,16,32,32,32,0,0,output_depth=16)
    	dbed = mvf.LimitFilter(dbed,nr16,thr=0.5,elast=1.5)
    
    	res = dbed
    
    	Debug = 0
    
    	if Debug:
    		res = core.std.Interleave([src16,res])
    		res = mvf.ToRGB(res,full=False,depth=8)
    	else:
    		res = core.fmtc.bitdepth(res,bits=10)
    
    	res.set_output(0)
    
  2. 在cmd中执行压制命令,或者编写bat脚本
    • 这是1080p h265的命令,最后的输出格式为gop,需要整合为mkv,好处是可以断点续压。不想整合直接输出为mkv即可
      	vspipe.exe --y4m "1.vpy" - | x265-10bit-full.exe --y4m -D 10 --preset slow --crf 19 --cbqpoffs -3 --crqpoffs -3 --rc-lookahead 60 --merange 25 --subme 4 --bframes 8 --ref 5 --aq-mode 1 --aq-strength 0.8 --qcomp 0.7 --rd 4 --no-ssim-rd --psy-rd 2.0 --psy-rdoq 3 --max-merge 3 --deblock -1 --no-sao --no-cutree --no-temporal-layers --no-open-gop --no-amp --no-strong-intra-smoothing --no-rskip --tu-intra-depth 2 --tu-inter-depth 2 --limit-tu 0 --ctu 32 --repeat-headers --keyint 240 --rdpenalty 1 --pools 54,- --pmode --pme --frame-threads 6 --output out.gop --log-file 7.log  -
      
    • 避坑注意:

      这里的命令只能在cmd或者bat中执行,一定不能用powershall。否则将得不到任何输出结果,还会被吃掉一堆内存。具体原因如下:
      156132
  3. 之后就是漫长的压制过程,我这3700x能有10fps也算是不错了,CPU可以一直跑满。
    • 这里可能遇到CPU占用突然掉下去的问题,发现cmd卡住不动,是因为开启了快速编辑模式,在cmd-属性-快速编辑模式 关闭即可。

What is broken can be reforged.