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に変換するツールを公開しました。
iOS対応高機能MP4を簡単に作るdgMP4Muxer完成
世間は三連休だったようですが、σ(^^)的には発生イベント皆無だったので、家に籠もって手持ちソフトをこないだ習得した方法でiOS対応MP4にしこしことエン…
はじめまして。
iPhoneで視聴できる動画へのチャプターづけ、とても参考になりました。ありがとうございます。
ご相談なのですが、わたしもペガシス社のTME3を利用しています。
エントリーにあった “keyframeファイルをchapters.txtファイルに変換するアプリケーション” 、ぜひ公開していただけないでしょうか?
お忙しいとは存じますが何かの機会にでもご検討いただければ幸いです。
どうぞよろしくお願いいたします♪
こんにちは。
自分用に作ったものなのでお役に立つかわかりませんが、とりあえず今使っているものに簡単なマニュアルをつけて上記リンクからダウンロードできるようにしてみました。
よろしければお使い下さい。
はじめまして。
上記のkeyframeファイルを変換するツールを利用させてもらってます。
シンプルで非常に使いやすいのですが、変換後の秒数下三桁が必ず000になってしまいます。
お時間のあるときで構いませんので修正していただければ幸いです。
おや、こんな古いエントリーに立て続けに2件もコメントが。
最後の3桁の数字が000になっているのは仕様というか、わざとそうしてます。一般にMPEG4のような動画圧縮形式だとそこまでの精度で頭出しをすることができず、GOPというフレームのまとまりの先頭にしかジャンプできません。指定したフレームの次のGOPの先頭フレームにいくのか、一般に少し狙ったポイントより後ろから再生が始まります。そこで本来のキーフレームよりも少し前を指定する意味で秒以下3桁を切り捨てるという大ざっぱな対処をしています。
再生環境やエンコード時のキーフレーム指定などでも変わってくるのかも知れませんが、当時ウチでは試した感じではこうした方が狙った位置に来るような印象でした(例えばオープニングとかスキップした時、本編の頭が欠けるよりはオープニングがチロっと見える位の方がマシなので)。よろしければ実際にドンピシャのフレーム番号を指定したchapters.txtが本当にメリットがありそうか実験してみていただけないでしょうか?(.chapters.txtファイルは「メモ帳」などで編集できます)。その上でやはり必要だとおっしゃるのであれば、設定でどちらか選べるような実装をしてみるのはアリかなと思います。
#あるいはもしVB2010環境をお持ちで自分で手を入れたいということで
#あればソースも公開しますよ。
丁寧なお返事ありがとうございます。
前回の投稿は、実際にドンピシャのフレーム番号を指定したchapters.txtと比較した上での希望です。
このソフトを利用させて頂く前はaviutlでチャプターファイルを作成していたのもあって、
私の個人的な感覚では挙げていただいた例でも、オープニングがちろっと見えるよりは
aviutlと同じように本編(微妙に頭が欠けている?)から始まるほうがすっきりと感じました。
ただ、本編が欠けるよりは良いというのはとても納得できる理由ですし、
私一人のためにお手を煩わせるのもアレですので、ひとつの意見として聞き流していただいても構いません。
仮に手の空いたときにでも修正してもらえるのでしたら、変換時のsound on/offも希望しておきます。(追加の要望でスミマセン)
dgKeyframe2Chapterをリリースしました
かなり前の「iOS向け高機能MP4自炊まとめ」というエントリで、Pegasys社のTMPGEncシリーズで書き出された.keyframeファイルを、mp4…
対応してみました。こちらのエントリをご覧下さい。
//do-gugan.com/~furuta/archives/2011/10/dgkeyframe2chap.html
色々すっかり忘れてるので、計算結果が合っているか確認していただけると有り難いです。