CoreAVC 与 CorePlayer

CorePlayer Pro for OS X

昨天碰巧翻到一个叫 CoreAVC for Linux 的项目,其实应该之前很早就听说过,因为这个项目在去年五月份的时候曾经被 Google Code 停止提供服务,因为“DMCA complaint”,但现在又恢复了,不过可能 patch 更新得不够及时,不一定能够用在 svn HEAD 的 mplayer 上。

CoreAVC for Linux 到底是个怎么样的项目呢?众所周知的是,CoreAVC 是目前公认软解 H.264 效率最高的解码器,在 Windows 平台有提供,价格是 $15 (不过大部分 Windows 用户都用破解版本的)。开发这个解码器的公司还把它移植到了 Palm, Symbian, Windows CE 等平台上,是移动平台中最有名的一个通用播放器,叫 CorePlayer。

从去年二月开始,CorePlayer 被移植到了 Windows 和 Mac OS X 平台上,但官方没有提供给 Mac OS X 平台的 CoreAVC (假如有的话,应该是 Perian, Flip4Mac 那样作为 QuickTime 插件的形式,但不知道这个公司出于什么考虑,并没有像 Windows 平台那样提供)。而 Linux 平台下也没有提供公开销售的版本。所以 CoreAVC for Linux 就是为了能在 Linux 平台下使用这个解码器而产生的。

虽然细节比较复杂,我现在也不大了然,但原理也不难理解,修改 mplayer 的 DirectShow 支持代码,类似调用 RealMedia 的 DirectShow 插件那样来调用 CoreAVC 的 DirectShow 插件。开发者说有两种修改方法

  1. 使用一个外部程序 dshowserver 来提供服务,修改 mplayer 使之能够支持 dshowserver,这种方法能够适用于 x86_64 和 ia32
  2. 直接修改 mplayer 的 Win32 dshow 代码使之支持 CoreAVC,只适用于 ia32

作者说第一种是推荐的方法,但不能用于 Windows 和 Mac。而第二种完全没有提到具体步骤,也没见到具体的 patch。

正巧看到 CorePlayer Pro for OS X,虽然没提供试用版本,但好在也不算贵 ($17),就买了一个试试。下面是一点结论:

No AC3 support in CorePlayer OS X

  1. 最大的问题是音频解码支持很弱,不支持 AC3 解码,不支持 DTS 解码,而且发布之后一年内始终没得到解决,开发者很有点言而无信,一开始在去年二月说“数周内”能解决,到 12 月还没提供,又改说我们可能要依赖平台提供的功能实现 (Windows 下用 DirectShow, Mac 下用 Core Audio),这也没问题,可这都二月了,还没解决。感觉相比移动平台,这个公司并不怎么注重桌面平台的支持。

  2. 界面很土,非要做跨平台的界面,结果用起来非常不方便,更不用说完全不 Mac 化了。

  3. 解码 H.264 的效率确实比其他任何 Mac 平台的解码器都要好,手头一个 1080p 的 Fight Club 的 BDRe, 用 Plex 时的 CPU 占用率在 120% ~ 150% 左右,用 CorePlayer 时占用率在 75% ~ 80% 左右。

  4. 不支持外挂字幕,而且短期内不打算支持。

总的说来,我觉得他们最大的决策错误就是不提供单独的 CoreAVC,非要自己做播放器,结果给自己带来了过重的开发负担,比如界面、音频编码器这些,如果只提供一个 QuickTime 插件,就压根不需要他们操心了。H.264 的解码效率是好,但也没有好到超过一个数量级的程度,在 Snow Leopard 和新一代 Mac 提供了显卡硬解码支持的背景下,就更难让人看好这个产品的前景了。

mplayer 的字幕播放

mplayer 是常用的播放软件,其文档对于涉及字幕播放的一些参数不甚详尽,或者留意的人不多,这里对常用选项略作一介绍。

以一个包含了字幕的 mkv 文件为例:

$ mkvinfo ~/Vexille_2077_Nippon_Sakoku.mkv
...
|+ Segment tracks
| + A track
|  + Track number: 1
|  + Track UID: 141444798
|  + Track type: video
|  + Enabled: 1
|  + Default flag: 1
|  + Forced flag: 0
|  + Lacing flag: 0
|  + MinCache: 1
|  + Timecode scale: 1.000000
|  + Max BlockAddition ID: 0
|  + Codec ID: V_MPEG4/ISO/AVC
|  + Codec decode all: 1
|  + CodecPrivate, length 131
|  + Default duration: 41.708ms (23.976 fps for a video track)
|  + Language: jpn
|  + Name: 
|  + Video track
|   + Pixel width: 864
|   + Pixel height: 480
|   + Interlaced: 0
|   + Display width: 864
|   + Display height: 480
| + A track
|  + Track number: 2
|  + Track UID: 3113156519
|  + Track type: audio
|  + Enabled: 1
|  + Default flag: 1
|  + Forced flag: 0
|  + Lacing flag: 1
|  + MinCache: 0
|  + Timecode scale: 1.000000
|  + Max BlockAddition ID: 0
|  + Codec ID: A_AC3
|  + Codec decode all: 1
|  + Default duration: 32.000ms (31.250 fps for a video track)
|  + Language: jpn
|  + Name: 
|  + Audio track
|   + Sampling frequency: 48000.000000
|   + Channels: 6
| + A track
|  + Track number: 3
|  + Track UID: 3841949375
|  + Track type: subtitles
|  + Enabled: 1
|  + Default flag: 1
|  + Forced flag: 0
|  + Lacing flag: 0
|  + MinCache: 0
|  + Timecode scale: 1.000000
|  + Max BlockAddition ID: 0
|  + Codec ID: S_TEXT/ASS
|  + Codec decode all: 1
|  + CodecPrivate, length 903
|  + Language: chi
|  + Name: GB
| + A track
|  + Track number: 4
|  + Track UID: 1264721059
|  + Track type: subtitles
|  + Enabled: 1
|  + Default flag: 0
|  + Forced flag: 0
|  + Lacing flag: 0
|  + MinCache: 0
|  + Timecode scale: 1.000000
|  + Max BlockAddition ID: 0
|  + Codec ID: S_TEXT/ASS
|  + Codec decode all: 1
|  + CodecPrivate, length 891
|  + Language: chi
|  + Name: Big5
|+ EbmlVoid (size: 1024)
|+ Attachments
| + Attached
|  + File name: Font.TTF
|  + Mime type: application/x-truetype-font
|  + File data, size: 2484512
|  + File UID: 577931698
|  + File description: CN-GB
...

这是一个比较典型的情况: 有两个 subtitles track,分别对应简体和繁体的字幕 (从 Name 分别叫 GB 和 Big5 可以看出),字幕的格式都是 ASS,并自带了一个附件 (Attachment),这个附件是一个名为 Font.TTF 的字体文件。*

  • 注: 顺带说一句,附带有版权的字体文件是非法的。

mplayer 默认的选项并不能让我们很好地播放这个 mkv 文件,所以需要一些配置。在这里,我首先建议编辑你的 ~/.mplayer/config 文件,而不是通过 MPlayer OSX 这样的图形化前端,因为 mplayer 同时支持用配置文件和用命令行选项来选择参数,前者调整起来要方便一些。

对于中文用户,最常见的一个选项是

subcp=gbk

这表示我们显示地指定将所有字幕文件以 GBK 编码处理,对于大部分中文字幕都是适用的。*

  • 注: 近来,在 shooter (射手网) 上提供的字幕有些也会以 UTF-16 格式出现,如果你用 GBK 编码无法成功看得到字幕,可以尝试换用 subcp=utf-16 看看。

  • 注 2: mplayer 可以用 enca 库来进行自动编码探测,可惜的是这个库并没有对 CJK 相关语系编码的支持,如果有可能,将 Universal Charset Detector 用在此处或许更好。

对于 ASS 格式的字幕,mplayer 有两种渲染方式,一种是忽略所有的格式信息,将它作为纯文本显示,另一种则是启用格式,一般我们希望使用后者,所以可以加上选项:

ass=1

对于自带字体的情况,默认 mplayer 并不解析它们,只有在:

embeddedfonts=1

时才会解析,所以也建议加上这个选项。

在播放 mkv 文件时,mplayer 默认并不会选择字幕文件的 track,所以我们需要手动用 -sid 0 或者 -slang chi 参数来选择。(你也可以将这类参数写入配置文件,不过在 mkv 不自带字幕时这样的参数不会有效。)

经过上述的调整,mplayer 已经可以很好地播放 ASS 格式字幕和 mkv 媒体文件了,不过还有一种更常见的字幕格式需要调节,那就是 srt。

srt 字幕常以外置文件的形式提供,放在媒体文件同一个目录下,以同样的前缀为名,后缀一般为 .chs.srt, .gb.srt 这样的形式,所以为了让 mplayer 的外部字幕文件查找能够找到这些文件,我们首先就应该加上下面的选项:

sub-fuzziness=1

这个选项的可选值对应:

0 = 不模糊匹配
1 = 匹配任何包含原媒体文件名的字幕文件,但包含原媒体文件名和 slang 所指定语言的优先级更高
2 = 匹配任何字幕文件

所以当同一个目录下有多个语言的字幕时,你可以用

sub-fuzziness=1
slang=chs

这样的配置来优先选择后缀为 .chs.srt 的那个。

对于 srt 字幕文件,一个有用的功能是字体大小的缩放 (因为 srt 本身没有指定字体大小),经过试验,对于一般 DVDRip (resolution 在 600×300 左右),用以下参数较恰当:

subfont-autoscale=2
subfont-text-scale=3.5

对于 720p / 1080p 的 HDRe/Remux,则应该将 subfont-text-scale 进一步缩小到 2.5 左右较好。

欢迎补充更多 mplayer 的使用经验。