『漫游』酷论坛>『影音数码技术学习交流』>[分享] Direct264 自编译 ..

[分享] Direct264 自编译版(2012.03.18更新 x264 core120 r2171)

upyzl@2011-04-30 12:40

一直没有看到direct264的带patch的编译版,去年12月5日还是linuxyouxia好心帮我编译了一个带fadecomp和fgo的mod,不过总不能麻烦别人,于是决定自己动手,丰衣足食好了。

项目:http://code.google.com/p/direct264umod/

编译环境:
Win7 x64 SP1
MSYS 1.0.17.1
mingw-gcc 4.6.3
yasm 1.2.0
libav-v0.8-1060-g90e5b58 [win32threads, 20120316]

Patches:(这部分还是要感谢06_taro提供的diff,至少省去了一个一个找diff的时间;不过因为direct264与官方x264差别较大,大部分都需要手动改)
01. Ofast & LTO config + ModTag (Update)
02. Film Grain Optimization (Update) (help里添加需要subme>=7和0-50范围的提示,增加AVX支持)
03. Fade Compensation (额外使用x264_clip3f将参数范围限制在0.0-1.0, 不然即使用100也是有效的,help里也添加了说明)
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 (4位小数被我改成2位)
11. AviSynth 16bit hack
12. Skip bit-depth filter
13. Correct LimitRange 8 -> 10 bit-depth conversion (rawinput部分似乎还需要改动...)
13. Add back "touhou" tune info (New)
14. AQ Mode 3 & 4 (New)
15. Fix AviSynth color space converting matrix (New)
16. Fprofiled Extension (Update)
说明:
1)没打L-Smash的,觉得用direct264的话,音频要么用dshow2wav配合ffdshow audio及音频编码器编码,要么直接用roozhou的ffmpeg复制音轨封装,貌似也没有什么不方便之处(此外direct264是内置GPAC的,不知道如果弄L-Smash会出现什么问题。。。)目前正在考虑如何用L-Smash替换GPAC
2)MixAQ/OreAQ代码部分完全不懂,为了保证x264的稳定性故决定不打这些补丁了
3)之前看到amfilica希望打上me-prepass的补丁(其实我看到umh+prepass>esa也很想打),不过自r9xx后需要对patch做大量代码更改(目前是因为h->mc.get_ref会少参数);另外比较代码,应该很早mv_x/y_min/max_qpel就取代了me-prepass里面的mv_x/y_min/max4,所以me-prepass应该是没有用了

Build Info:(取消了lavf和ffms, ffms显然在direct264里没用;lavf的优势应该是处理图片序列吧,所以取消了,这样x264能小不少)
引用
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


direct264 changlog: http://direct264.svn.sourceforge.net/viewvc/direct264/?view=log

----------        下载:      ----------
115网盘文件夹地址
DBank网盘文件夹地址
(只更新完整版)

注意: 如果是第一次用direct264,建议直接下载完整版:http://115.com/file/anm02rya

最上方的Google Code上亦有编译好版本的下载以及所有源码。


版本说明(仅以最新版为例):下载后里面有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输出(不影响输入)

注1:可能是因为gcc优化的关系,编译的core2版在编码速度上反而还不如generic版,故不提供core2版
注2:只支持4:2:0输出(不影响输入),主要为了更快的编码速度,并且绝大部分情况也只需要4:2:0输出。
注3:不再编译Intel/AMD部分系列专用CPU版本的原因:此次更新涉及巨量汇编优化,gcc优化的优势进一步缩小;此外,对应CPU的编译版我没法做fprofile(这需要使用对应的CPU编译),而gcc fprofile本身就有加速编码速度的作用(同时大幅缩小x264.exe体积)


因为涉及direct264专有部分的汇编相关代码的关系,direct264目前暂不支持x64的编译。  










[ 此帖被upyzl在2012-03-18 14:07重新编辑 ]
引用

upyzl@2011-04-30 12:51

本楼简要说明下patch(一定程度上方便新人), 另随7z包里有帮助文件。
这些是按我理解的说明,未必完全正确,故最好事先实测看看,有疑问可先行搜索查询;欢迎各位指正。


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采用的算法不同。具有抑制Banding产生的作用。一般不需要设很高的值,对动画来说5以内即可。不熟的话最好用2pass斟酌比较看看。 (本人在help里添加了额外的信息;增加AVX支持-->by 06_taro )

Fade Compensation:
- 使用 --fade-compensate <float>  默认0.00  范围0.00~1.00  注意如果使用了--no-psy或者--no-mbtree, 则此参数无效;如果使用--weightp 0,则这个参数会自动+0.1
- 作用 为淡入淡出场景补偿/分配更多的码率。对没有什么fade的场景一般不需要开,现在默认的--weightp 2在这方面就能处理得比较好。按需求使用。 (增加强制限制0.0-1.0  完善help)

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
    - 作用 降噪滤镜,源于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]
    - 作用 反交错滤镜,源于Mplayer. 注意当同时resize时,必须先反交错。

如果想同时使用多个滤镜,比如1280x720的片源,想resize成640x360再加黑边到640x480,参数为--vf resize:640,360/pad:0,60,0,60 其余依此类推。
虽说很多滤镜ffdshow就可以实现,但有时候如果想用CoreAVC解码获取更快的整体编码速度的话(本人测试能有至少5%的编码速度提升,相比ICL12编译的ffdshow),这些滤镜还是挺有用的。

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支持(含dither伪)16bit AVS输入,而不需要通过avs2yuv等pipe方式。

Skip bit-depth filter:
  - 使用 被动使用。
  - 作用 跳过位深滤镜以防止因dither产生的错误。

Correct LimitRange 8 -> 10 bit-depth conversion:
  - 使用 被动使用。
  - 作用 纠正当使用10bit版x264,输入是Limited Range 8bit-depth时程序内部转换到10bit的错误处理,以更好符合BT.709;FullRange没变。

AQ Mode 3:
  - 使用 --aq-mode 3
  - 作用 BugMaster基于aq mode 2修改而来,相比AQ Mode 2略微提升了SSIM, 速度上有略微损失(同码率,其余条件相同)。

Ofast & LTO config + Fprofiled Extension:
  - 使用 编译相关。
  - 作用 让编译后的x264编码速度更快、体积更小(不过与没有此patch的x264也不会有大的区别)。


[ 此帖被upyzl在2011-10-20 13:48重新编辑 ]
引用

roozhou@2011-05-06 21:30

楼主可以尝试加入lavf啊,不然内置的滤镜不能用。
引用

upyzl@2011-05-07 00:11

呃……dshow下小测了 --versioninfo --dscrop --sub --deldup --starttime --endtime --vf resize/pad/crop/select_every/hqdn3d
跟原版有的东西比,没发现跟带lavf的原版有什么区别……还是说我理解错了?
引用

06_taro@2011-05-07 02:26

我的diff全是以l-smash为基础定制的,而且为了方便打上都是按照编号顺序在前面的基础上继续加的patch(自己平时直接type *.diff >01-14.diff然後直接那这个diff去批量……),pure版绝大多数要改,所以不如直接去找komisar等人提供的以原版为基础的diff文件

l-smash和gpac的mux机制也不一样,个人更喜欢l-smash的所以完全没考虑gpac的兼容性……
引用

MeteorRain@2011-05-07 03:19

我现在已经微妙地成为lavf党了…… (滚来滚去
引用

upyzl@2011-05-07 11:15

@06_taro  
其实用komisar等人的diff,也要手改,至少fgo和fadecomp要弄很多。。

@MeteorRain  
MR大用lavf么..主要是之前用lavf各种问题,不知道现在怎么样了……
引用

MeteorRain@2011-05-07 11:58

@upyzl
up大..球详细
引用

upyzl@2011-05-07 12:11

@MeteorRain  

之前主要是播放问题,花屏/闪屏或者不能播放,当时用avs的DSS就没这些问题。。不过那很久以前了的样子,而且貌似lavf一直也在更新吧,应该比以前好多了

ps:你叫我大我压力很大呃。。
引用

roozhou@2011-05-08 00:23

如果l-smash能做成internal的话,我也会考虑的。我个人很不喜欢一大堆lib的那种,最好是把代码放到一起编译,这样编译起来很方便。
引用

06_taro@2011-05-08 02:35

l-smash需要的外置lib都是用於音頻編碼的。如果只要音頻混流,或者enable-lavf時用lavf的內置音頻編碼器的話,l-smash是不需要其他include和lib的(libvo-aacenc之類極少數除外)。相反倒是gpac需要一個又巨大又難編譯的libgpac_static.a

而且l-smash的configure已經改得很到位了,默認只要lib在默認文件夾內的話都不需要extra flags就自動把lib包含進去了,基本上沒有需要手動調整的,當然MSVC編譯的話另當別論= =

話說roozhou大大喜歡用MSVC編譯的話可以試試用icc做compiler,現在的x264代碼應該是完全支持icc的編譯的,而且icc本身又符合c99標準,不像vc的各種RP……
引用

roozhou@2011-05-09 18:39

我从来没用过icc啊,而且用vc的目的就是方便,编译快,便于调试,而且生成的较小。性能上1%左右的差距并不重要。icc在amd上性能很悲剧,而且编译速度太慢,出来的文件比gcc还大,却没gcc快。

gpac我是把代码放到x264_cli的工程里去的,不需要libgpac_static.a。以前的libpthread也是。我想要的是能和x264_cli一起编译,不要做成一个分开的lib需要另外编译。我希望的结果是,下载代码后,在vc里打开工程,按F7就能编译。
引用

mickoo@2011-06-04 08:35

其实我希望direct264能有64bit版,用原版32位和64位的X264对比,发现64位的比32位在我的机器上差距还是很大的,现在无奈只能安装64位的AVS,不知道原版的X264_64能不能调用ffdshow,因为我直接喂的话,是调用ffms的
引用

MeteorRain@2011-06-04 13:58

装64位的ffdshow,没问题。虽然我还是推荐走lavf或者ffms -_,- 省内存,速度又超快
引用

mickoo@2011-06-05 00:08

我装了64位的ffdshow啊,不过他还是调用ffms,我用ffdshow是想用设置分辨率,ffms不知道怎么设置
引用

«12345»共5页

| TOP