まずは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チャンクサイズ |