【转】Step By Step 使用 mencoder和 mp4box 输出高品质AVC+AAC For PSP

原文地址:http://bbs.wissky.com/t21986-p1-1.html

前言:

以下内容 是在不严重损失编码速度的情况下 生成一个较高品质的 AVC+AAC 的视频文件 并且能被PSP正常播放 进行讨论的
如果你是一个追求编码速度至上的人 那么阅读到此为止了
另外基于时间和篇幅的关系 我不再对一些专业名词做过多解释了

整体思路:

首先要求是 尽可能的让mencoder完成 解码 编码 和 容器封装 如果完成其中任何一项不能完成 再考虑尽可能少的增加辅助工具
在自己试验中 发现mencoder不能完成 mp4封装 因为在Mplayer手册里提到 对于mencoder自身 AVI是最可靠的输出容器 其他容器都会有不稳定的因素
在这期间 我曾尝试使用 mencoder内置mp4封装容器

-of lavf -lavfopts format=psp -o OUTPUT

但 mencoder提示 它不支持包含B帧的视频流 只能作罢
于是选择MP4BOX 作为最后的MP4容器的封装工具

需要准备的软件:

1)mencoder
本人使用版本的是这里下载的

http://sourceforge.net/projects/mplayer-win32/files/MPlayer%20%2F%20MEncoder/MPlayer-p4-svn-29355.7z/download

当然你也可在这里选择 适合你的最新版

http://sourceforge.net/projects/mplayer-win32/files/

2)MP4BOX

我是用的是 最新的DEV版 (0.4.6-dev_20090715)

你可以在这里下载到

http://www.digital-digest.com/software/MP4Box.html

本次视频压缩使用以上版本的工具 在好友PSP 系统版本号为3.71M33-4 测试成功播放 压缩后的视频 并且在PPA能也能正常播放

具体步骤说明:

1)视频来源是DVD NTSC制式 (视频流为 30P的MPEG2 音频是5.1ch的AC3)

另外为了缩短测试时间 使用 Womble.MPEG.Video.Wizard.DVD.v4.0.4.114 无损截取了 30s的片段

2)为了体现质量最大化 也理所应当的使用了x264的2pass模式

3)编码参数
(本人的CPU是 Intel Core 2 T5500的 \ 内存为 DDR II 800 4GB \ 主板为 Intel Mobile 945)

1st pass (编码速度约:48fps CPU占用率约:75%)

mencoder  -sws 9  -oac faac -faacopts mpeg=4:br=160:object=2 -srate 48000 -channels 2  -vf crop=708:480:12:0,harddup,scale=480:272,unsharp=l3x3:0.5,dsize=-1  -ovc x264 -ffourcc H264 -x264encopts  bitrate=900:turbo=1:keyint=300:keyint_min=6:scenecut=40:frameref=3:bframes=3:b_adapt=2:nob_pyramid:deblock:deblock=-1,-2:cabac:qp_step=6:qcomp=0.8:direct_pred=auto:weight_b:partitions=i4x4p8x8p4x4b8x8:no8x8dct:me=umh:me_range=24:subq=7:chroma_me:mixed_refs:trellis=2:psy-rd=0,0:nofast_pskip:nodct_decimate:aq_mode=2:aq_strength=1:level_idc=22:nointerlaced:nopsnr:nossim:threads=auto:pass=1  "INPUT.mpg"  -o "OUTPUT.avi"

2ed pass (编码速度约:17fps CPU占用率约>90%)

mencoder -sws 9  -oac faac -faacopts mpeg=4:br=160:object=2 -srate 48000 -channels 2 -vf crop=708:480:12:0,harddup,scale=480:272,unsharp=l3x3:0.5,dsize=-1  -ovc x264 -ffourcc H264 -x264encopts bitrate=900:turbo=1:keyint=300:keyint_min=6:scenecut=40:frameref=3:bframes=3:b_adapt=2:nob_pyramid:deblock:deblock=-1,-2:cabac:qp_step=6:qcomp=0.8:direct_pred=auto:weight_b:partitions=i4x4p8x8p4x4b8x8:no8x8dct:me=umh:me_range=24:subq=7:chroma_me:mixed_refs:trellis=2:psy-rd=0,0:nofast_pskip:nodct_decimate:aq_mode=2:aq_strength=1:level_idc=22:nointerlaced:nopsnr:nossim:threads=auto:pass=2  "INPUT.mpg"  -o "OUTPUT.avi"

4)关于编码命令行的说明:

a] -sws 9
因为视频 剪裁后需要进行 缩放为 480*272 于是就有了一个 选择什么样的缩放滤镜的问题
这里推荐使用 lanczos滤镜

=======================================================
b] unsharp=l3x3:0.5
这个滤镜是起到提升视觉清晰度的作用
滤镜的中文译名为 (非锐化遮蔽罩)
大致原理是 寻找出画像的轮廓 接着在轮廓部分 使其明度或是色度的过度产生很大的变化
如果你玩过 Ps 的 USM滤镜就明白它的具体原理和显著效果了
下面是老外浅显易懂的专业解释
http://www.cambridgeincolour.com/tutorials/unsharp-mask.htm

=======================================================
C] dsize=-1
如果mencoder自己不能获得 Movie AR的话 就会默认指定为 4:3
这导致 x264 以DAR =4:3 为比例目标 调整SAR值 编码后输出画面的DAR永远是 4:3
就算在x264命令行里指定 sar为1也无效
此时 使用如果dsize=-1 就会使用 PAR的比例
换言之sar永远为1:1

=======================================================
D] -channels 2
这个滤镜的作用为 告诉音频解码 输出的声道为2.0ch
使用理由很简单 PSP只能接受 2.0ch的音频
缺点是 并不是mencoder内置的一切音频解码器 都支持输出2.0ch
但是一般来说问题不大 大多数多声道的视频 一般以DVD片源比较常见 AC3的解码器可以正确downmix到2.0ch
当然可以使用 pan滤镜手动映射,混合声道 但是这样做命令行的通用性就变差了
因为 pan滤镜需要手动详细设定

=======================================================
E] 其他注意事项:
有些人会说 1st pass时可以把 音频解码和编码禁用
但我说这不行 因为x264 1st pass时 会有对每一帧的信息进行记录 (比如帧的类型 量化值等等) 这些信息是为了 2pass做准备的 (1st pass 和 2ed pass 输入的帧的内容 和序列组 必须完全一致)
当你考虑到 2ed pass时 mencoder会为了 音画同步 而skip一些帧的时候
而1st pass因为音频禁用 不会出现解码skip帧
此时 1st pass 和 2ed pass 输入画面就不再是相同的帧序列组了
这时 x264可能会提示你 1pass时是P帧 但是2pass实际编码时却是B帧之类 的警告提示

5)从mencoder输出的AVI容器里 提取 视频流 和 音频流

这里我们使用 MP4BOX完成提取工作

命令行如下:(分两次执行)

MP4Box -aviraw audio OUTPUT.avi
MP4Box -aviraw video OUTPUT.avi

一些提示:

MP4BOX会输出 视频流名为 OUTPUT.h264
音频流名为 OUTPUT.raw (也许是 MP4不能识别出 AAC IN AVI容器的 FOURCC)
接着手工rename OUTPUT.raw=》OUTPUT.aac

6)把视频流和音频流 封装为MP4容器

同样我们仍旧需要使用MP4BOX

命令行如下:

MP4Box  -add "OUTPUT.h264":fps=29.976 -add "OUTPUT.aac" "PSP.mp4"

提示要点:
MP4BOX无法识别 AVC流的 FPS值需要手工设定 fps=xxx
但可以借助 Meida info识别 AVC流的FPS值

最后想说的:

本人其实并不擅长用 mencoder 用得最多的是AVS+x264

上述的内容都是参考官方文档 和 国外网友的一些实例 花了2天的时间整理出来的 (官方的文档并不完善 有些命令行 并未出现在文档里 需要 mail list 和网友实例 加以补充)

所以难免有纰漏和曲解 望大家指正

虽然经过 朋友的PSP测试样片可以正常播放 但仅仅限于这个实例下 和 上述列举的工具为前提
本人并不能保证 因为软件的升级 片源的变化 等 情况下 按照上述的方法 仍能正常输出 被PSP播放的视频
在未来的几个月里 最多再对编码的命令行维护一次 (因为x264的默认值 即将在mencoder里发生改变)

最后附上样片:(30秒)

http://www.rayfile.com/files/062ec9d9-72e0-11de-a749-0019d11a795f/