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

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

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

关于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重新编辑 ]
级别: 超级版主
注册时间:
2004-07-25
在线时间:
121小时
发帖:
3898
只看该作者 1楼 发表于: 2012-03-11
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆

第二步,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

☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆

第三步,关于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/



[ 此帖被shinjico在2012-03-11 15:42重新编辑 ]
级别: 超级版主
注册时间:
2004-07-25
在线时间:
121小时
发帖:
3898
只看该作者 2楼 发表于: 2012-03-11
留一楼罢……各种工具方法进化非常快……
级别: 工作组
注册时间:
2005-10-19
在线时间:
31小时
发帖:
3613
只看该作者 3楼 发表于: 2012-03-11
谢谢大大发片

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

Knowledge is infinite.


级别: 新手上路
注册时间:
2009-11-20
在线时间:
7小时
发帖:
61
只看该作者 4楼 发表于: 2012-03-12
shin菊苣v5!!!!
级别: 侠客
注册时间:
2008-08-05
在线时间:
46小时
发帖:
92
只看该作者 5楼 发表于: 2012-03-14
当然了,对于个别顽固场景,大家永远不要忘记trim zone这些基本的手段
http://www.nmm-hd.org/newbbs/viewtopic.php?f=8&t=612
不知道对我这种情况加大部分帧码率是不是有效。。
级别: 光明使者
注册时间:
2007-11-17
在线时间:
1304小时
发帖:
455
只看该作者 6楼 发表于: 2012-03-15
膜拜
级别: 小荷初露
注册时间:
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-24
在线时间:
69小时
发帖:
1288
只看该作者 8楼 发表于: 2012-03-16
心悸你这辈子都是好人啊!

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

Uruz-7
相良宗介中士
B-3128
级别: 新手上路
注册时间:
2010-10-09
在线时间:
1小时
发帖:
3
只看该作者 9楼 发表于: 2013-12-10
谢谢,最近正在找10bitavs或16avs的编写方式
级别: 新手上路
注册时间:
2004-12-07
在线时间:
0小时
发帖:
3
只看该作者 10楼 发表于: 2014-05-09
好贴啊,膜拜,高大上
级别: 禁止发言
注册时间:
2016-07-07
在线时间:
0小时
发帖:
10
只看该作者 11楼 发表于: 2016-10-02
用户被禁言,该主题自动屏蔽!
级别: 新手上路
注册时间:
2007-08-07
在线时间:
2小时
发帖:
5
只看该作者 12楼 发表于: 2017-07-01
mark 一下
级别: 新手上路
注册时间:
2013-03-27
在线时间:
0小时
发帖:
12
只看该作者 13楼 发表于: 2018-10-19
我先存下来再看。
级别: 禁止发言
注册时间:
2019-07-18
在线时间:
0小时
发帖:
7
只看该作者 14楼 发表于: 2019-07-18
用户被禁言,该主题自动屏蔽!
快速回复

限150 字节
上一个 下一个