Perlでwavファイル連結

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