前言
关于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编码设置的部分
[ 此帖被shinjico在2012-03-11 15:41重新编辑 ]