shinjico |
2012-03-11 15:15 |
[教程] 10bit压制入门:deband、dither和x264编码
前言 关于10bit的x264制作最近已经普及到了毛片领域 为了方便更多初心者完成这一过渡,特撰写此初初初级入门贴,老鸟们无视就好 本贴由各种README和FAQ搬运而来,并非纯原创,若有侵权还请包涵 感谢TaroA梦 大虾 皮神等众多菊苣给予的帮助和解说~ 总则 目前制作10bit的X264的思路有很多,最简单的一种方法是 先找个10bit hack版的x264(比如说taroA梦的tMod版),再写个和往常一样8bit的avs x264参数加上 --input-depth 8 AVS丢过去大功告成 当然了,这并不能完全体现10bit的好处 10bit最大优势在于,由于编码精度提高,可以很好地保留deband的成果 注意只是保留成果,并不是10bit本身具有deband功能 下面说说压10bit之前如何在avs内deband和dither ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ 第一步,AVS的准备 需要用到的工具 flash3kyuu_deband 这个滤镜由皮神从AU上的deband反编译(碉堡了)并修改而来,下载地址 http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=239 来看一个在10bit环境下进行deband处理的范例 loadplugin("flash3kyuu_deband.dll") AVISource("test.avi") f3kdb(Y=32,Cb=32,Cr=32,ditherY=64,ditherC=64,keep_tv_range=true,precision_mode=3,output_mode=2,output_depth=10) 这里只说f3kdb的主要参数,详细请参考README文件: Y Cb Cr 控制亮度和色度的deband强度 默认为64,对多数BDMV而言过于暴力,建议设在32或更低,视band情况Cb、Cr可以不做deband ditherY ditherC 控制亮度和色度上加噪的强度,实际上应该是noiseY和noiseC,默认64,如果源质量较好可适当降低 keep_tv_range 绝大多数的BDMV,其亮度色度均都在TVrange(亮度16-235,色度16-240)范围 高位深下作dither,可能部分像素会超出这一范围,建议设为true precision_mode 高低位色深转换的精度,0不推荐;1无抖动处理,噪点会不明显;2有序抖动,噪声分布会比较整齐,省码但不好看;3误差扩散抖动,好看,推荐; 4和5在估计新版flash3kyuu_deband参数中会被砍掉,不再介绍。注意,色深转换精度影响噪声的视觉效果,但这个参数并非加噪的精度 input_mode/output_mode 0是标准8bit视频;1是9-16bit高位深视频,层叠格式;2是9-16bit高位深视频,交织格式 对于高位深视频,x264编码器现阶段只认交织格式,一些AVS的EP滤镜只认层叠格式 绝大多数使用者是从8bit源编码10bit的x264,input_mode=0(默认),output_mode=2即可 input_depth/output_depth 没什么好说的,从8bit做10bit,input_depth=8(默认),output_depth=10 如果要用到avs内的16bit处理,可以设置output_depth=16,x264设--input-depth 16,x264会在编码时降低色深至10bit dynamic_dither_noise 动态噪声模式,默认关闭。关于动态噪声和静态噪声,我会在后文LumaDB部分说明 enable_fast_skip_plane 当Y/Cb/Cr为0时,对应的平面会直接被复制到输出,忽略ditherY/ditherC的值,换言之,可以偷懒不写ditherY=0,ditherC=0 但要注意,当输入与输出位深不同时,此功能无效。如果拿f3kdb作纯dither滤镜,记得要写ditherY=0,ditherC=0 此外,目前暂无能正确预览10bit YUV的工具,只能在8bit下看个大概 还是以上面的那个avs为例,在压之前可以先改回8bit预览看看 loadplugin("flash3kyuu_deband.dll") AVISource("test.avi") f3kdb(Y=32,Cb=32,Cr=32,ditherY=64,ditherC=64,keep_tv_range=true,precision_mode=3,output_mode=0,output_depth=8) 顺便提一下,f3kdb作为纯色深转换滤镜的用法 8bit输入,10或16bit输出: f3kdb(Y=0,Cb=0,Cr=0,ditherY=0,ditherC=0,keep_tv_range=true,precision_mode=3,output_mode=2,output_depth=10) 16bit层叠输入,标准8bit输出的写法 f3kdb(Y=0,Cb=0,Cr=0,ditherY=0,ditherC=0,keep_tv_range=true,precision_mode=3,input_mode=1,input_depth=16,output_mode=0,output_depth=8) 或者使用f3kdb内置更简洁的函数命令f3kdb_dither,注意这个函数只能由高到低转换 f3kdb_dither(stacked=ture,input_depth=16,keep_tv_range=true) ============================================ f3kdb大概是目前速度最快的deband和dither工具,但并非没有缺点 第一,和大多数daband工具一样,对线条有破坏作用 第二,地图炮加噪不够经济,开高了码会飞起 理想情况下,首先要对线条做mask,减少deband的破坏力 其次让加噪自适应化,对暗景应用较多的噪声,而对亮景应用较少的噪声 需要用到的工具 flash3kyuu_deband 这个前面说过了 LumaDB v0.5 TaroA梦酱整合的一个Y平面deband及加噪脚本 http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=256 LumaDBL v0.2 可运行在高位深下的LumaDB,俗称“撸马碉堡了” http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=399 先说第一个思路 在8bit下进行deband,然后转换成10bit loadplugin("flash3kyuu_deband.dll") loadplugin("AddGrainC.dll") loadplugin("RemoveGrainS.dll") loadplugin("TEdgeMask.dll") loadplugin("dither.dll") loadplugin("mt_masktools-26.dll") import("GrainFactory3mod.avsi") import("dither.avsi") import("LumaDB_v0.5.avsi") AVISource("test.avi") LumaDB(g1str=1.2,g2str=1.0,g3str=0,g1const=false,g2const=false,temp_avg=40) f3kdb(Y=0,Cb=0,Cr=0,ditherY=0,ditherC=0,keep_tv_range=true,precision_mode=3,output_mode=2,output_depth=10) GradFun3参数很少,主要说说GrainFactory3mod参数 (注:GrainFactory3mod.avsi的默认参数很重口,下文所说默认参数指LumaDB.avsi内预设的GrainFactory3mod参数) g1str、g2str、g3str分别控制暗区,中间区,亮区的噪声强度,建议不超过1.5,除非你喜欢重口 g1shrp、g2shrp、g3shrp分别控制暗区,中间区,亮区的噪点锐利度,默认即可 g1size、g2size、g3size分别控制暗区,中间区,亮区的噪点大小,默认即可 g1tex、g2tex、g3tex分别控制暗区,中间区,亮区的噪点的不平整效果,默认关闭 gth1、gth2、gth3、gth4定义暗区,中间区,亮区的范围,默认Y值24到56为暗区,128到160为亮区,没有特别需要不必调整 g1const、g2const、g3const分别控制暗区,中间区,亮区的噪点是否静止。默认全部静止,可适当对暗区和中间区打开动态噪声 temp_avg 控制所有噪声的动态平均值,默认40。要使temp_avg对某一部分噪声发生作用,需关闭对应的gconst 关于动态噪声和静态噪声 动态噪声更漂亮,不容易遮挡住细节,但更耗码 静态噪声省码,但在暗景画面平移的时候 看上去屏幕好像罩了一块脏兮兮的玻璃,非常违和 10bit的x264只要给足码率并设置得当 都可以比较好地保留动态噪声,推荐在暗区和中间区使用 至于亮区,加什么噪声都不明显,关了也可以 LumaDB提供了外置函数的接口 dither=和grain=两个参数分别控制deband和加噪滤镜 比如说用f3kdb来代替GradFun3进行deband 于是上面那组avs中,LumaDB部分可以改写为 LumaDB(dither="flash3kyuu_deband(Y=32,Cb=0,Cr=0,ditherY=0, ditherC=0)",g1str=1.2,g2str=1.0,g3str=0,g1const=false,g2const=false) 由于LumaDB最后只会混合Y平面,因此Cb、Cr设了也是白设 如果希望对色度也作deband,可以改写一下LumaDB最后mt_merge部分为 mt_merge(gf,input,msk,luma=true,U=3,V=3) 简单提一下f3kdb和GradFun3的优缺点 f3kb尽管可以得到很漂亮的效果,但是天生搜索范围较小 对于颜色跨度非常大的场景,deband能力很弱 比较常见的例如,一整屏由明到暗的天空 这种情况下还是使用GradFun3更加安全一些 缺点是对画面的副作用更大,结合mask来使用更佳 当然了,对于个别顽固场景,大家永远不要忘记trim zone这些基本的手段 勤能补拙是真理…… 另外,这类问题最好能结合实例来谈 限于篇幅这里不作展开,还请大大们补充 再说第二个思路 先把源转换成16bit,然后16bit下deband加噪,最后压成10bit 这个做法的好处是,第一,理论上16bit下deband更精确 第二,全部在16bit下进行,尽量减少从高位深向低位深转换的次数,减少损失 以我个人的情况,32位系统在全16bit环境下易崩内存,所以…… 来写一个参考范例: loadplugin("flash3kyuu_deband.dll") loadplugin("AddGrainC.dll") loadplugin("RemoveGrainS.dll") loadplugin("TEdgeMask.dll") loadplugin("dither.dll") loadplugin("mt_masktools-26.dll") import("dither.avsi") import("GrainFactoryLite.avsi") import("LumaDBLite_v0.2.avsi") SetMemoryMax(1024) AVISource("test.avi") LumaDBL(lsb=true,g1str=1.2,g2str=1.0,g3str=0,g1soft=60,g2soft=60,g3soft=100) f3kdb(Y=0,Cb=0,Cr=0,ditherY=0,ditherC=0,keep_tv_range=true,precision_mode=3,input_mode=1,output_depth=16,output_mode=2,output_depth=16) lsb_in 输入位深 true是16bit层叠格式 false是标准8bit,默认false lsb 输出位深,同上,最后输出的是层叠格式,记得用f3kb转成交织再送给x264编码器 GrainFactoryLite与GrainFactory3mod参数略有不同 主要是控制噪声动态的参数换成了g1soft、g2soft、g3soft 注意这个是temporal stability,表示静止程度,值越小动得越厉害,设为100完全静止 这和GrainFactory3mod的temp_avg是相反的,记得不要搞混(TaroA梦坑爹) 关于LumaDBL的外挂用法 一条原则是尽量使用16bit的deband和加grain滤镜 由于目前16bit下自适应加噪的似乎只有GrainFactoryLite 因此LumaDBL其实不太推荐使用外挂滤镜… 具体请参考TaroA梦的帖子,这里不再详细展开 下面要进入x264编码设置的部分
|
|