猜你喜欢: direct264, 10bit, 10bit压制教程
目录
1. 编译环境(普通用户可略过)
2. Patches(直接看patch说明即可)
3. 编译信息(普通用户可略过)
4. 下载
5. 10bit-depth的优劣
6. 简单命令行压制指导一直没有看到direct264的带patch的编译版,于是决定自己动手,丰衣足食。
1. 编译环境:
win7 x64 sp1
msys 1.0.17.1
mingw-gcc 4.6.3
yasm 1.2.0
libav-v0.8-1060-g90e5*
2. Patches:
01. Ofast & LTO config
02. Film Grain Optimization (Update) (增加AVX、XOP指令集支持)
03. Fade Compensation
04. Remove stats before renaming
05. Auto VBV Settings
06. Force level
07. Filter: hqdn3d/pad/vflip/yadif
08. Logger
09. Encode Time
10. Cosmetic
11. AviSynth 16bit hack
12. Skip bit-depth filter
13. Add back "touhou" tune info (New)
14. AQ Mode 3 & 4 (Update)
15. Fix AviSynth color space converting matrix (New)
16. Fprofiled Extension (Update)
简要说一下这些patch的作用,一些未提到的请参考--fullhelp (随x264附有x264.txt)
Film Grain Optimization: - 使用 --fgo <int> 默认0 范围0-50 需要subme>=7 如果是2pass编码,且pass 1时没有使用--slow-firstpass, 则此参数在pass 1时强制归0(不影响pass 2)
- 作用 顾名思义,主要针对film和grain类型视频的特别优化。更合适的名称叫PSY Film Grain Optimization, 与x264现有的--psy-rd采用的算法不同。建议设在15以内,如果是二次元动画想用的话,建议在5以内,再高就明显浪费码率,不如降低crf更佳。
Fade Compensation: - 使用 --fade-compensate <float> 默认0.00 建议值0.00~1.00 注意如果使用了--no-psy或者--no-mbtree, 则此参数无效;如果使用--weightp 0,则这个参数会自动+0.1
- 作用 为淡入淡出场景补偿/分配更多的码率。对没有什么fade的场景一般不需要开,现在默认的--weightp 2在这方面就能处理得比较好。
Remove stats before renaming: - 使用 被动使用。
- 作用 2pass下对--stat相关有性能提升。
Auto VBV Settings: - 使用 --vbv-maxrate <auto_high|auto_main>
--vbv-bufsize <auto_high|auto_main>
- 作用 根据--profile和--level的参数自动设定该H.264规格等级下对应的VBV数值。
Force level: - 使用 --level-force
- 作用 强制level, 确保视频符合H.264 level规范。
Filter: hqdn3d/pad/vflip/yadif hqdn3d
- 使用 --vf hqdn3d:ls,cs,lt,ct 更具体参考--fullhelp
- 作用 降噪滤镜,源于Mplayer,质量效果明显优于x264自带的--nr
pad
- 使用 --vf pad:[left][,top][,right][,bottom][,width][,height][,red][,green][,blue]
- 作用 加边。如跟640x360的视频上下各加60像素黑边补成640x480,则用--vf pad:0,60,0,60
vflip
- 使用 --vf vflip
- 作用 垂直翻转视频。
yadif
- 使用 --vf yadif:[mode][,order] 更具体参考--fullhelp
- 作用 反交错滤镜,源于Mplayer, 按需要使用。注意当同时resize时,必须先反交错。
如果想同时使用多个滤镜,比如1280x720的片源,想resize成640x360再加黑边到640x480,参数为--vf resize:640,360/pad:0,60,0,60 其余依此类推。
Logger: - 使用 --log-file <string> --log-file-level <int/string> 其中CLI窗口部分为自动显示(需要配合direct264自己的--versioninfo)
- 作用 显示x264写入H.264 SEI的编码信息(mediainfo看到的Encoding Settings);额外以文件形式保存x264在编码时的信息。
Encode Time: - 使用 被动使用。
- 作用 显示开始编码时间、结束编码时间,以及编码耗费时间。
Cosmetic: - 使用 被动使用。
- 作用 美化用。crf有效值增多,以及参数传递方面的优化。
AviSynth 16bit hack: - 使用 被动使用。
- 作用 让x264支持16bit AVS输入,而不需要通过avs2yuv等pipe方式。
Skip bit-depth filter: - 使用 被动使用。
- 作用 跳过位深滤镜以防止因dither产生的错误。
AQ Mode 3 & 4: - 使用 --aq-mode 3, --aq-mode 4
- 作用 基于aq mode 2修改而来,实际效果只能编码后用自己眼睛去看……
Ofast & LTO config + Fprofiled Extension: - 使用 编译相关。
- 作用 让编译后的x264编码速度更快、体积更小。
3. Build Info:
Platform: X86
System: WINDOWS
cli: yes
libx264: internal
shared: no
static: yes
asm: yes
interlaced: yes
avs: yes
lavf: no
ffms: no
gpac: internal
gpl: yes
thread: win32
filters: resize crop select_every hqdn3d pad vflip yadif
debug: no
gprof: no
strip: yes
PIC: no
visualize: no
bit depth: 8 / 10
chroma format: all / 420
------- 4. 下载 -------地址一:115网盘文件夹
地址二:DBank网盘文件夹 (长期未更新,备份用)
地址三:Google Code 下载页面注意:如果是第一次使用direct264, 建议直接下载完整版:http://115.com/file/anm02rya版本说明(仅以最新版为例):下载后里面有4个x264*.exe
x264-8bit-all.exe --> 8bit标准版本
x264-8bit-420.exe --> 8bit标准版本,只支持YUV 4:2:0输出(不影响输入)
x264-10bit-all.exe --> 10位深版
x264-10bit-420.exe --> 10位深版,只支持YUV 4:2:0输出(不影响输入)
【如果您不知道用哪个exe,那么就用x264-8bit-420.exe这个即可】注1:可能是因为gcc优化的关系,编译的core2版在编码速度上反而还不如generic版,故不提供core2版
注2:只支持4:2:0输出(不影响输入),主要为了更快的编码速度,并且绝大部分情况也只需要4:2:0输出。
注3:不再编译Intel/AMD部分系列专用CPU版本的原因:此次更新涉及巨量汇编优化,gcc优化的优势进一步缩小;此外,对应CPU的编译版我没法做fprofile(这需要使用对应的CPU编译),而gcc fprofile本身就有加速编码速度的作用(同时大幅缩小x264.exe体积)
以上均为32bit 8bit-depth版,64bit的暂无法编译,因为direct264的部分代码未实现x86_64 asm
---------
5. 这里简单说下10bit-depth相比8bit-depth的优劣
10bit压制主要是通过提升编码的预测精度,从而在大多数有损压缩时可以采用更高的量化值,同时还能保证相当好的质量,于是可以在比8bit压制更低的码率下还原出更好的画面。
LimitRange前提,8bit量化下的Luma(亮度)和Chroma(色度)取值范围:Y:16-235,Cb/Cr:16-240。10bit量化下的Luma和Chroma取值范围:Y:64-940,Cb/Cr:64-960。所以10bit在更高的精度冗余下可以在有损编码时往往有更高的效率。
具体对于画质有利的方面主要在于:
1.防止banding(色彩平滑过渡区域的色带)产生
2.提升暗场效果
3.更好地容纳噪点
而这几项正好都是现在8bit压制中很难处理的地方。特别是对于动画,banding是个及其麻烦的东西。暗场是十分容易码率分配不足,并且产生画面劣化的部分(也就是所谓的“暗场烂掉了”;我记得凝芳文以前也抱怨过这些)。而噪点则是十分消耗码率。10bit下这些困难的东西都变得容易处理了(基本就不用特意再去额外处理啥的了)。
x264.nl于2010年10月提供了一个PDF(现在仍有),里面提到10bit能比8bit节省25%的码率(等质量)。如果只是比较banding/暗场这些的话,10bit即便只有8bit一半码率也往往可能表现更佳。另外,即使片源是8bit, 显示器本身也不支持10bit, 依然能享受到其75%的好处
不过10bit由于需要更多的采样,无损编码和极低码率编码均不如8bit(但正常来讲,没人会去用这么极端的压片方式吧)
跟8bit相比,10bit的解码需求也更高,但10bit 4:2:0比8bit 4:2:2还轻松,再加上现在解码器效率也不低,倒也不用担心太多
到目前为止还没有支持10bit硬解的手段,故播放Hi10p 1080p需要比较强劲的CPU(24p的话,Core 2双核3GHz肯定能吃得消)
Flash player还不能正确渲染10bit视频,所以10bit在线视频并不推荐(况且flash那本身的解码效率……另一方面,HTML5本身似乎也没啥消息)
所有移动播放设备全灭(Android平台某播放器可解码,但满是banding,无意义)
相同片源+压制参数比较,10bit编码比8bit慢18%~32%(测试得出的数据;不过通过合适改变参数,还是会发现10bit的编码速度+压缩率更优)<--另外注意这个数据是2011年8~9月份的了,这期间x264同时也有各种10bit汇编优化,现在的速度差距有所缩小
总体而言,10bit相比8bit还是利大于弊的,并且是能用眼睛看出来的,这也是为什么现在有人在不遗余力地推广10bit.
更多10bit vs 8bit,参考http://www.nmm-hd.org/newbbs/viewtopic.php?f=17&t=551
6. 简单压制指导(命令行方式)也许很多童鞋从没接触过命令行方式压制,所以这里我有必要给予相关指导;但如果详细说明一方面可能偏题且信息量太大,另一方面未必大部分人是有兴趣的,所以仅直接从压制开始说明,并且尽可能简单且不出问题;如果有兴趣较为深入地学习,可以自行使用各个搜索引擎自学:)
1) 首先,请确保系统要能正确解码待压制的视频
最有效的检测方法:
下载GraphStudioNext:
http://code.google.com/p/graph-studio-next/downloads/detail?name=graphstudionext_0_4_9_0.zip&can=2&q=打开GraphStudioNext,把视频直接拖到这个里面,点那个播放按钮,没问题的话那么就可以直接压了;有问题的话,首先卸载相关解码器,建议就安装个解码包,比如K-lite之类的,一般也就不会有什么问题
另外,对于同一类视频(比如都是8bit H.264+AAC的mkv视频,一次没有问题的话,在不改变解码环境的情况下,以后也不会有问题的)
2) 获取音频编码器及相关文件,从简便性考虑给大家推荐用NeroAAC,官方下载:
http://www.nero.com/eng/downloads-nerodigital-nero-aac-codec.php只需要那个neroaacenc.exe即可(所以从其他地方能获取也可,不过如果出问题了那么还是从官方地址下载)
另外因为音频编码器默认是只支持wav输入的,所以视频作为输入的话,一般是需要用到管道std输入
需要先下载ffmpeg/libav
http://ffmpeg.zeranoe.com/builds/请找日期最新的"32-bit Builds (Static)"下载,只需要里面的ffmpeg.exe即可;为了不与direct264里的ffmpeg重名,建议其中一个另改名称(我的做法是direct264里的ffmpeg.exe改为ffmpegr.exe;官方的版本保持不变)
3) 新建一个记事本(
必须与以上所有文件在同一目录,当然如果本身熟悉命令行有其他做法,不过应该也没必要看这个简单教程了吧;
两个ffmpeg的命名如步骤"2)"所示;要使用哪个x264就改哪个的名字,改exe本身或者这个命令里改均可,
只要对应即可)
CODE:
@ECHO OFF & CD/D "%~dp0"
:Enc1
IF "%~1"=="" GOTO :EOF
x264 --crf 24 --preset 8 -r 5 -b 4 --deldup 12:0.8:160 -I 300 -i 2 --scenecut 50 -f 1:1 --psy-rd 0.3:0 --aq-mode 2 --aq-strength 0.8 -o "%~dpn1_v.mp4" "%~1"
ffmpeg -i "%~1" -f wav - | neroaacenc -q 0.28 -if - -ignorelength -of "%~dpn1_a.m4a"
ffmpegr -i "%~dpn1_v.mp4" -vcodec copy -i "%~dpn1_a.m4a" -acodec copy -y "%~dpn1_enc.mp4" -map 0:v -map 1:a
SHIFT /1
GOTO :Enc1
复制以上内容,保存,文件后缀由txt改为bat
4) 把你要压的视频拖入这个bat即可,文件名带"_enc"即是你要的编码后的文件,其余如果不要了可以自行删除(不在bat里弄是怕出错又误删文件)。本方法
支持批量拖拽[ 此贴被upyzl在2012-04-20 12:19重新编辑 ]