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ファイル間でサンプルレート等が違ってたりするとうまく行かないんだろうなー,たぶん.