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是由2048次采样组成的( 参 http://discussion.forum.nokia.com/forum/showthread.php?129458-请问PCM格式的音频流,每次读入或输出的块的大小是必须固定为4096B么&s=e79e9dd1707157281e3725a163844c49 )。

 

    如果是双声道的文件,采样数据按时间先后顺序交叉地存入。如图所示:

  

 


   PCM的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。

首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。

 

    样本大小      数据格式            最小值    最大值

    8位PCM       unsigned int         0       225

    16位PCM      int                -32767    32767

你可能感兴趣的:(音视频)