紆余曲折

iOSにブルーレイ内部の動画を入れるのに、できるだけ劣化の少ない形で入れることはできないかと色々模索している最中、.mp4にALACを格納できないかと思い立ちました。

結論から言えば、純正の「ビデオ」Appに入れることはできませんでした。技術仕様 - 技術仕様”)にある通り、どのようなコンテナであれ、H.264ビデオの場合、オーディオコーデックはAAC-LCでなければiTunesが転送を許してくれないのです。もっとも、AVPlayerなどのメディアプレイヤーに転送すれば、ALACもH.264も再生する能力自体はあるので、ハードウェアデコーダーで再生できます。これについては、機会があれば別に記事をまとめたいと思います。

そもそも通常の方法では.mp4にALACを格納することはできませんし、わざわざ格納する意味があるのかと言えば、それも非常に怪しいところです1。どうせALACを再生できる環境自体が限られているので、開き直って.movにでも格納してしまうのが正解でしょう。

しかし調べるうち、どうやらL-SMASHというものを使用すれば、.mp4にALACを格納できることがわかりました。

それとMP4にALACを入れるのがまだx264_L-SMASHしか無いみたいで


この度のremuxer実装により、MP4Boxを使わずしてMP4コンテナに格納された映像ストリームと音声ストリームのマルチプレクス処理が可能となりました
今回は、このL-SMASHに含まれるremuxer(とffmpeg)を使用して、.mp4にALACを格納する方法を書いていこうと思います。

まずはffmpegでdemux

L-SMASHだけでは直接remuxすることはできないようので、まずはffmpegで(他にdemuxerを導入しているなら当然それでもいいですが)demuxします。ffmpegのインストール方法は調べればすぐ出てくると思いますが、Homebrewをインストールしてあるならbrew install ffmpegでできます。

demux自体は簡単で、ビデオの取り出しは

ffmpeg -i "input.m2ts" -vcodec copy -an "output.m4v"

オーディオの取り出しは

ffmpeg -i "input.m2ts" -vn -acodec copy "output.m4a"

で行います。たぶんもっと高等な手段があるんでしょうけどこれで出来ます。

注意するのは、出力ファイル名の拡張子です。通常ffmpegでdemuxする際はRAWストリームで出力するため、拡張子は「.aac」のようなコーデック名をつけるのですが、L-SMASH remuxerはRAWストリームのインポートに対応していないため、通常のコンテナの拡張子を指定します。ここでは分かりやすいので.m4vと.m4aをそれぞれ付けています。

L-SMASHのインストールとremux

分離ができたら、L-SMASHをインストールします。L-SMASHのgitレポジトリからソースを取得し、インストールします。

git clone https://code.google.com/p/l-smash/
cd L-SMASH
make
make install

muxer2, remuxer, boxdumper, timelineeditorの4つがインストールされるはずです。

インストールが終わったらremuxerを使用して、先ほどのファイルを.mp4にまとめます。remuxerの使い方も、こんな感じで簡単です。

remuxer -i "input_video.m4v" -i "input_audio.m4a" -o "output.mp4"

処理が終われば、出力ファイルが出来ているはずです。お疲れまでした。

オチ

前述したとおり、H.264+ALACでは、たとえ逆立ちしてもiTunesから「ビデオ」Appに転送することはできませんでした。iTunesで管理するにしても.movのほうが何かと便利なこともあり、結局でき上がったファイルは捨てて

ffmpeg -i "input.m2ts" -vcodec copy -acodec libfaac "output.mov"

したのでした。


  1. 行儀のよいことなのかも分かりません。
    ↩️
  2. 古くはaudiomuxerという名前だったらしいので、情報としてはそちらのほうがよく見当たるかもしれません。
    ↩️