iPhoneで音が出ないMP4ファイル

ネットブックiPhoneを抱えて帰省中。
暇つぶしにネットに転がってる動画を集めたりするのだが、ネットブックが非力なのでiPhoneに入れて見る。

ところがたまに、映像は問題なく再生されるのに音が出ないMP4(H.264/AAC)ファイルがある。

映像は問題ないので音声コーデックに問題があるのか…?
そこでiPhoneで再生できる動画フォーマットを確認。
iPhone 4 技術仕様

・対応するビデオフォーマット:
H.264ビデオ:最大720ピクセル、毎秒30フレーム、メインプロファイルレベル3.1(最高160KbpsのAAC-LC)、48kHz、.m4v、.mp4、.movファイルフォーマットのステレオオーディオ

どうも問題はここだったらしい。
音が出ない動画ファイルを確認したら、音声部分のビットレートが192kbpsとかだった。

では、再生できるように加工しよう。
ちなみに私はWindowsユーザーなのでMacのことはよくわからない。

・必要なもの
QuickTime(音声の再エンコードに使う。iPhoneユーザーなら入ってると思われるが)
qtaacenc(QuickTimeエンコード機能をコンソール操作するプログラム)
MP4Box(MP4コンテナ操作プログラム)
qtaacencとMP4Boxは下記で紹介するバッチファイルと同じフォルダに入れてほしい。

@echo off
if not exist "%~dp0MP4Box.exe" (echo "MP4Box not found"
    goto end)
if not exist "%~dp0qtaacenc.exe" (echo "qtaacenc not found"
    goto end)
echo extracting audio stream...
"%~dp0MP4Box.exe" -raw 2 "%~f1"
echo encoding audio AAC-LC ABR 160kbps...
"%~dp0qtaacenc.exe" --abr 160 --highest "%~dp1%~n1_track2.aac" "%~dp1%~n1_track2_160kbps.aac"
echo combining...
"%~dp0MP4Box.exe" -add "%~f1#video" -add "%~dp1%~n1_track2_160kbps.aac#audio" -new "%~dp1%~n1_adj%~x1"
:end

バッチファイルは適当。動くと思うけど適宜調整してください。
スペース入りのパスとか対応しようとしたらごちゃごちゃに。よくわからんね。
MP4Boxのストリーム抽出に抽出先ファイル名指定できればもうちょいスマートになるのに…

それはそうと使い方。MP4ファイルをバッチファイルにドラッグアンドドロップするだけです。
MP4のあるフォルダに〜.aacっていうファイルが二つと〜adj.mp4ってファイルができると思います。
〜.aacは消してOK。〜adj.mp4が音声部分を160kbpsに調整した動画ファイルです。

なお、H.264/AACのMP4コンテナの動画ファイルにのみ対応。