1. 程式人生 > >PCM音訊檔案格式的頭資訊

PCM音訊檔案格式的頭資訊

一個裸的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