首先,下面這個博客中對wav音頻頭的結構作了一個介紹,能夠去參考下。 html
http://blog.csdn.net/yzhouen/archive/2006/06/07/777459.aspx 函數
音頻頭中是一個一個的標識,表明這個音頻文件的一些配置參數。那當要播放這個音頻的時候,解碼器就經過音頻頭先讀取這個音頻文件的相關參數,好比採樣率(rate),通道數(channels)等等..那固然包括這個音頻文件的大小、語音數據長度等信息都在裏面。最後會由這些信息中的一些關鍵信息,計算出一個該音頻的播放時長~具體公式立刻再議。 spa
- #define WAVE_FORMAT_PCM 1
- unsigned char wav_header[] = {
- 'R', 'I', 'F', 'F',// "RIFF" 標誌
- 0xfc, 0xff, 0xff, 0xff,// 文件長度
- 'W', 'A', 'V', 'E', // "WAVE" 標誌
- 'f', 'm', 't', ' ', // "fmt" 標誌
- 16, 0, 0, 0, // 過渡字節(不定)
- WAVE_FORMAT_PCM, WAVE_FORMAT_PCM >> 8,// 格式類別
- 0, 0, // 聲道數
- 0, 0, 0, 0, // 採樣率
- 0, 0, 0, 0, // 位速
- 0, 0, // 一個採樣多聲道數據塊大小
- 16, 0, // 一個採樣佔的 bit 數
- 'd', 'a', 't', 'a', // 數據標記符"data "
- 0xd8, 0xff, 0xff, 0xff
- // 語音數據的長度,比文件長度小42通常。這個是計算音頻播放時長的關鍵參數~
- };
上面的結構就是音頻頭的基本結構,每個字節都顯示出來了。有些是4字節,有些是2字節。 .net
那,只要按照這個結構,在音頻文件開始處寫上面格式的文檔,就能夠正確配置一個音頻頭~ htm
那音頻的播放時長計算以下: blog
- 每一個採樣點字節數:bits = channels * BitsPerSample / 8 ( BitsPerSample: 16bit 通常 )
- 每秒字節數: m = nSamplesPerSec * bits; (nSamplesPerSec:每秒採樣數,也就是採樣率~rate)
- 音頻文件播放時長: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 語音數據的長度