Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2010-09-17

radikoのflvから取り出したAACはなぜiTunesで読めないのか?

  • http://radiko.jp/ は既存のラジオ放送をWebで同時配信(サイマル放送)してくれている。
  • その番組をradikoroを使って録音すると、20100905220904.flvのようなフラッシュビデオ形式のファイルとして保存される。
  • 保存されたファイルは、大体1時間番組で20MBくらいのサイズ。
  • flvではiTunes・iPodが再生してくれないので、radikoroの録音設定でmp3に変換するようにしている。
  • ところが、変換後のmp3は50MBくらいのサイズになってしまう。およそ2.5倍に膨れ上がっているのだ。
  • 今時のハードディスクは、テラバイトが標準になりつつあるので大した問題はない。でも、気分が良くない。
  • 調べてみるとradikoの音声は、HE-AAC 48kbpsのステレオ品質*1らしい。(着うたフルと同等レベル)
  • 上記のHE-AACは、flvというコンテナ*2に収められて、配信されているのだ。
  • そしてHE-AACは、flvの中からそっくりそのまま取り出すことができるらしい。
  • 早速ffmpegコマンドを利用して取り出してみた。
ffmpeg -i 20100905220904.flv -acodec copy 20100905220904.m4a
  • 呆気なく.flvが.m4aに変換されてしまった。
  • 実際には取り出しているだけなので、変換ではない。
  • 出てきた.m4aは.flvと遜色なく、劣化は全くないはず。
  • すんなりこれで解決かと思いきや、問題はそんなに簡単ではなかった。
  • 取り出された20100905220904.m4aを再生しようとしてみるが...
  • iTunes・QuickTime Player・Quicklook等のQuickTime系ソフトウェアでは再生できなかったのだ。
  • 一方、VLCMPlayerではちゃんと再生できた。
  • 考えてみれば、flvの時からQuickTime系では再生できなかった。
  • Perianをインストールしているので、基本的にflvは再生できるはずなのに。
  • HE-AACはQuickTime系では再生できないエンコード形式なのだろうか?いや、そんなことはない。
  • iTunesの読み込み設定...でカスタムを見ると、「High Efficiencyエンコーディング(HE)を使用」を設定できるようになっている。

f:id:zariganitosh:20100917050912p:image

プロファイル

  • iTunesをはじめとするQuickTime系がサポートしているのは、LC(Low Complexity)プロファイル。
  • 一方のradikoのAACは、MAINプロファイルなのであった。
  • プロファイルが違うと、同じAACでも再生できないのだ...。
  • LC(Low Complexity)とMAINプロファイルの違いは、AACエンコードをどこまで厳密に処理するかの違いのようだ。
    • MAINは、厳密に処理するので圧縮率は高くなるが、メモリーやCPUパワーが必要になる。
    • LC(Low Complexity)は、処理を簡略化し、メモリーやCPUパワーをあまり必要としない。

種類

つまり、AACには3つのプロファイルがある。

  • MAIN
    • エンコード処理を厳密に実行する。(圧縮率は良いが高負荷)
  • LC(Low Complexity)
    • エンコード処理を簡略化して実行する。(低負荷)
  • SSR(Scalable Sampling Rate)

さらに、上記AACに以下の技術を適用してエンコードしている場合がある。

  • SBR(Spectral Band Replication:スペクトル帯域複製)*3
  • SBRを適用したAACのことを「HE-AAC*4」あるいは「aacPlus*5」と呼ばれる。

さらに、さらに、上記HE-AACに以下の技術を適用してエンコードしている場合がある。


  • iTunesが再生できるのは、LC(Low Complexity)プロファイルなHE-AACのみ。(HE-AAC v2はNG)
  • HE-AACなどの技術は、低ビットレートな環境で高品質を狙ったもの。
  • 最高品質を狙うのであれば、AAC最高の320Kbpsに設定するのがベスト。(但し、ファイルサイズはでかくなる)
  • ファイルサイズは、ビットレート・サンプルレートに比例する。(例:ビットレートが48Kから96Kになれば、ファイルサイズも2倍になる)

さらに、さらに、さらに...

  • 槻ノ木隆の「BBっとWORDS」(感謝です!)
    • LTP(Long Term Prediction) というプロファイルもある。(MAINプロファイルに前方予測を追加したもの)
    • AAC-LD(Low Delay)という技術もある。(エンコード時間を大幅に短縮して、双方向通信で違和感なく会話できる)
    • MPEG-4 SLS(Scalable to Lossless)・MPEG-4 ALS(Audio Lossless Coding)という技術もある。(可逆圧縮なAAC?)

AACもまた奥が深い...。

変換(MAINプロファイルHE-AAC → LCプロファイルHE-AAC)

  • メインプロファイルからLC(Low Complexity)プロファイルのAACにするには、再エンコードするしかなさそう。
  • 素人目には同じAACなのだから、劣化なしのプロファイル変換を期待してしまうのだが、それは無理なようだ。

  • まず、試しにffmpegでビットレートを48kbpsのAACに設定して変換してみた。
ffmpeg -i 20100905220904.flv -ab 48k 20100905220904_ffmpeg_48k.m4a 
  • 変換された20100905220904_ffmpeg_48k.m4aを聴いてみると、何だか少しこもった感じの音。(高音域がなくなってしまったような印象)
  • しかも、ファイルサイズは増えて381KB→512KB。ファイルサイズからビットレートを予測すると64Kbpsでエンコードされている模様。
  • ffmpegが出力する情報を見ても64Kbps前後でエンコードされているようだ。
  • 調べてみると、MacPortでインストールしたffmpegにHE-AACエンコードの機能はない様子。
  • 通常のAACのビットレートは64〜320kbpsが有効範囲。
  • おそらく、48Kbpsを指定しても、ffmpegが有効範囲最低の64Kbpsに補正してしまうのだ。

  • そこで、一旦劣化なしのaiffに変換してみた。
ffmpeg -i 20100905220904.flv 20100905220904.aiff
  • 20100905220904.aiffファイルサイズは約30倍になり、馬鹿でかくなった...。
  • 20100905220904.aiffをiTunesに読み込む。
  • iTunes >> 環境設定... >> 一般 >> 読み込み設定... で、
    • 読み込み方法:AAC エンコーダを指定して、
    • 設定:カスタム...を以下のように設定した。

f:id:zariganitosh:20100917050912p:image

  • この設定で、ライブラリ >> ミュージックの20100905220904を右クリック、AACバージョンを作成 を実行すると、
  • HE-AACバージョンの20100905220904が追加された!
  • 音質を確認すると、radikoのflvと区別できないレベル。問題なし。
  • ファイルサイズを確認すると、365KB。元ファイルとほぼ同じサイズ。
  • 不要なaiffバージョンを削除して、変換作業完了。

AppleScriptで変換

  • 毎回ターミナルでffmpegを実行して、iTunesに読み込ませて、右クリックしてAACバージョンを作成では、いかにも面倒。
  • お決まりのAppleScriptで、一連の作業を処理するようにしてみた。

 property ffmpeg_path : "/opt/local/bin/ffmpeg"
 property tmp_path : "/tmp/_flv_to_itunes/"
 
 try
   do shell script "mkdir " & tmp_path
 end try
 
 tell application "Finder"
   set select_list to selection
 end tell
 
 repeat with f in select_list
   set file_path to (f as text)'s POSIX path
   set file_name to do shell script "n=" & file_path's quoted form & ";echo \"${n##*/}\""
   set fn_no_ext to do shell script "n=" & file_name's quoted form & ";echo \"${n%.*}\""
   set aiff_path to tmp_path & fn_no_ext & ".aiff"
   set convert_path to POSIX file aiff_path
   do shell script ffmpeg_path & " -y -i " & file_path's quoted form & " " & aiff_path's quoted form
   tell application "iTunes" to convert convert_path
   do shell script "rm " & aiff_path's quoted form
 end repeat

  • ~/Library/Scripts/以下に保存して、スクリプトメニューから実行すると良さそう。
  • Finderでflvファイルを選択(複数選択OK)して実行すると、iTunesに登録される。
  • flvかどうかのチェックはしていないので、ffmpegがaiffに変換できるファイルなら、何でもiTunesに登録してしまう。

afconvertでHE-AAC変換

  • 上記までのAACバージョンの作成は、iTunes >> 環境設定... >> 一般 >> 読み込み設定... に依存する。
  • もし設定がMP3 エンコーダになっていると、MP3バージョンが作成されてしまうのだ。
  • 例:20100905220904.aiffを、ファイル名20100905220904.m4a、ビットレート128Kbps、のAACに変換する。
afconvert -f m4af -d aac -b 128000 20100905220904.aiff
  • 入力ファイル名だけ指定して、出力ファイル名を省略すると、入力ファイル名の拡張子だけ変更したファイルになる。
  • オプション指定できるデータフォーマットはafconvert -hfで確認できる。
$ afconvert -hf
Audio file and data formats:
    '3gpp' = 3GP Audio (.3gp)
               data_formats: 'aac ' 'samr' 
    '3gp2' = 3GPP-2 Audio (.3g2)
               data_formats: 'aac ' 'samr' 
    'adts' = AAC ADTS (.aac, .adts)
               data_formats: 'aac ' 'aach' 
    'ac-3' = AC3 (.ac3)
               data_formats: 'ac-3' 
    'AIFC' = AIFC (.aifc, .aiff, .aif)
               data_formats: I8 BEI16 BEI24 BEI32 BEF32 BEF64 UI8 'ulaw' 
                             'alaw' 'MAC3' 'MAC6' 'ima4' 'QDMC' 'QDM2' 
                             'Qclp' 'agsm' 
    'AIFF' = AIFF (.aiff, .aif)
               data_formats: I8 BEI16 BEI24 BEI32 
    'amrf' = AMR (.amr)
               data_formats: 'samr' 
    'caff' = Apple CAF (.caf)
               data_formats: '.mp1' '.mp2' '.mp3' 'QDM2' 'QDMC' 'Qclp' 
                             'Qclq' 'aac ' 'aach' 'aacl' 'alac' 'alaw' 
                             'dvi8' 'ilbc' 'ima4' I8 BEI16 BEI24 BEI32 
                             BEF32 BEF64 LEI16 LEI24 LEI32 LEF32 LEF64 
                             'ms\x00\x02' 'ms\x00\x11' 'ms\x001' 'samr' 
                             'ulaw' 
    'm4af' = Apple MPEG-4 Audio (.m4a)
               data_formats: 'aac ' 'aach' 'aacl' 'alac' 
    'MPG1' = MPEG Layer 1 (.mp1, .mpeg, .mpa)
               data_formats: '.mp1' 
    'MPG2' = MPEG Layer 2 (.mp2, .mpeg, .mpa)
               data_formats: '.mp2' 
    'MPG3' = MPEG Layer 3 (.mp3, .mpeg, .mpa)
               data_formats: '.mp3' 
    'mp4f' = MPEG-4 Audio (.mp4)
               data_formats: 'aac ' 'aach' 'aacl' 
    'NeXT' = NeXT/Sun (.snd, .au)
               data_formats: I8 BEI16 BEI24 BEI32 BEF32 BEF64 'ulaw' 
    'Sd2f' = Sound Designer II (.sd2)
               data_formats: I8 BEI16 BEI24 BEI32 
    'WAVE' = WAVE (.wav)
               data_formats: UI8 LEI16 LEI24 LEI32 LEF32 LEF64 'ulaw' 
                             'alaw' 
  • 目指すフォーマットは「 'm4af' = Apple MPEG-4 Audio (.m4a)」と思われる。(拡張子が.m4aなので)
  • そのデータフォーマットには'aac ' 'aach' 'aacl' 'alac' の4つが指定できるようになっている。
  • aacはiTunes標準のAACだと思うが、その他のフォーマットが略語で自分にはチンプンカンプン。
  • 調べるのは面倒なので、それぞれ実際にエンコードしてみることに。
  • それぞれのデータフォーマットにビットレートの制限があるらしく、範囲外だとエラーが発生した。
  • 適当に変更しながら、実行してみた。
$ afconvert -f m4af -d aac -b 128000 20100905220904.aiff
$ afconvert -f m4af -d aach -b 128000 20100905220904.aiff
Error: Couldn't set audio converter property ('!dat')
$ afconvert -f m4af -d aach -b 48000 20100905220904.aiff
$ afconvert -f m4af -d aacl -b 48000 20100905220904.aiff
Error: Couldn't set audio converter property ('!dat')
$ afconvert -f m4af -d aacl -b 128000 20100905220904.aiff
$ afconvert -f m4af -d alac -b 128000 20100905220904.aiff
Error: Couldn't set audio converter property ('who?')
$ afconvert -f m4af -d alac -b 48000 20100905220904.aiff
Error: Couldn't set audio converter property ('who?')
$ afconvert -f m4af -d alac 20100905220904.aiff
  • 出来上がったファイルをFinderの情報を見るで確認してみると...
aac

f:id:zariganitosh:20100917143431p:image

aach

f:id:zariganitosh:20100917143432p:image

aacl

f:id:zariganitosh:20100917143433p:image

alac

f:id:zariganitosh:20100917143434p:image

なるほど!

  • 目指すデータフォーマットはaachだ!(HE-AAC)
  • MPEG4 Low Delay AAC = エンコード時間を大幅に短縮して、双方向通信で違和感なく会話できる。(上記で「種類」見出しの さらに、さらに、さらにで調べたもの)
  • Apple Lossless = 劣化なしの可逆圧縮だけど、aiffの半分くらいになる。これもAAC派生の技術だったとは...。iTunesではApple Losslessエンコーダとして独立している。

  • つまり、以下のコマンドでradiko品質のHE-AACが生成されるのだ!iTunesの設定に依存することなく!
afconvert -f m4af -d aach -b 48000 20100905220904.aiff

  • アップルスクリプトにまとめてみた。

 property ffmpeg_path : "/opt/local/bin/ffmpeg"
 property afconvert_path : "/usr/bin/afconvert"
 property tmp_path : "/tmp/_flv_to_itunes/"
 
 try
   do shell script "mkdir " & tmp_path
 end try
 
 tell application "Finder"
   set select_list to selection
 end tell
 
 repeat with f in select_list
   set file_path to (f as text)'s POSIX path
   set file_name to do shell script "n=" & file_path's quoted form & ";echo \"${n##*/}\""
   set fn_no_ext to do shell script "n=" & file_name's quoted form & ";echo \"${n%.*}\""
   set aiff_path to tmp_path & fn_no_ext & ".aiff"
   set m4a_path to tmp_path & fn_no_ext & ".m4a"
   set convert_path to POSIX file m4a_path
   do shell script ffmpeg_path & " -y -i " & file_path's quoted form & " " & aiff_path's quoted form
   do shell script afconvert_path & " -f m4af -d aach -b 48000 " & aiff_path's quoted form & " " & m4a_path's quoted form
   tell application "iTunes" to add convert_path
   do shell script "rm " & aiff_path's quoted form
   do shell script "rm " & m4a_path's quoted form
 end repeat

  • 実行してみると、自分のMacBook環境で1時間のラジオ番組をiTunesに追加するのに2分くらい、ffmpegとafconvertが頑張っている。
  • 既に同じファイル名がミュージックライブラリに存在する場合は、追加されない。(エンコード作業だけは実行されるが)

以上で、radikoのflvとほぼ同じ品質のHE-AACをiTunesに保存できるようになった!

*1HE-AAC = High-Efficiency Advanced Audio Coding

*2:入れ物、エンコードデータを収める規格

*3:スウェーデンのCoding Technologiesが開発

*4:HE(High Efficiency)-AAC

*5:Coding Technologiesの商標なので、HE-AACが一般的

MacFeeling SoftwareMacFeeling Software 2011/02/27 19:38 radikoro 2.1.1の同梱ソフトをaac変換に対応する際に、この記事を参考にさせていただきました。
この記事がなければ対応は難しかったと思います。

ありがとうございました。

zariganitoshzariganitosh 2011/02/28 17:55 こちらこそ、radikoroをたいへん便利に使わせて貰ってます!
そのradikoro同梱ソフトのお役に立てたそうで、とっても光栄です。
嬉しいコメントありがとうございました。

MacFeeling SoftwareMacFeeling Software 2011/03/03 13:58 参考にしてばかりで申し訳ないのですが、
教えていただきたいことがあります。

radikoro を利用している方から、10.5で aac 変換が出来ないとの連絡を受けて
テスト(10.5.8)をしてみたところ、

ターミナルで

fconvert -f m4af -d aach -b 48000 .....aiff

を試してみると

Error: ExtAudioFileSetProperty ('cfmt') failed ('fmt?')

というエラーが表示されてしまいます。

なにが原因なのか、おわかりになりますでしょうか?

ちなみに aac、aacl だと OK でした。

zariganitoshzariganitosh 2011/03/04 22:04 Core AudioでHE-AACがサポートされたのはOSX 10.6からで、OSX 10.5ではafconvertで aach を指定できないようですね。
この問題を解決するには、自分の頭ではOSX 10.6にバージョンアップして頂くことくらいしか思いつきません...。
(afconvert以外で、HE-AACに変換してくれるコマンドがあればいいんですが)

zariganitoshzariganitosh 2011/03/05 07:19 OSX 10.4以降で動作可能なエンコーダーがありました!
http://tmkk.pv.land.to/xld/

MacFeeling SoftwareMacFeeling Software 2011/03/10 14:16 聞きっぱなしで、返事を書き込まなくてすみません。

10.6からだったのですね...
せっかく純正の機能だったのに、残念です。
とりあえず10.5の時は"aac "にして暫定的に対応してみました。

MacPortsのインストールだけでも面倒だと言われていますので、
本当はMacPortsでインストールできるもので、すべて済んでしまえば
楽なのですが...

ありがとうございました。

sinnitisinniti 2015/09/30 15:34 MPX7のグラバーを使い、radikoを録音したのですが、FLVファイルを変換してもダウンロードフォルダ内に変換したファイルが見当たらず、iTunesに取り込めません。
変換したFLVファイルの保存場所はどこでしょうか。

zariganitoshzariganitosh 2015/10/01 08:11 この日記に掲載しているAppleScriptは、Finderで選択したファイルを.m4aに変換して、iTunesに取り込むまでの処理をしています。
iTunesのライブラリに取り込まれていないでしょうか?
ちなみに、変換した.m4aファイルは一時的に/tmp/_flv_to_itunes/以下に保存しますが、iTunesに取り込み後、すぐに削除しています。
残したい場合は、末尾から2行目の以下の行をコメントアウトしてみてください。

--do shell script "rm " & m4a_path's quoted form

windsweptwindswept 2016/08/31 01:08 インターネットラジオで録音したAAC(たぶんHE-AAC)配信の.aacファイルが、
・関連付けされているmp-hc(*)では再生不可(「ファイルの描画に失敗しました」)
*正確には、アイコンこそmp-hcのものになっている(おそらく、.mp4は明示的にmp-hcに関連付けしているせい)が、MPEG4 Audio(m4a m4b m4r aac) Quicktime欄はグレーのチェック
(付けたり外したりしてたらもう元には戻せず黒チェックに)
・.aac→.m4a変換、また単純に拡張子を.m4a書き換えでも同様
・なのに、WMPではどちらも普通に再生可
・にもかかわらず、mp-hcの関連付けを外し(→WMPのアイコンに変わる)WMPで再生しようとすると、まさかの再生不可
・ダメもとで単純に拡張子を.mp4に書き換えると、初めてmp-hc/WMPとも再生可に!
という怪現象(?)が、やっとすっきりしました。ありがとうございます。
…"まさかの再生不可"は厳密には解決してませんが想像はできるので、心臓に良くないし突き詰めるのは止めました。。

参考
・再生成功時はWMP/mp-hcともすべてLAV Splitter+ffdshow audio
・ネットラジオ再生/録音はstreamwriter
・ひょっとするといちばん重要かもしれないxpsp2...

全然macじゃない話ですみません…

windsweptwindswept 2016/08/31 01:14 一点書き添え
・mp-hcは単独でなくK-Lite付属のもの

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/zariganitosh/20100917/radiko_flv_he_aac_itunes
リンク元