wavファイルのフォーマットを読み込む
http://d.hatena.ne.jp/shokai/20091028/1256680676 でファイルヘッダを読み込んだので、続けてフォーマットチャンク部分を読み込んだ。
readHeader.rb
#!/usr/bin/env ruby # -*- coding: utf-8 -*- if ARGV.size < 1 puts 'ruby readHeader.rb input.wav' exit 1 end File.open(ARGV.first){|file| file.binmode puts riff = file.read(4) data_size = file.read(4).unpack('V')[0] puts "#{data_size} (bytes)" puts wave = file.read(4) if riff != 'RIFF' or wave != 'WAVE' puts 'not wave file' exit 1 end while !file.eof? id = file.read(4) chunk_size = file.read(4).unpack('V')[0] puts "chunk id: #{id}, size: #{chunk_size}" if id == 'fmt ' format_id = file.read(2)[0].to_i puts "フォーマットID: #{format_id}" channel_num = file.read(2)[0] puts "チャンネル数: #{channel_num}" hz = file.read(4).unpack('V').join.to_i puts "サンプリングレート #{hz} (hz)" byte_per_sec = file.read(4).unpack('V').join.to_i puts "byte per sec #{byte_per_sec}" block_size = file.read(2)[0].to_i puts "ブロックサイズ #{block_size}" bit_per_sample = file.read(2)[0].to_i puts "bit per sample #{bit_per_sample}" else data = file.read(chunk_size) # 音が入っている部分 end end }
結果
RIFF 44951076 (bytes) WAVE chunk id: fmt , size: 16 フォーマットID: 1 チャンネル数: 2 サンプリングレート 44100 (hz) byte per sec 22050 ブロックサイズ 4 bit per sample 16 chunk id: data, size: 44951040