音声の m4a ファイルを mp3 へ変換するのにネット検索で見つかる方法を使っていたら、Windows Media Player で警告が出て、その対処をした際のメモ書きです。
ちなみに自分は MacOSX Yosemite で作業してます。ffmpeg と mp4box は brew でインストールしました。
よくみる方法と問題
$ ffmpeg foo.m4a -acodec libmp3lame -f mp3 foo.mp3
このコマンドで生成した mp3 ファイルを Windows の Media Player で再生したところ 「拡張子がmp3とは違うが、ファイルによっては再生出来るものもある」的な警告がでました。音声の再生自体は出来ます。(Windows10 では特に問題なかったので、Windows7,8 辺りまでの問題かも)
なお、MacOS の QuickTime では特に不都合がないです。
原因推測
(前提知識) 動画ファイルは Atom、(いまどきだと MP4コンテナ)1と呼ばれるバイナリ形式で保存する事が多いです。これは様々なデータを含む事ができる汎用的な形式でコンテナと表現されます。
m4a はこの Atom コンテナで AAC 音声ストリームを格納します。
上記のコマンドだと m4a のAtomコンテナをそのまま引き継いで、Atomコンテナに包まれた mp3 ファイルが生成されます。
- ffmpeg -i foo.mp3 でコンテナを確認
$ ffmpeg -i foo.mp3
<略>
Input #0, mp3, from 'foo.mp3':
Metadata:
major_brand : M4A
minor_version : 0
compatible_brands: M4A mp42isom
Windows Media Player は .mp3 の拡張子でファイルを受け取った際、RIFF コンテナに包まれた mp3 か、生の mp3 ストリームを期待していて、Atom コンテナだと都合が悪いようです。
多分正しい方法
track 1 に音声が入っていると仮定して (mp4box -info foo.m4a で調べられます)
$ mp4box -raw 1 foo.m4a # 生の AAC ストリームを抜き出す
$ ffmpeg -i foo_track1.aac foo.mp3
まず mp4box で音声の AAC ストリームだけ抜き出して、それを MP3 ストリームに変換します。
- ffmpeg -i foo.mp3 でコンテナ(に入ってないの)を確認
$ ffmpeg -i foo.mp3
<略>
Input #0, mp3, from 'foo.mp3':
Metadata:
encoder : Lavf56.25.101
Duration: 00:02:47.63, start: 0.025057, bitrate: 64 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p, 64 kb/s
蛇足的なメモ
- シェルでまとめて処理するなら (bash版)
for i in *.m4a ;
do b=`basename $i .m4a` ;
mp4box -raw 1 $i ; ffmpeg -i "$b"_track1.aac $b.mp3 ;
done
最後に
ffmpeg だけでもオプションで頑張れば出来そうだけど、誰か方法知りませんか?
コメントを頂きました。オプションで対応できるようです(元々の問題を再現できなかったので未確認のまま)。こちらが参考になりそうです。
$ ffmpeg -i input.wav -write_xing 0 -id3v2_version 0 out.mp3
-
仕様としてはISOBMFF形式(ISO/IEC 14496-12)を参照の事。 ↩