iOS 4.3 新增的一个重要的功能是对 home sharing 的支持,这样你可以在一台安装了 iTunes 的机器上共享任何视频和音频而不需要同步到对应的 iDevice 中。这给打造基于 Mac 的家庭媒体中心带来了很大的便利。先前介绍过用 XBMC 构建媒体库的方法,安装了 XBMC 的 Mac mini 是我目前主要使用的视频播放设备,自从 Mac OS X 开放了视频硬件解码支持 之后,用低配置的 Mac mini 播放高码率的 1080p 视频也完全不是问题了。而且对于 iPad 2 和 iPhone 4S 以后的设备,因为已经支持到 H.264 的 High Profile 4.1,所以正常情况下,网上所有能下载到的 MKV 封装的视频,都只需要重新封装一下就可以无损地播放了。这里介绍一下我的配置。 从网上下载到的 mkv 视频,一般先用 MP4tools demux 再封装为 mp4,这是我目前找到的最方便工具。如图所示:
因为前面提到的原因,视频部分可以不转换,所以选择直接 Pass Thru,但音频部分一般是 AC3 或者 DTS 各式的,需要转换为 AAC 才可以给 iDevice 们播放,这里可以任选码率,大部分情况下 192 kbps 绰绰有余。
更新: @RioJot 提醒我有个开源的 Subler 工具也可以完成这个操作,它的界面比 MP4tools 更好一些,支持选择音频 downmix 的类型 (Dolby Pro Logic 2, Dolby Pro Logic, Stereo, Mono),还可以自动抓取元数据和 Artwork。另外它的队列管理也比 MP4tools 好一些。唯一需要注意的是必须安装了 Perian 之后才可以进行音频的 downmix。
转换完之后的 mp4 已经可以直接加入 iTunes 中播放,但比较理想的还是添加一下文件的元数据,比如电影的标题、年份、电视剧的系列名和海报等等。这个工作可以用 iSubtitle 自动完成。只要用 iSubtitle 打开 mp4 文件,它就会根据该文件的名称在网上的对应数据库中匹配获得相关元数据 (比如电影从 themoviedb.org 中搜索)。iSubtitle 还支持的一个重要功能是给 mp4 文件添加软字幕,只需要把 srt/ssa 格式的字幕文件下载下来,取相同前缀,放在 mp4 文件所在的目录下即可。比如 Spartacus.S02E02.720p.HDTV.X264-DIMENSION.mkv 文件转换得到 Spartacus.S02E02.720p.HDTV.X264-DIMENSION.mp4,字幕文件可能是 Spartacus.S02E02.720p.HDTV.X264-DIMENSION.chs.srt。它的界面如图所示:
iSubtitle 执行的只是元数据操作,所以可以在 mp4 上直接保存。然后就可以加入 iTunes 中。iTunes 会根据元数据信息分类存放,比如下面这样:
更新:Subler 也可以完成添加字幕的操作,这样你可以把两步操作合并到一步完成,可是 Subler 必须手工选择字幕文件,而且字幕文件也必须已经转换为 UTF-8 编码才可以添加。
然后,在 iTunes 和 iDevice 中启用家庭共享 就可以在设备的 Video app 上看到这些视频了。根据我的经验,至少 720p 的视频在 wifi 下播放是非常流畅的,也几乎不需要任何缓存时间,如果出现播放缓慢、经常停滞的情况,就应该检查网络或者设备配置问题了。如图:
于此同时,因为 iTunes 已经将文件组织好了,我们还可以将 iTunes 的媒体文件所在目录直接添加到 XBMC 中,这样就可以自由选择是在电视的大屏幕观看还是在 iPad 上观看了 (当然也可以直接用 iTunes 观看,选用 XBMC 主要是习惯和方便用遥控器操作)。对于电视剧文件,因为文件名仅仅是标题,XBMC 无法直接搜索,所以可以在安装了 mp4v2 之后 (brew install --using-llvm mp4v2),使用如下 Python 脚本生成符合 XBMC 需要的符号链接:
#!/usr/bin/python
import sys, os, commands
def linkfile(src):
output = commands.getoutput("mp4info '%s'" % src)
season = 0
episode = 0
for line in output.splitlines():
sl = line.strip()
if sl.startswith("TV Season"):
season = int(sl.split(":")[1].strip())
elif sl.startswith("TV Episode"):
episode = int(sl.split(":")[1].strip())
if season and episode:
ext = os.path.splitext(src)[1]
dst = "%s/%dx%02x%s" % (os.path.dirname(src), season, episode, ext)
print src, "->", dst
if not os.path.islink(dst):
os.symlink(src, dst)
for root, dirs, files in os.walk(sys.argv[1]):
for name in files:
linkfile(os.path.join(root, name))
这样在 XBMC 上看到的效果如图:
顺带一说,在即将发布的 XBMC 11 “Eden” 中,还支持将 XBMC 作为 AirPlay 接收端,这样 iDevice 上保存的图片、音乐和视频也可以直接用 wifi 发送到 Mac 上观看了。





15 Comments