2010年8月27日金曜日

オーディオフォーマット変換 afconvert

先日 MP3から AIFFへの変換に iTunesを使う方法を紹介したが、MacOSX にはオーディオフォーマットを変換できる afconvert というツールが標準で付属していることがブログのコメントへの書き込みで知った(335gさん情報どうも)。
Cocoaの日々: 効果音販売サイトの紹介と iTunesを使ったMP3からAIFFへの変換方法

調べてみるとなかなか使えそうなツールのようだ。以下、参考になったサイト。

[iPhone] オーディオファイルのフォーマット変換方法 | Sun Limited Mt.

Mac OS Xはコマンドも充実--「afconvert」でオーディオフォーマットを変換 - builder by ZDNet Japan

Happy Happy iPhone Game Programming : .WAVファイルを.CAFファイルにコンバート

.wavファイルをまとめてIMA4圧縮の.cafファイルに変換 - iPhoneアプリ開発ブログ

試してみた。


afconvert


利用例
$ afconvert -f caff -d ima4 -d LEI16@22050 input.mp3 output.caf

-h で使い方、 -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' 


変換結果


手元にあった 1秒のMP3形式の効果音ファイルを CAF, AIFF へ変換してみた。
508  afconvert -f caff -d ima4 -d LEI16@22050 -c 1-o pin1.caf pin.mp3
$ afconvert -f caff -d ima4 -d LEI16 MP3_original.mp3 CAFF_LE16.caf
$ afconvert -f caff -d ima4 -d LEI16@22050 MP3_original.mp3 CAFF_LE16.caf
$ afconvert -f AIFF -d BEI16 MP3_original.mp3 AIFF_BEI16.aif

AIFF はWikipediaによればビッグエンディアン固定のようなので "-f AIFF -d LEI16" と指定するとエラーとなる。
$ afconvert -f AIFF -d LEI16 MP3_original.mp3 AIFF_LEI16.aif
Error: ExtAudioFileCreateWithURL failed ('fmt?')

ファイルサイズは次の通り。

AIFF_BEI16.aif       167,868
AIFF_BEI16@22050.aif  85,984
CAFF_LEI16.caf       167,868
CAFF_LEI16@22050.caf  85,984
AIFF_itunes.aif      159,206
MP3_original.mp3      22,569

MP3_original.mp3 が変換元、AIFF_itunes.aif はiTunes10で変換したもの。面白いことに AIFF も CAFF もサイズは同じとなった。また当然ながらビットレートを制限 (22KHz)に制限した邦画サイズが小さくなる(44KHzの半分なので、サイズも約半分)。


サンプル


これらの音をサンプルを作って実機で鳴らしてみた(iPhone3GS/iOS4.01)

使用した効果音は下記から拝借した。
▼こだま標準効果音ライブラリ(β) |株式会社こだまプロダクション
(このサイトでは数多くの音源を紹介していて「無料のコンテンツへの利用、かつ個人でのご利用」であれば条件付きで無料となる。商用利用向けのライセンスもありそんなに高くない)

結果:
・どれも音の違いは感じられなかった。=> 22KHzでも十分なのでサイズを気にする場合はレートを低くする
・MP3 は実機では再生できなかった。シミュレータでは鳴る(これはネットで出回っていた情報の通り)。
・AIFF=ビッグエンディアンでも再生ができた(ネット上ではリトルエンディアンで無いと駄目みたいな情報もあった)


サンプルのソースコードは GitHub からどうぞ:
SoundSamples at 2010-08-27 from xcatsan's iOS-Sample-Code - GitHub


AIFF vs CAF


AIFF(Audio Interchange File Format) は Wikipedia によれば、
AIFF (Audio Interchange File Format、読みは後述) は、アップルコンピュータにより開発された音声データのファイルフォーマットである。主としてMacintoshやAmiga上で使われるファイル形式である。
とあった。通常は非圧縮でビッグエンディアン。

AIFF - Wikipedia


一方、CAF(Core Audio Format) とは Core Audio APIs でサポートされるファイルフォーマットのようだ。
Apple Core Audio Format Specification 1.0: CAF File Overview

上記情報によれば次の特徴がある。

  • サイズの制約なし(数百年分保持できる!?)
  • ヘッダのファイナライズが不要(音データの追記が可能)
  • 多くのでデータフォーマットに対応
  • 多くの補助データ(メタデータ / auxiliary data)に対応(annotations, markers, channel layouts, ...)

この CAF はコンテナとも言うべき存在で、中身のデータ形式(データフォーマット・圧縮方式など)は様々なものに対応している。

Core Audio Overview: Supported Audio File and Data Formats in Mac OS X

上記ページから抜粋:
'.mp3', 'MAC3', 'MAC6', 'QDM2', 'QDMC', 'Qclp', 'Qclq', 'aac ', 'agsm', 'alac', 'alaw', 'drms', 'dvi ', 'ima4', 'lpc ', BEI8, BEI16, BEI24, BEI32, BEF32, BEF64, LEI16, LEI24, LEI32, LEF32, LEF64, 'ms\x00\x02', 'ms\x00\x11', 'ms\x001', 'ms\x00U', 'ms \x00', 'samr', 'ulaw'


CAF は iPhoneの場合、電話着信音のフォーマットとしても利用されている。

iOS で効果音を鳴らす場合は、AIFF と CAF のどちらを使うべきか?ネットを探したところフォーマットの違いはわかったものの、使い分けの指針らしきものは見つけられなかった(知っている方がいたら是非情報を教えて下さい)。


その他


フリーの効果音サイト(らしい)。
"The Freesound Project"
freesound :: home page

1 件のコメント:

  1. 参考になりました。どうもありがとうございます。
    AIFFはビッグエンディアンですので、リトルエンディアンのCAFの方がiOSでは推奨されています。
    CAFはAppleの独自フォーマットですので、Apple製以外の機器との受け渡しは問題が生じるかもしれません。
    MacやiOSで使用する分には、CAFで良いと思います。

    返信削除