PCM音訊檔案格式的頭資訊
阿新 • • 發佈:2019-02-07
一個裸的PCM格式音訊資料,如果不帶頭資訊,不知道其取樣率等相關資訊,就無法用播放器播放出來。下面是預設的頭資訊格式:
//音訊頭部格式
struct wave_pcm_hdr
{
char riff[4]; // = "RIFF"
SR_DWORD size_8; // = FileSize - 8
char wave[4]; // = "WAVE"
char fmt[4 ]; // = "fmt "
SR_DWORD dwFmtSize; // = 下一個結構體的大小 : 16
SR_WORD format_tag; // = PCM : 1
SR_WORD channels; // = 通道數 : 1
SR_DWORD samples_per_sec; // = 取樣率 : 8000 | 6000 | 11025 | 16000
SR_DWORD avg_bytes_per_sec; // = 每秒位元組數 : dwSamplesPerSec * wBitsPerSample / 8
SR_WORD block_align; // = 每取樣點位元組數 : wBitsPerSample / 8
SR_WORD bits_per_sample; // = 量化位元數: 8 | 16
char data[4]; // = "data";
SR_DWORD data_size; // = 純資料長度 : FileSize - 44
} ;
//預設音訊頭部資料
struct wave_pcm_hdr default_pcmwavhdr =
{
{ 'R' , 'I', 'F', 'F' },
0,
{'W', 'A', 'V', 'E'},
{'f', 'm', 't', ' '},
16,
1,
1,
16000,
32000,
2,
16,
{'d', 'a', 't', 'a'},
0
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
將頭資訊寫入音訊資料中:
struct wave_pcm_hdr pcmwavhdr = default_pcmwavhdr;
fwrite(&pcmwavhdr, sizeof(pcmwavhdr) ,1, fp);
while (1)
{
const void *data = QTTSAudioGet(sess_id, &audio_len, &synth_status, &ret);
if (NULL != data)
{
fwrite(data, audio_len, 1, fp);
pcmwavhdr.data_size += audio_len;//修正pcm資料的大小
}
if (synth_status == MSP_TTS_FLAG_DATA_END || ret != 0)
break;
}//合成狀態synth_status取值可參考開發文件
//修正pcm檔案頭資料的大小
pcmwavhdr.size_8 += pcmwavhdr.data_size + 36;
//將修正過的資料寫回檔案頭部
fseek(fp, 4, 0);
fwrite(&pcmwavhdr.size_8,sizeof(pcmwavhdr.size_8), 1, fp);
fseek(fp, 40, 0);
fwrite(&pcmwavhdr.data_size,sizeof(pcmwavhdr.data_size), 1, fp);
fclose(fp);
PCM(Pulse Code Modulation)也被稱為 脈碼編碼調製。PCM中的聲音資料沒有被壓縮,如果是單聲道的檔案,取樣資料按時間的先後順序依次存入。(它的基本組織單位是BYTE(8bit)或WORD(16bit))
如果是雙聲道的檔案,取樣資料按時間先後順序交叉地存入。如圖所示:
PCM的每個樣本值包含在一個整數i中,i的長度為容納指定樣本長度所需的最小位元組數。
首先儲存低有效位元組,表示樣本幅度的位放在i的高有效位上,剩下的位置為0,這樣8位和16位的PCM波形樣本的資料格式如下所示。
樣本大小 資料格式 最小值 最大值
8位PCM unsigned int 0 225
16位PCM int -32767 32767