shinjico
帖子: 5
注册时间: 2012-02-19 17:09

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
上次由 shinjico 在 2012-03-11 15:27,总共编辑 1 次。
shinjico
帖子: 5
注册时间: 2012-02-19 17:09

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

第一步,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:20,总共编辑 1 次。
shinjico
帖子: 5
注册时间: 2012-02-19 17:09

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

第二步,X264编码设置

需要用到的工具:

内置色深转换的hack版X264,我用的是TaroA梦版
http://www.nmm-hd.org/newbbs/viewtopic.php?f=8&t=219
什么?里面有N个版本?没什么特别需要用x264_32_tMod-10bit-420.exe就可以了
大体上来说,这个hack版的x264参数和官方版一样,具体差异取决于你的avs色深

如果你输入的是一个8bit avs,让x264.exe转换到10bit --profile high10 --input-depth 8
如果你输入的是一个16bit avs,让x264.exe转换到10bit --profile high10 --input-depth 16
如果你输入的是一个10bit avs,x264.exe不做色深转换,--profile high10 --input-depth 10

压过8bit的人都知道,不管在AVS预览时deband做得多么好,噪点排列得多么赏心悦目
一压出来全都成了渣渣,简直令人发指。10bit一定不会这样,但必要的设置少不了
这里只说一说对保留deband成果比较有用的几个参数,我先丢一个命令行的例子:

代码: 全选

avs4x264mod-laa.exe --x264-binary "C:\x264\x264_32_tMod-10bit-420.exe" --profile high10 --input-depth 10 --pass 1 --bitrate 5000 --stats "C:\x264.stats" --deblock -1:-1 --bframes 8 --ref 4 --qcomp 0.70 --aq-mode 2 --aq-strength 0.5 --merange 32 --me umh --direct auto --subme 10 --partitions all --trellis 2 --psy-rd 0.75:0 --fade-compensate 0.40 --fgo 4 --no-dct-decimate --no-fast-pskip --sar 1:1 --output NUL.H264 "C:\test.avs"
avs4x264mod-laa.exe --x264-binary "C:\x264\x264_32_tMod-10bit-420.exe" --profile high10 --input-depth 10 --pass 2 --bitrate 5000 --stats "C:\x264.stats" --deblock -1:-1 --bframes 8 --ref 4 --qcomp 0.70 --aq-mode 2 --aq-strength 0.5 --merange 32 --me umh --direct auto --subme 10 --partitions all --trellis 2 --psy-rd 0.75:0 --fade-compensate 0.40 --fgo 4 --no-dct-decimate --no-fast-pskip --sar 1:1 --output "C:\test.mp4" "C:\test.avs"
pause
参数说明:

--deblock

设为-1:-1,重口的可以-2:-2 再锐利实在没必要了

--qcomp

这个参数要和--mb-tree一起说,在打开mb-tree的情况下,x264对连续静态画面压缩得很厉害
通过提高qcomp,可以降低mb-tree对静态画面的压缩强度,从而防止一些静态暗区压烂
0.0表示恒定码率,1.0表示恒定量化值,默认0.6
个人建议不要超过0.8,否则mb-tree省码优势丧失,反而拖累整体质量

--psy-rd

和锐利度有关,动画保留噪声的话,建议设在0.60:0和1.0:0之间

--fgo

最简单粗暴的一个保留噪点的参数,建议3-5,设高了码率突破天际,官方版x264无此参数

--fade-compensate

提高明暗场切换时画面的质量,建议0.2到0.5之间,开高无益,官方版x264无此参数
另外此参数对画面中某一点光源闪灭造成的环状band无效

--aq-mode

AQ大概是x264设置中最让人拿不准的部分了,它的本质是一个码率再分配的过程
对于一桢画面,x264编码时会对细节较多的宏块分配较低的量化值,对细节较少的宏块分配较高的量化值
AQ的作用就是降低那些细节较少宏块的量化值,从而避免这些区域被压烂,比如说,一块阴暗而平整的墙面
要说明的是,在2-pass模式下,由于总体码率固定,AQ是个拆东墙补西墙的过程,开过高反而影响整体质量
在1-pass crf的模式下,AQ会使得整体QP值降低,开太高体积会失控
AQ目前主要有两种模式 VAQ和Auto VAQ,官方版自带的aq1是VAQ,aq2是Auto VAQ
至于那些patch版的aq3、aq4都是aq2的改进版,这里只简单说说VAQ和Auto VAQ的区别

VAQ
对所有桢都采取同样判断标准,当某个宏块内的细节分布量(energy)低于一定值
AQ机制就会对这个宏块降低Q值,降低多少,直接根据aq-strength值而定

Auto VAQ
当某一宏块被判断为energy过低,需要对Q值进行修正时
首先根据一桢内各个宏块的energy,计算出这个桢的加权值
用每个宏块的energy与这个桢的加权值进行计算来修正aq-strength

可以看出,这其实是个数学问题,在Auto VAQ下
一个本身细节就不多的桢,得到的AQ修正强度也就低,换言之可能压烂
简单说结论,VAQ耗码但相对安全,Auto VAQ省码但安全系数略低
在限制一定码率的情况下,Auto VAQ尽管可能压烂某几个桢
但由于没有VAQ那样浪费,反而能提高整体编码质量,所以依然值得尝试
友情提醒,VAQ建议不超过1.5,Auto VAQ建议不超过1.2
上次由 shinjico 在 2012-03-11 15:42,总共编辑 1 次。
shinjico
帖子: 5
注册时间: 2012-02-19 17:09

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

第三步,关于10bit下一些小RP问题


关于avs4x264mod的作用

10bit压制中有个很实际的问题需要解决,它就是崩内存(アセアセ)
32位XP,10bit的avs直接丢x264,压几十上百桢异常退出,不用想,多半内存溢出
1920*1080的交织YUV,送进x264的画面实际上是3840*1080,再来几个EP滤镜,想不崩都不行
这里需要用到管道输出,工具有ffmpeg、avs2yuv、avs2x264
我只介绍最简单的avs4x264的修改版avs4x264mod
好处是不用定义分辨率、frame、fps,懒人专用
(TaroA梦你骗我,你说我过有软妹的,还说用时光机给我看过了的)
http://www.nmm-hd.org/newbbs/viewtopic.php?t=403

写法前面的命令行里写过了,只要在X264.exe的路径前加上avs4x264mod.exe --x264-binary
这实际就是一个管道功能,avs4x264mod读入avs,然后把420格式数据输出给x264
第一个作用,原本x264一个线程跑的任务分成了两个线程,32位系统的话,理论上两个线程最大能利用到4G内存
第二个作用,装了64位win7的系统,可以用avs4x264mod读取32位AviSynth的脚本,输出给64位的x264.exe

关于32位系统AVS内存溢出的一个解决途径
可以参考皮神的这贴,这个我也不熟,试过之后再说
http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=498

-------------------------------

最后说一说,已经压好的10bit MKV MP4等资源如何载入AVS

第一种情况,假设已经压好了一个test-10bit.mkv
现在要把它和test-10bit.ass载入VDM预览并作逐桢的特效匹配
使用皮神hack版的ffms2.dll来载入10bit视频

代码: 全选

loadplugin("ffms2.dll")
loadplugin("Vsfilter.dll")
ffvideosource("C:\test-10bit.mkv", colorspace="YV12")
Textsub("C:\test-10bit.ass")
第二种情况,要将这个mkv还原成16bit的YUV来加噪声(好EP…)

代码: 全选

loadplugin("ffms2.dll")
import("GrainFactoryLite.avsi")
ffvideosource("C:\test-10bit.mkv", colorspace="YV12_10-bit_hack")
GrainFL(lsb=true, lsb_in=true)
-------------------------------

最后要说的是,10bit的压制技术还处在起步不久、逐渐完善的阶段
这里提到的很多方法,很多参数,也只是这阶段的一个注脚而已(多数是个人hack版…)
希望这帖能起到抛砖引玉作用,有更多的苣菊能写一些更专业、更实用的内容
鉴于本人接触10bit并不久,还在学习中,有不对的地方还请指正,谢谢!

附录:

文中提到各种工具打包下载连接
http://115.com/file/c2uo9hm6#
http://kuai.xunlei.com/d/FTUUXEEODVFQ

这些工具更新都比较快
建议还是到论坛去找最新版
http://www.nmm-hd.org/newbbs/
头像
dgwxx
管理猿
帖子: 771
注册时间: 2010-09-19 20:42
联系: 网站

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

置顶了,擅自帮shin娘排了加了bbcode。
日常推 @dgwxx: 基本没什么技术的话题,欢迎没事看看消遣。
► 显示剧情透露 平庸的rip
► 显示剧情透露 “不知道”的五大理由
ChoRyuJin
帖子: 1
注册时间: 2012-03-11 22:05

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

頂一頂樓主。樓主壓的gundam很出色。我想學學10bit
jet.boy
帖子: 2
注册时间: 2010-09-28 17:34

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

不是说,现在直接压就可以了嘛?

回到 “视频编码器 / Video encoder discussion”