iPhone、iPad、iPod touchなどで機能するチャプターとマルチ音声入りのMP4を自炊するために、昨日からあれこれ試行錯誤した結果を覚え書き。
■マルチトラックオーディオ
いままで、HandbrakeでDVD-Videoから直接エンコードした場合のみiOSで切り替え可能なマルチ音声トラックなファイルを生成できていました。が、それ以外の形式から最近愛用しているMediaCoderなどで生成した場合、どうしても上手くいきませんでした。MediaCoder自体にもそれ系の項目はあるんですが、エラーになったり同じトラックが複数含まれるファイルになったり。特にMediaCoderは最後にmuxする時にエラーで落ちることが多く、延々かけた時間が無駄になるのが痛い。
で、あれこれ試した結果わりと安定して作れるのは、映像と音声を別々にエンコードしてmp4boxでくっつけるという方法(demuxはソースによって方法が異なるのでとりあえず割愛)。mp4boxはMP4コンテナにまつわるいろいろな編集を行うコマンドラインツールで、MediaCoder自体も裏で使用しています。またyambという優れたグラフィックフロントエンドもあるんですが、iOSで認識する形式でmuxするには、直接コマンドラインで下記のようにする必要がありました。
mp4box.exe -add "映像.mp4" -add "音声1.m4a":lang=jpn:group=1:delay=100 -add "音声2.m4a":disable:lang=jpn:group=1:delay=100 "出力.mp4"
へんなとこで折り返してますが実際は一行です。音声ファイルにそれぞれgroup=1を付与するのと、メインではない方の音声ファイルにdisableオプションをつけるのがポイントらしいです。またmuxした結果音がズレる場合は上記のようにdelay=100などと指定します(ズレてなければ不要)。lang=jpnは別になくてもいいかも知れませんが、指定しておくと、iOS上で選択肢に「日本語」と表示されます。
ちなみにこのやり方でVLC、MediaPlayer Classic Home Cinema等でも切り替え再生ができていますが、なぜかQucikTime Playerではダメでした。QuickTime Playerで動けばiOSでもいけるだろうと動作チェックに使ってたんですがハマりました。iOSで使えるとわかれば重たいQuickTime Playerなんか使わないので認識しなくてもキニシナイことにします。
yambがこのオプション付きでのmuxに対応してくれるといいんですが、まぁこれくらいなら自分でフロントエンドGUIアプリを作ってもいいかも知れません。
■チャプター
これもハマりました。yambやmp4boxでもチャプターを設定できるはずなんですが、これもやはりPCソフトでは認識するがiOSではNG、というファイルになります。Nero由来の独自形式のようです。iOSでも再生できるQuickTime形式互換のファイルを作るには、下記の手順が必要でした。
hoge.mp4という動画ファイル名だったら、hoge.chapters.txtというテキストファイルを同フォルダに用意し、中身を次の書式にします。
00:00:00.000 アバンタイトル
00:03:45:000 オープニング
00:05:00:000 本編Aパート
日本語を使った場合は文字コードをUTF-8で保存します。改行コードはCRLFで大丈夫っぽいです。チャプター名をつけておくと、iOSデバイスやQuickTime Player上でリストで選択できるようになります。
書き込みにはmp4chap.exeを使います。これはmp4v2 toolsというユーティリティ集に含まれています。ググればすぐに見つかるでしょう。これまたコマンドラインから、
mp4chap.exe -i hoge.mp4
とします。mp4ファイルは上書きされます。安定動作を確認するまでは念のためバックアップをとるのが無難でしょう。今度はQuickTime Playerでも動作確認できます。シークバーの右側にポップアップメニューが出現してれば成功です。
iPhoneに入れた場合は、矢印の部分にボタンが出現します。タップすると右の一覧画面になります。
また、拡張子がm4vでないと認識されないという指摘も散見されますが、とりあえずiOS4ではmp4のままで大丈夫みたいです。ただiPadでは>>|ボタンは効くものの、一覧表示はできないみたいです。
ただ、精密に指定しても環境によってドンピシャの位置からは始まらなかったりするようです。iフレーム以外だと前後のiフレームに強制移動されたりするのかも知れません。色々試した中ではむしろiPhoneが一番精度高く頭出しされるようだったので、とりあえず良しとすることにしました。
■チャプター情報の生成
さて、やり方はわかりましたが、自分で作成するのは結構手間です。そこでTMPGEnc MPEG Editor 3.0のカット編集画面でキーフレーム一覧をテキストで書き出す機能に着目。この機能は単純にフレーム番号を1行1件で書き出します(拡張しは.keyframeですが中身はテキストファイル)。TV録画したファイルの場合、29.97で割れば先頭からの秒数になりますので、ちょっと計算式を組めば上記の00:00:00.000形式にできます。
そこで、このkeyframeファイルをchapters.txtファイルに変換するアプリケーションを自作しました。当初コマンドラインツールにして全自動で変換しようと思ったんですが、やっぱりチャプター名も指定したいなということで、GUIツールにしました。リクエストがあれば公開します(公開しました。下記参照)。
これでとりあえずTME3でCMカットしたりリップしたりするファイルに関しては半自動でチャプター情報ファイルも生成できるようになりました。ちょっと手間ですが、今期から(お気に入り作品だけでも)チャプター入れてみましょうかね。
2010.07.14追記:
今回のレシピで作ったファイルをPlayStation3でも再生してみました。マルチ音声はOK、チャプターはNGという結果でした。また、44.1KHzだと音程が高くなってしまう現象が発生。48KHzにしておくのが良さそうです。
2010.07.20追記:
上記レシピによるmuxを簡単に実行できるGUIフロントエンドを作成、公開しました。
2011.10.06追記:
コメントでリクエストをいただいたので、TMPGEncシリーズの.keyframeファイルをmp4chaps.exe用の.chapters.txtに変換するツールを公開しました。