sox(sourceforge.net)のMP3エンコーダ(lameのライブラリを使う)にはロクなオプションを渡せない。sox自体のオプションに、エンコーダに特有なオプションというのが与えられないからだ。
これは困った。クオリティやビットレート、VBRの有無など設定すべき項目はたくさんあるのに。…というわけで本来ならsoxのオプションにエンコーダへのオプションという項目を加えるのが正しいと思うが、しょうがないので環境変数LAMEOPTで渡すように書き加えてみた。
しかもこの追加部分、きったない書き方になった!! 解決方法も邪道、書き方も邪道。ま、動作してるからいいか、と納得するのがイヤだがここは自分の顔を立てて使っていくしかない(笑)。
で、なんでこういうことを思ったのかというと、どういう制約かなんかしらないけど、16bit stereo 44.1kHzで録音していると、3時間半くらいで切れてしまうのだ。ちょうど2GBの地点である。そんなバカな。
# rec -r 44100 -c 2 -s w -d /dev/dsp -t wav - | lame -h - out.mp3
で、それってどうよ、と思って試みに直に出してみたら4時間以上全く問題なかった。
# rec -r 44100 -c 2 -s w -d /dev/dsp -t mp3 out.mp3
soxやlameの問題じゃないっぽいね。どちらも_FILE_OFFSET_BITS=64
でコンパイルされてるし。wavファイルのファイル形式の制約かもしれない。というわけで「-h」(-q 2と同じ)を与える必要があったのだ。あとはデフォルトでも当面は問題ない。
MP3にはこういう問題はないのかな。120kbpsで2GBっつーと…40時間くらいかな。さすがにそこまで録音する根性はない(人間側の問題で)。
(追記) 2003-11-12 18:38
あ、そうだ、soxのライブラリをPythonで使えるようにしようかなー。と思ってswigを使ってやってみた。いくつかシンボルが足りなかった。
%{
#include
void cleanup(void){}
%}
%include
特に、gsm_createがひどくて、soxソース/gsm/libgsm.aにあるんだけどこれは普通インストールされないんだよね。しょうがないから強引にやった。
# gcc -c sox_wrap.c -I/usr/include/python2.2 -I/usr/include/sox
# gcc -shared sox_wrap.o -lmp3lame -lmad -lvorbis -logg -lvorbisfile \
-lvorbisenc -lm -lst -L/some/path/to/sox/source/gsm -lgsm -o _sox.so
# python
> import sox
> sox.st_version()
‘Version 12.17.4’
はいはい。libstの詳しい使い方はまだ知らん。
(追記) 2003-11-15 20:45
中途半端だがsox-12.17.4-lameopt.patchにリンクしておこうっと。