2010年4月27日星期二

用mencoder代替avs压制内嵌字幕x264并封装 avi/mkv/mp4心得

单集动画在保持较高画质的情况下到底可以做到多小?对于RV10编码器,60M左右应该是极限了,再低画面就很难看了。而且压制一些vfr片源并内嵌字幕会遇到很多麻烦。
而这里介绍的方法可以把单集动画压到40M左右并且压缩速度和画质不低于60M的rmvb。
更重要的是,所有片源处理方法几乎相同,所有软件均为绿色无需安装注册。你可以把他们放在移动硬盘上,并随时在任何一台安装windows的电脑上使用。

先说一下把片子压小需要注意的几个关键问题
1)x264 2pass模式:用1/4左右的额外时间换取同样画质下20%以上的体积。
2)动态帧率:在画面相对静止处丢弃重复的帧以降低帧率。rv10和wmv在编码时都会采用这种方法,但x264本身没有这种功能,必须通过mencoder的滤镜实现。
3)降噪和柔化:主要作用是增大压缩率而非改善画面,但降噪柔化过度也会严重损失画面细节。
4)vbr he-aac:只需要48kbps左右的码率就能保持很高的音质,甚至优于96kbps的mp3。目前支持vbr的he-aac编码器只有neroAacEnc。

现在多核CPU已经很常见了,为了减少编码时间,我们尽可能的采用多任务并发模式保持CPU使用率100%

方法一:使用mencoder内置x264编码器或x264vfw
这个版本的mencoder内置的x264版本较低,为r680,而最新的x264vfw已更新到r819,所以推荐使用vfw编码

样例一,生成vfr mkv/mp4
准备好片源和字幕,文件名假设为src.avi和src.ass
命令行中键入main.bat src.avi src.ass即可开始压制

这里需要两个批处理文件

audio.bat内容如下
@echo off
rem 开始转换音频
mplayer_audio %1 -vo NULL -vc NULL -ao pcm:fast:pipe=1 -channels 2 -really-quiet | neroaacenc -q 0.2 -he -ignorelength -if - -of audio.mp4
rem 开始获取timecode
mencoder %1 -sub %2 -fontconfig -ovc raw -nosound -vf hqdn3d=2:1:4,ass,decimate=1,crop=2:2:0:0 -o tc.avi -quiet -ofps 120000/1001
cfr2tc tc.avi NUL tc.txt 4
del tc.avi
exit

说明:
1)第一条不适用于wma pro编码的音频,原因是调用dmo解码时mplayer会向stdout输出一些信息且无法用任何参数禁止。解决方法是使用命名管道(需自己写程序实现)或转成wav文件。
2)第二条的作用是生成一个包含时间码的avi文件并用cfr2tc提取出timecode_v2格式的时间码。mencoder本身不能生成timecode文件,但可以通过插入空帧生成播放速度正确的avi文件。
3)注意在-vf滤镜链中必须保留decimate和之前的滤镜,生成的是一个只有2x2像素的yv12 avi文件,一般大小4~5M,但总帧数和时间轴与目标文件完全相同,提取的tc.txt可以被mmg和mp4box使用。

main.bat内容如下
@echo off
start /MIN /I /LOW audio.bat
rem 分别设置1st-pass和2nd-pass参数
vfw2menc -d x264vfw.dll -s x264pass1.mcf
vfw2menc -d x264vfw.dll -s x264pass2.mcf
rem 1st-pass
mencoder %1 -sub %2 -fontconfig -ovc vfw -xvfwopts codec=x264vfw.dll:compdata=x264pass1.mcf -nosound -vf hqdn3d=2:1:4,ass,decimate=1 -of rawvideo -o NUL -ofps 120000/1001
rem 2nd-pass
mencoder %1 -sub %2 -fontconfig -ovc vfw -xvfwopts codec=x264vfw.dll:compdata=x264pass2.mcf -nosound -vf hqdn3d=2:1:4,ass,decimate=1 -of rawvideo -o tmp.264 -ofps 120000/1001

说明:
1)运行后先会弹出x264的设置对话框两次,请分别设置pass1和pass2的参数
2)滤镜使用说明:hqdn3d是降噪滤镜,参数说明可以查mplayer manual,为了减少细节损失可以减少空间轴强度并适当加强时间轴强度,另外请放在ass之前,否则字幕容易被压糊;
decimate滤镜用来删除重复帧,=x表示最多允许连续x帧被丢弃,也就是最低帧率为片源1/(x+1),建议1~2;其他滤镜可根据情况适当添加。
注意如果需要resize请一定放在降噪滤镜之前
3)如果为mkv内嵌字幕,请将-sub %2 改成-embeddedfonts -sid x,x为字幕序号,比如-sid 0表示加载第一条字幕。另外有些unicode字幕mencoder无法读取,如果mencoder显示couldn't load subtitle xxx请将ass字幕文件转为utf-8编码(ultraedit,word都可以实现)
4)如果源文件不是vfr,不必指定-ofps 120000/1001

合成mkv/mp4:
到此,生成的tmp.264是一个速度混乱的raw H264 es,可以用mmg 将tmp.264(使用tc.txt作为timecode)和audio.mp4合成所需的mkv文件
也可以用 mp4box 和 tc2mp4 合成所需的mp4文件

没有评论:

发表评论