FDK-AACというライブラリも試してみました。
FreeBSDにパッケージがあるのでインストールしてみます。
このパッケージはみごとにライブラリだけなので、参照実装を探します。
ここのsrcにデコーダーのサンプルがあます。cmakeなので面倒なのでccを直接たたきました。
% cc -lfdk-aac -L/usr/local/lib -I/usr/local/include/fdk-aac aac-dec.c -o aac-dec
どっか適当なところからhlsのtsファイルを拾って変換してみます。
% ./aac-dec master48k_00977.aac test.raw
sampleRate:48000,bitRate:76687,frameSize:2048,channels:2
変換できました。WAVにしてきいてみます
% sox -t raw -e signed-integer -c 2 -b 16 -r 48000 test.raw -t wav test.wav
ちゃんと音になりました。めでたしめでたし。
FreeBSD/mips RT3883でも試してみました。
# date;./aac-dec sample4.aac /dev/null ;date
Thu Jan 1 09:06:23 JST 1970
sampleRate:44100,bitRate:107493,frameSize:1024,channels:2
Thu Jan 1 09:08:26 JST 1970
123秒でまずまずのようです。
aac-dec.cをstdoutにfwriteするようにして、
# ./aac-dec sample4.aac | play -t raw -e signed-integer -c 2 -b 16 -r 44100 -
で再生できました。
ところがHLSのtsファイルの圧縮は重いようで、正常に再生できません。fdk-aacはmipsのDSP(SIMD)命令を使ったコードがあるのですが、ライブラリがなくてビルドできません。
ライブラリのコードが見つかったので、DSP命令使うようにしてみました。
# date;./aac-dec sample4.aac >/dev/null;date
Thu Jan 1 11:25:53 JST 1970
Thu Jan 1 11:27:38 JST 1970
10%くらい削減できてるのですが、HLSのtsの圧縮にはちょっと厳しいです。
DSPでの最適化はfftのライブラリコードとgccのビルトインマクロで行われているのですが、ビルトインマクロは-mdspオプションで有効になるようです。
O3でビルドしてみました。
# date;./aac-dec sample4.aac >/dev/null;date
Thu Jan 1 09:03:24 JST 1970
Thu Jan 1 09:03:55 JST 1970
信じられないくらいきいています。なにか副作用がないといいのですが。
FDK-AACはライセンスが特殊なようですが、FreeBSDのpkgにもなってるので、普通に使っても問題なと思われますが、商用利用などの場合は確認してください。