wav文件音頻頭的研究

 


分類: 音頻處理 2011-03-21 17:55  473人閱讀  評論(0)  收藏  舉報

 

首先,下面這個博客中對wav音頻頭的結構作了一個介紹,能夠去參考下。 html

http://blog.csdn.net/yzhouen/archive/2006/06/07/777459.aspx 函數

 

 

音頻頭中是一個一個的標識,表明這個音頻文件的一些配置參數。那當要播放這個音頻的時候,解碼器就經過音頻頭先讀取這個音頻文件的相關參數,好比採樣率(rate),通道數(channels)等等..那固然包括這個音頻文件的大小、語音數據長度等信息都在裏面。最後會由這些信息中的一些關鍵信息,計算出一個該音頻的播放時長~具體公式立刻再議。 spa

 

 

  1. #define WAVE_FORMAT_PCM 1  
  2. unsigned char wav_header[] = {  
  3.    'R''I''F''F',// "RIFF" 標誌  
  4.    0xfc, 0xff, 0xff, 0xff,// 文件長度  
  5.    'W''A''V''E'// "WAVE" 標誌  
  6.    'f''m''t'' '// "fmt" 標誌  
  7.    16, 0, 0, 0,        // 過渡字節(不定)  
  8.    WAVE_FORMAT_PCM, WAVE_FORMAT_PCM >> 8,// 格式類別  
  9.    0, 0,  // 聲道數  
  10.    0, 0, 0, 0,  // 採樣率  
  11.    0, 0, 0, 0,  // 位速  
  12.    0, 0,       // 一個採樣多聲道數據塊大小  
  13.    16, 0,      // 一個採樣佔的 bit 數  
  14.    'd''a''t''a',  // 數據標記符"data "  
  15.    0xd8, 0xff, 0xff, 0xff    
  16.       // 語音數據的長度,比文件長度小42通常。這個是計算音頻播放時長的關鍵參數~  
  17. };  

 

上面的結構就是音頻頭的基本結構,每個字節都顯示出來了。有些是4字節,有些是2字節。 .net

那,只要按照這個結構,在音頻文件開始處寫上面格式的文檔,就能夠正確配置一個音頻頭~ htm

 

那音頻的播放時長計算以下: blog

  1. 每一個採樣點字節數:bits = channels * BitsPerSample / 8   ( BitsPerSample: 16bit 通常 )
  2. 每秒字節數: m = nSamplesPerSec * bits;  (nSamplesPerSec:每秒採樣數,也就是採樣率~rate)
  3. 音頻文件播放時長:time = dlen / m;     ( dlen就是語音數據長度,也就是文件大小減去42~ )

因此,只要咱們正確的設置好dlen,採樣率rate以及channels就能夠自動的內部計算好該音頻的播放時長。很好~~ 文檔

在寫音頻頭的函數中,把必須條件以參數的形式傳進去,而後構造每個字節按照上面的方式,接着寫到音頻文件的起始處~finish... get

 

 

附: 博客

 

wave文件的格式:
 
00H 4 char "RIFF"標誌  04H 4 long int 文件長度  08H 4 char "WAVE"標誌  0CH 4 char "fmt"標誌  10H 4 過渡字節(不定)  14H 2 int 格式類別(10H爲PCM形式的聲音數據)  16H 2 int 通道數,單聲道爲1,雙聲道爲2  18H 2 int 採樣率(每秒樣本數),表示每一個通道的播放速度,  1CH 4 long int 波形音頻數據傳送速率,其值爲通道數×每秒數據位數×每樣                本的數據位數/8。播放軟件利用此值能夠估計緩衝區的大小。  20H 2 int 數據塊的調整數(按字節算的),其值爲通道數×每樣本的數據位            值/8。播放軟件須要一次處理多個該值大小的字節數據,以便將其            值用於緩衝區的調整。  22H 2  每樣本的數據位數,表示每一個聲道中各個樣本的數據位數。若是有多            個聲道,對每一個聲道而言,樣本大小都同樣。  24H 4 char 數據標記符"data"  28H 4 long int 語音數據的長度 
相關文章
相關標籤/搜索