Ruby操作バイナリファイル、wavとpcmファイル変換
6905 ワード
背景と機能紹介
に付随 rubyのArrayには、指定された数の配列の内容をランダムに選択し、繰り返さないsampleメソッドがあります. 初めてmarkdownで書いて、使いにくい感じ(プレビューが正常で最後に表示が正常ではありません)
wav pcm , pcm wav 。 C , C 。
wav ruby , ruby ( Array#pack ), 。
, :
# -*- coding:utf-8 -*-
# http://blog.csdn.net/zhihu008/article/details/7854529
# C http://blog.csdn.net/gavinr/article/details/6957136
# ruby pack http://blog.csdn.net/dazhi_100/article/details/11787177
class WAV_aux
def initialize(channels = 1,bits = 16,sample_rate = 8000)
@channels=channels
@bits=bits
@sample_rate=sample_rate; #
end
def seg_wav(f_wav_name,f_pcm_name,bg,ed)
#
mul=@sample_rate/1000
mul*=2 # 2
File.open f_pcm_name,"wb" do |w|
File.open f_wav_name,"rb" do |f|
f.seek( 44 + bg*mul)
w.syswrite( f.sysread( (ed-bg+1)*mul ) )
end
end
end
def add_pcm_head(f_wav_name,f_pcm_name)
pcmHEADER=Array.new(3)
pcmFMT=Array.new(8)
pcmDATA=Array.new(2)
pcmHEADER[0]="RIFF"
pcmHEADER[1]=44 # +pcm
pcmHEADER[2]="WAVE"
pcmFMT[0]="fmt "
pcmFMT[1]=[16].pack("L")
pcmFMT[2]=[1].pack("S")
pcmFMT[3]=[@channels].pack("S")
pcmFMT[4]=[@sample_rate].pack("L")
pcmFMT[5]=[@sample_rate * 2 ].pack("L") # 2 2
pcmFMT[6]=[2].pack("S")
pcmFMT[7]=[@bits].pack("S")
pcmDATA[0]="data"
pcmDATA[1]=0
data=""
File.open f_pcm_name,"rb" do |f|
pcmDATA[1]=f.size
data=f.sysread(pcmDATA[1])
end
pcmHEADER[1]+=pcmDATA[1]
pcmHEADER[1]=[pcmHEADER[1]].pack("L")
pcmDATA[1]=[pcmDATA[1]].pack("L")
File.open f_wav_name,"wb+" do |w|
pcmHEADER.each do |x|
w.syswrite(x)
end
pcmFMT.each do |x|
w.syswrite(x)
end
pcmDATA.each do |x|
w.syswrite(x)
end
w.syswrite(data)
end
#w.syswrite( "RIFF" )
#p [1000].pack("L") # , \x
#w.seek( 4 , IO::SEEK_CUR) #
#w.syswrite( [10,22].pack("LC") )
#w.syswrite( [1000].pack("L") )
end #add_pcm_head
end #Class
para=["28919.wav","lx.pcm",2000,20000]
wav_aux=WAV_aux.new
#wav_aux.seg_wav(*para)
para=["lx.wav","lx.pcm"]
wav_aux.add_pcm_head(*para)
に付随