mp4/m4a/aacのファイルサイズ/音質について

コメント頂きました

NHK語学講座のラジオ番組ストリーミングを取得するRubyスクリプトgogakuondemand.rb(v2.0→2.2) - 別館 子子子子子子(ねこのここねこ)
のコメント欄にこのようなコメントを頂きました。

ma 2013/07/31 15:56

gogakuondemend.rb v2.2ベースに、大量ダウンロード時にうれしい時間短縮する案を考えました。AACのままでの保存です。
def convert_mp4_mp3のcommand_ffmpegにおいて
-ab 64k -id3v2_version 3

-absf aac_adtstoasc -acodec copy
に、
#{title_path}.mp3

#{title_path}.m4a
に変更すると、変換は一瞬(1秒ぐらい)で終わるのでファイル数が多いときには嬉しいです。
AACが扱えないプレイヤーはほとんどないと(勝手に)思いますので。
必要ならばダウンロード終了後にオフラインでゆっくり変換できますね。

ストリーミングファイルの技術解説

NHK語学講座ストリーミングはHLS(HTTP Live Streaming)というフォーマットで配信されています。

HLSでは、エンコーダーによってデジタルデータ化された映像・音声信号をファイル化する際に、10秒単位の「MPEG-2 TS」として細切れにし、暗号化して、小さな連続したファイルを作ります。
そして、この細切れになった「MPEG-2 TS」ファイルの再生順や、暗号化の鍵、コンテンツのバリエーションなどを書き込んだM3U8形式の「プレイリスト」に記載しておきます。そして、これらをWebサーバーから配信する、という仕組みになっています。
第554回:HLS形式 とは - ケータイ Watch Watch

MPEG-2 TS」に使える音声フォーマットは各種あるのですが、NHK語学講座ストリーミングではaacが使われています。
例として「実践ビジネス英語_2013_07_24」のFFmpegインプットステータスを見てみます。

Input #0, hls,applehttp, from 'https://nhk-vh.akamaihd.net/i/gogaku-stream/mp4/13-ebj-4231-766.mp4/master.m3u8':
  Duration: 00:15:01.00, start: 0.100667, bitrate: 0 kb/s
  Program 0 
    Metadata:
      variant_bitrate : 42000
    Stream #0:0: Audio: aac ([15][0][0][0] / 0x000F), 24000 Hz, stereo, fltp, 45 kb/s
    Metadata:
      variant_bitrate : 42000

つまり、ストリーミングのファイルをそのまま繋げればaacになります。maさんの提案は、aacそのままを使ったらaacからmp3へのエンコード時間が不要になりますよ、との提案なのです。

gogakuondemand.rbでmp3にしていた理由

私は基本的にmp3でエンコードしたラジオ録音ファイルを管理しています。というのは、
ID3タグが使えるのはmp3だけだ
と思い込んでいたためです。

mp4/m4a/aacでもID3タグが使える

しかし、調べたところ、mp4/m4a/aacでもID3タグが使えることが分かりました。

拡張子.m4aはAppleが使いだしたもので、MP4コンテナにAAC形式かAppleロスレス形式の音声データや楽曲情報(タグ)を入れたものです。本来のルールからすると拡張子.mp4にすべきものですが、iPod/iTunesの隆盛により今や一般化しています。
拡張子.aacのファイルは、AAC形式の音声データをコンテナなどに入れずに裸のままファイルにしたものです。楽曲情報(タグ)などが必要な場合はMP3と同じID3タグか、Monkey's Audioと同じAPEタグを付ける場合が多いようです。
AACの場合)音声データ形式は同じでもファイルの構造が異なりますので、拡張子だけを.m4a→.aacなどと書き換えてはいけません。.m4a→.mp4、.3gpならいずれもMP4コンテナなので大抵問題ありませんが。
音声ファイルとしての機能、性能面での優劣は殆どありませんが、iPod/iTunesのおかげで.m4aは現在デファクト スタンダード的な地位にあり、.m4aの方が対応ソフトや機器が多いと思います。
拡張子.m4aと.aacは一緒ですか? - iTunesでAAC形式で取り込むと... - Yahoo!知恵袋

試してみた

で、FFmpegのオプションを変えて、上記の「実践ビジネス英語_2013_07_24」をm4aに変換した際のファイルサイズを比較してみました。
なお、maさんは「-id3v2_version 3」も置き換えるように書いておられましたが、これはID3v2タグのバージョン3を指定するものなので、削るとID3タグに問題が生じます。ので、これは必須とします。

-ab 64k ファイルサイズ
4.9MB
× 4.9MB
× 6.1MB
× × 7.3MB

★:-absf aac_adtstoasc -acodec copy *1

ということで「-absf aac_adtstoasc -acodec copy」オプションを付けるとファイルサイズが小さくなりました。そして「-ab 64k」なしのほうが若干音が細かく感じられました。
またm4aファイルなのでID3タグが使えています。

  Metadata:
    major_brand     : M4A 
    minor_version   : 512
    compatible_brands: isomiso2
    title           : 実践ビジネス英語_2013_07_24
    artist          : NHK
    album           : 実践ビジネス英語
    date            : 2013
    encoder         : Lavf54.63.104
    genre           : Speech
  Duration: 00:15:00.86, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 24000 Hz, stereo, fltp, 42 kb/s

結論

ので、mp3以外に、「-absf aac_adtstoasc -acodec copy」オプションを付けたm4aファイルを作れるオプションを備えるように、いずれgogakuondemand.rbをバージョンアップしようと思っています。(コレが書きたかったw)
→v3.4で対応しました(8/9)。

*1:オプションに「-acodec copy」のみを指定したら『malformated aac bitstream, use -absf aac_adtstoasc』と警告が出たので、このオプションは2つのセットにしました。