我行依我素 | 苦苦咸咸就是我 | Snailium的个人网站
批量转换MKV至MP4,支持PS3/Xbox360/高清播放器
之前在做《Wild China》的时候曾经在网上看到有人质疑 Blu-ray 版本的视频帧率是 29.97i。因为,理论上来讲,BBC-HD 的播出帧率应该是 25i(PAL)。有人怀疑 BBC 在制作 Blu-ray 的时候做了一些不必要的转换,而且担心画质会有所下降。
今天上网搜了一下相关文章,偶然发现 BBC Post Production 的网站,里面有这么一段话:
There are a large number of international broadcasters involved, with many different scheduling requirements which need to be met, which adds to the challenge. Plus there are different international standards which BBC Resources needs to deliver to, for example 29.97 frame HD to the US and Japan and 25 frame HD to Europe. BBC Post Production, part of BBC Resources, is using its brand new Snell and Wilcox Alchemist Ph.C – HD frame rate standards converter to make this possible. BBC Post Production was the first facilities house in the world to take delivery of this new technology and invested further in it by designing a system to support Dolby E conversions. It has already used the Alchemist on a variety of BBC programmes such as Planet Earth, Galapagos, Bleak House and Nureyev for worldwide sales, as well as Live Earth.
大意就是,BBC 为了照顾北美观众,由 BBC Post Production 工作室专门把帧率从 25i(PAL)转换成 29.97i(NTSC)。而且,他们用了一个貌似很专业的软件,据说还是行业第一。
这下可以放心的压制《Wild China》了。虽然说转换帧率的时候肯定会有画质损失,但是这毕竟是 BBC 官方用这么 NB 的工具做出来的,所以还是信得过的。
附:这里还有一篇来自转换工具提供商的新闻稿。
今天终于用上了 Expression Encoder 3。想到之前的 Expression Encoder 2 不支持编码 WMA Pro 5.1 音频,安装完 Encoder 3 之后特意试了一下。
好消息!在音频设置里面终于出现了“5.1”选项!暂时还没试验效果怎么样,也不知道是不是还会出现之前的“音频已改变”错误(参见:制作 5.1 声道 WMA 音轨)。
另外,视频设置里面多出了一个“多视频流”选项,难道是将同一个源同时压制成两个参数不同的视频流?不解中……
还发现一个比较方便的地方,在预设中发现了“Xbox 360”选项。虽然“Xbox 360”预设的参数并不理想,但聊胜于无。
注:必须源音频为 5.1 才会出现 WMA Pro 5.1 的选项。所以,在解码器中需要作适当的设置。
最近在压制 BBC 出品的纪录片的时候,遇到了 MBAFF 格式的视频。doom9 上查了一下,这种被标注为“1080i”的视频,其实既不是逐行也不是隔行。
通常,我们所说的“i”(interlaced,隔行扫描)和“p”(progressive,逐行扫描)都是针对“帧”(frame)来说的。将一帧分为高场(top field)和低场(bottom field),统一编码则为逐行扫描,分开编码即是隔行扫描。
但是,MBAFF(Macro-block Adaptive Field Frame)是按照大块来分场。也就是说,在一帧当中,有的大块是逐行,有的大块是隔行。这样一来,用普通的反交错(deinterlace)的话,碰到隔行块还好说,如果遇到逐行块,结果就是变模糊。
在网上搜了很久,终于在 doom9 上找到某达人的解决方法(姑且暂称为“插值法”):
以下为源片、TomsMoComp 和“插值法”的对比(依次从上到下)。片源为 Bluray 版《BBC: Wild China》。
00:00:12.251
由于这一帧基本上全部为隔行,TomsMoComp 和“插值法”的效果不相上下。但是 TomsMoComp 的速度比“插值法”快很多。
00:49:53.377
这一帧比较复杂。蟒蛇部分为隔行,其他部分都是逐行。可以看出,TomsMoComp 虽然将蟒蛇部分成功反交错,同时也将树枝部分变得模糊。但是“插值法”很出色,不仅反交错了蟒蛇部分,同时也将树枝部分的细节保留得很好。
通过以上比较,暂时可以得出结论,对于 MBAFF 片源,“插值法”是最佳选择。
参考文章:
1. How to deinterlace MBAFF source?
之前一直在研究 Xbox360 能播放的高清视频,也大概摸索了一下 Xbox360 能播放的 H.264 视频制作方法。但是这几天在处理 CHD 制作的日本樱花的时候,制作完的 MP4 文件在 Xbox360 上播放死机。
仔细在网上搜索了一下,问题出在视频降级环节上。
用 h264info 更改 Profile Level 实际上用的是欺骗法(将第 7 个字节由 0x33 改成 0x29)。这种方法只对 Level 4.1 兼容视频有效。
何谓 Level 4.1 兼容视频?这要从 Profile Level 说起。具体的 Profile Level 规则我没有看(也没时间去研究),看 Doom9 上各位达人的讨论,问题出在缓冲区上。Level 5.1 要求的解码器缓冲区要大于 Level 4.1,所以如果没有足够大的缓冲区,解码就会出错。在 Xbox360 上的表现就是死机。
那何谓 Level 4.1 兼容视频呢?简单来说,有些视频虽然标注为 Level 5.1,但是解码时缓冲区的要求很小,甚至小于 Level 4.1 的规定。这样一来,用 Level 4.1 的解码器完全可以解码这个“Level 5.1”视频。这样的视频就被称之为“Level 4.1 兼容(Level 4.1 compliant)”。
在大致搞明白原理之后,下一步就是研究对策。既然有“Level 4.1 兼容”一说,也就证明有些视频还是可以无需重压直接降级的。要确定视频是否“Level 4.1 兼容”,比较方便的方法是使用 mkv2vob。
首先,在 Configuration 标签中,把 Video Transcoding 选成 Never。这样可以避免自动重压。
然后在 Add File 标签下,选择 MKV 文件和输出目录,再点 Add File,软件就会自动检查视频。
如果出现“Transcoding Required: Not L4.1 Compliant”,就说明视频不能被 Level 4.1 解码器正确解码,需要重新压制。
另外,如果源片的音频是 AAC 5.1 的话,还涉及到音轨映射问题。在这里就不详细叙述了,具体参见“参考资料 2”,
参考资料:
1. Doom9.org: High Profile 5.1 -> 4.1
2. Flexion.org: Converting MKV
合并两段 WMV 文件,理论上来讲不是什么麻烦的事,在网上也能找到很多相关软件。可是,网上的软件或多或少都有些问题,比如说画面抖动、音画不同步等等。就连收费的商业软件也不例外。无奈之下,只有自己写一个合并工具。
用什么语言比较好呢?学软件的各位一定想到了 C++ 和 Java。
No!我不要用连 unsigned integer 都没有的 Java!
想来想去,最简单的还是 Perl。不用安装任何编程/调试工具,反正我的 WD MyBook World Edition 里面带着 Perl 5.8.8 程序,直接就用它了!
从头开始写一个脚本还真费事。昨天晚上花了好几个小时才完成 argument parsing、PrintHelp() 和 verbose functions。今天写了一点点 Header Object parsing。
最麻烦的是 ASF 容器各个字段都是用 little endian in byte order with 32-bit boundary(32 位为一组、以字节为单元的 little endian),其中的 128 位 GUID 需要分 4 组进行逆序运算……。用 Perl 搞一个 endian 转换还真是麻烦。
慢慢来吧,也不知道什么时候才能到 Phase 1。没准又半途而废了。
事情总会忘记,还是记下来比较好。
最近高清电影转 WMV-HD 的工程进行得差不多了,看到还有一个《Big Buck Bunny》没有处理,随手拖进 Expression Encoder 2。等视频压好之后发现,这部片用的是 MOV 封装(“艺术”的格式),音频是 AAC 5.1。这下可麻烦了。
Google 了一下,貌似 Yamb + MP4Box 可以 demux mov。但是实际上只能 demux 出 AVC 视频,对 AAC 5.1 完全无效。
转了好多地方,后来意外发现 MP4Box 作者的主页上有一个 mpeg4ip tools 工具集,其中包括很多使用的小程序。
首先,用 mp4info.exe 看一下 mov 内部各轨 ID。
可以看到 Track 1 是视频轨,Track 3 是音频轨。
接下来,用 mp4creator.exe 分离音频轨。(不要被文件名迷惑了)
然后再用 AAC Decoder Demo 解码成为多音轨 WAV。很简单,选好 InFile 和 OutFile 之后按 Decode 就可以了。
拿到多音轨 WAV 之后可以用 eac3to 来分离各音轨。
拿到 6 个独立 WAV 音轨就可以转 WMA 5.1 了。
总结:AAC 5.1 转 WMA 5.1 比较麻烦,遇到 MOV 封装更麻烦。好在网络上工具不少,总有一款能满足需要。
第一步:按 F2 键,选择所有的 TS 文件,点 OK 导入。
第二步:选择 Audio -> Audio Demux,在打开的窗口中选择 Set All -> Done。
第三步:按 F4 保存 Project (*.dga)
这几天搞 XBOX360 视频转换,最棘手的就是《秒速 5 厘米》里面的 3.1 声道 LPCM 音轨。不知道小日本葫芦里卖的什么药,非要弄出一个不尴不尬的 3.1 声道。而且这个 3.1 声道的映射还不是常见的 L / R / SL / SR,而是 L / R / C / LFE。想想看,如果要转换成 WMA Pro 5.1,要么添加空的 SL / SR,要么就把 L / R 给复制到 SL / SR 上面去。无论哪种方案,都需要先把 3.1 声道 LPCM 分离成 4 个单声道音轨。
分离单声道音轨的确费了我不少时间。现在一般的工具都没有分离单声道音轨功能。最后,终于找到了 eac3to,成功分离了 4 个声道。4 个文件后缀为 L / R / SL / SR,看来 eac3to 也被这个 3.1 声道给搞糊涂了。
需要重点说明的是,用 eac3to 分离单声道音轨,需要将目标文件名加上 .wavs 后缀。就这一个字母的差别,害得我浪费了整整一天。
得到 4 个 wav 后,就可以继续按照 5.1 声道 WMA 的制作方法继续制作 XBOX360 用 WMV-HD。
参考资料:
1. VeryCD 发布的《秒速 5 厘米》
2. eac3to / How to Use
最近一直在研究 XBOX360 的媒体应用,WMV-HD 是重点。但是在尝试了若干次后,无论是视频转换还是音频转换都不成功。后来终于找到音频方面的问题,先记录一下。
手上的音频源都是 DTS / AC3 / DD-Plus / DTS-HD 等等格式,基本上都是 5.1 声道音频。转换软件是微软自家的 Windows Media Encoder 9 Series + WMP 11 Codecs。
音频转换总是在 VBR 进行到 2-pass 的时候报错,错误代码 0xC00D0BC3(General audio error)。按照微软官方的解释,这是由于音频数据在 2-pass 的时候改变,造成编码器无法工作,建议改成 1-pass 编码(CBR / Quanlity VBR)。
个人认为,1-pass 的质量总不如 2-pass 的质量好,在翻看了若干文档之后,发现 Windows Media 网站上提到了用未压缩格式作为音频源进行编码。随后又找到了 WMWiki。按照 WMWiki 上面的方法,用 DVD2WMV Assistant + BeSweet 将 AC3 转成了 6 个单独的 WAV 文件(分别对应 6 个声道),然后再将 6 个 WAV 导入 Windows Media Encoder 编码成功。(DTS 音轨转换需要 Tranzcode)
个人分析,AC3 在解码的时候会根据环境变化在不同的声道上添加增益,也就是所谓的 Dynamic Compression,因此造成两次解码数据不同。而对于 WAV,两次读取数据完全一致。看来 Windows Media Encoder 在处理视频/音频输入方面还是存在缺陷。有能力的话试一下 Expression Encoder 吧。
参考资料:
1. Converting AC3 to Multiple WAVs
2. Converting to WMV9
3. Converting DTA to WMA
4. Windows Media 编码器 9 系列常见问题解答
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |