Ruby操作バイナリファイル、wavとpcmファイル変換

6905 ワード

背景と機能紹介
          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)

に付随
  • rubyのArrayには、指定された数の配列の内容をランダムに選択し、繰り返さないsampleメソッドがあります.
  • 初めてmarkdownで書いて、使いにくい感じ(プレビューが正常で最後に表示が正常ではありません)