waveを連結するコマンドラインツールないかなというエントリで,コマンドラインツールでのwaveファイルの連結を考えてた.
そうすると#dameTunesでヘッダ除去すればいいんじゃね?という話が出てた.ほほう.そういう観点でCPANうろついてみると,Audio::Wavがかなり怪しいぞ.眺めてみると,ヘッダを取り除いたwavファイルのrawデータを取り出せそう.で,ためしにコード書いてみたらあっさり動いてしまった.
wavconcatという名前で以下のスクリプト保存したと仮定すると,次のようなノリで使える.
$ wavconcat infile1.wav infile2.wav outfile.wav
そうそう,まさにこういうの欲しかったのよ.そしてソース.
#!/usr/bin/perl -w use strict; use Audio::Wav; if (@ARGV < 3) { die "usage: $0 infile1.wav infile2.wav outfile.wav\n"; } my $outfile = pop @ARGV; my @infiles = @ARGV; # 出力ファイルの設定 # 入力ファイルによってはこれだと良くないかも my $sample_rate = 44100; my $bits_sample = 16; my $details = { bits_sample => $bits_sample, sample_rate => $sample_rate, channels => 2, }; my $wav = new Audio::Wav; # 読み込みwavファイルのrawデータ取得 my @raws; for my $file (@infiles) { my $read = $wav->read($file); my $raw = $read->read_raw($read->length); push @raws, $raw; } # 順番に書き込む my $write = $wav->write($outfile , $details); for my $raw (@raws) { $write->write_raw($raw); } $write->finish();
とりあえずうちが欲しかった機能はこれで満足してる.コメントにも書いたけど,きっと入力wavファイル間でサンプルレート等が違ってたりするとうまく行かないんだろうなー,たぶん.