搜索 社区服务 统计排行 帮助
  • 26958阅读
  • 15回复

[教程] 10bit压制入门:deband、dither和x264编码

楼层直达
级别: 版主
注册时间:
2004-07-25
在线时间:
107小时
发帖:
3879
前言

关于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重新编辑 ]
级别: 新手上路
注册时间:
2020-02-12
在线时间:
0小时
发帖:
2
只看该作者 15楼 发表于: 02-15
好教程!收藏了!
级别: 禁止发言
注册时间:
2019-07-18
在线时间:
0小时
发帖:
7
只看该作者 14楼 发表于: 2019-07-18
用户被禁言,该主题自动屏蔽!
级别: 新手上路
注册时间:
2013-03-27
在线时间:
0小时
发帖:
10
只看该作者 13楼 发表于: 2018-10-19
我先存下来再看。
级别: 新手上路
注册时间:
2007-08-07
在线时间:
2小时
发帖:
5
只看该作者 12楼 发表于: 2017-07-01
mark 一下
级别: 禁止发言
注册时间:
2016-07-07
在线时间:
0小时
发帖:
11
只看该作者 11楼 发表于: 2016-10-02
用户被禁言,该主题自动屏蔽!
级别: 新手上路
注册时间:
2004-12-07
在线时间:
0小时
发帖:
3
只看该作者 10楼 发表于: 2014-05-09
好贴啊,膜拜,高大上
级别: 新手上路
注册时间:
2010-10-09
在线时间:
1小时
发帖:
3
只看该作者 9楼 发表于: 2013-12-10
谢谢,最近正在找10bitavs或16avs的编写方式
级别: 工作组
注册时间:
2007-11-24
在线时间:
69小时
发帖:
1288
只看该作者 8楼 发表于: 2012-03-16
心悸你这辈子都是好人啊!

ひとつめは眩しさ
ふたつめは温かさ
それ以上はもうわがままになる
ありがとう優しさの中にある輝きを
これだけあるならもう十分だよ

Uruz-7
相良宗介中士
B-3128
级别: 小荷初露
注册时间:
2011-08-01
在线时间:
13小时
发帖:
50
只看该作者 7楼 发表于: 2012-03-15
引用
引用第5楼jiayiming于2012-03-14 11:01发表的  :
当然了,对于个别顽固场景,大家永远不要忘记trim zone这些基本的手段
http://www.nmm-hd.org/newbbs/viewtopic.php?f=8&t=612
不知道对我这种情况加大部分帧码率是不是有效。。

效果肯定是有的,问题的关键在于你没有这样的精力也没有这样的能力把所有像这样的场景都找出来单独加码率。
级别: 光明使者
注册时间:
2007-11-17
在线时间:
1304小时
发帖:
455
只看该作者 6楼 发表于: 2012-03-15
膜拜
级别: 侠客
注册时间:
2008-08-05
在线时间:
46小时
发帖:
90
只看该作者 5楼 发表于: 2012-03-14
当然了,对于个别顽固场景,大家永远不要忘记trim zone这些基本的手段
http://www.nmm-hd.org/newbbs/viewtopic.php?f=8&t=612
不知道对我这种情况加大部分帧码率是不是有效。。
级别: 新手上路
注册时间:
2009-11-20
在线时间:
7小时
发帖:
61
只看该作者 4楼 发表于: 2012-03-12
shin菊苣v5!!!!
级别: 工作组
注册时间:
2005-10-19
在线时间:
31小时
发帖:
3613
只看该作者 3楼 发表于: 2012-03-11
谢谢大大发片

凡是未完全安装Office字体的,以下英语短语请无视~~

Knowledge is infinite.


级别: 版主
注册时间:
2004-07-25
在线时间:
107小时
发帖:
3879
只看该作者 2楼 发表于: 2012-03-11
留一楼罢……各种工具方法进化非常快……
快速回复

限150 字节
上一个 下一个