まずはIMA-ADPCM互換のデコーダ/エンコーダを作ってみますかね。かなり情報あるし。 FFMPEGで出力する方法は:
ffmpeg -i <input.wav> -f wav -acodec adpcm_ima_wav <output.wav>
Macで再生もできた。ほぼ1/4になる。理論的には1/4だけどwavに余計なチャンクが入っているから減っている?
ステレオ以上はどうなってるのか見ている。インターリーブしているようだ。
上記のサイト含めてフォーマットをまとめると( 全て リトルエンディアン)
名前 | サイズ[byte] | 内容 |
---|---|---|
RIFFチャンクID | 4 | 'R', 'I', 'F', 'F' |
RIFFチャンクサイズ | 4 | ファイルサイズ - 8(これ以降の残りファイルサイズ) |
ファイルフォーマットタイプ | 4 | 'W', 'A', 'V', 'E' |
FMTチャンクID | 4 | 'f', 'm', 't', ' ' |
FMTチャンクサイズ | 4 | これ以降のFMTフィールドのサイズ |
WAVEフォーマットタイプ | 2 | IMA-ADPCMなら17 |
チャンネル数 | 2 | IMA-ADPCMの場合は1(モノラル)か2(ステレオ)しかないっぽい |
サンプリングレート | 4 | |
データ速度(byte/sec) | 4 | = ブロックサイズ * サンプリングレート / ブロックあたりサンプル数 |
ブロックサイズ | 2 | ブロックのヘッダと圧縮済みデータを含めたサイズ |
サンプルあたりビット数 | 2 | IMA-ADPCMなら4のはず |
エキストラサイズ | 2 | これ以降に続く追加データサイズ |
ブロックあたりサンプル数 | 2 | |
FACTチャンクID | 4 | 'f', 'a', 'c', 't' |
FACTチャンクサイズ | 4 | これ以降のFACTチャンクサイズ |
サンプル数 | 4 | = DATAチャンクサイズ * ブロックあたりサンプル数 / ブロックサイズ |
DATAチャンクID | 4 | 'd', 'a', 't', 'a' |
DATAチャンクサイズ | 4 | これ以降のDATAチャンクサイズ |
圧縮済みデータ | ※ | ※ = DATAチャンクサイズ |