2006年11月29日水曜日

[Perl] wav を mp3 に変換する

音声ファイルっていじったこと無かったのですが、機会があったので試してみました。

環境
CentOS4.4 on VMware

用意するもの
LAME v3.97
Audio::ConvTools
String::ShellQuote

LAME インストール
$ tar zxvf lame-3.97.tar.gz
$ cd lame-3.97
$ ./configure
$ make
$ make install
$ ll /usr/local/bin/
-rwxr-xr-x 1 root root 421267 11月 28 23:05 lame*

Audio::ConvTools, String::ShellQuote インストール
$ perl -MCPAN -e shell
cpan> install Audio::ConvTools

サンプルプログラム
$ vi wav2mp3.pl
use Audio::ConvTools;
$status = wav2mp3('gotmail.wav', 'gotmail.mp3');
print "$status\n";
$ ll
-rw-r----- 1 root root 92 11月 28 23:08 wav2mp3.pl
-rw-r----- 1 root root 9946 11月 28 23:08 gotmail.wav

サンプルプログラム実行
$ perl wav2mp3.pl
LAME 3.97 32bits (http://www.mp3dev.org/)
Resampling: input 11 kHz output 11.025 kHz
Using polyphase lowpass filter, transition band: 5379 Hz - 5512 Hz
Encoding gotmail.wav to gotmail.mp3
Encoding as 11.025 kHz 16 kbps single-ch MPEG-2.5 Layer III (11x) qval=2
Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
0/ ( 0%)| 0:00/ : | 0:00/ : | x| :
0/19 ( 0%)| 0:00/ 0:00| 0:00/ 0:00| 0.0000x| 0:00 ----------------------------$
21/21 (100%)| 0:00/ 0:00| 0:00/ 0:00| 109.71x| 0:00 ----------------------------$
--------------------------------------------------------------------------------------------------------$
<3>>bps % %$<3>
kbps mono % long switch short %$<3>
16.0 100.0 38.1 38.1 23.8$<3>
ReplayGain: -6.1dB
1
$ ll
-rw-r----- 1 root root 92 11月 28 23:08 wav2mp3.pl
-rw-r----- 1 root root 9946 11月 28 23:08 gotmail.wav
-rw-r--r-- 1 root root 2194 11月 28 23:09 gotmail.mp3

出来上がった mp3 聴いてみても全く違和感ない。
LAME (レイム)とは
LAMEは複数あるMP3エンコーダの中でも特に優秀とされ、他のエンコーダよりも品質のよいMP3ファイルを作ることができるため、広く使われている。さらに、MP3エンコーダの中で(本当の意味で完全ではないが)ギャップレスを実現しているのはLAMEだけである。
また、オープンソースコミュニティによって作られているLAMEは、使用に際してライセンス料を必要としないことも特徴の一つである。

なるほど。
で、Audio::ConvTools の ConvTools.pm を見てみると system で lame コマンドを実行してようだ。
sub wav2mp3($;$)
{
my $inFile = shift;
my $outFile = shift;
my $status;
($inFile =~ /^(.*)\.[Ww][Aa][Vv]$/) or do {
errMsg("$inFile is not an wav file");
return 0;
};
$outFile = "$1.mp3" unless defined $outFile;
$status = system(
"lame -h " . shell_quote($inFile) . " " . shell_quote($outFile)
);
return ($status==0);
}

-h が埋め込まれているので、もっと高音質にしたいとかで lame のコマンドオプションを変更したい場合は、これに手を入れる必要がある。
LAME3.95.1コマンドラインオプション


0 件のコメント: