一个裸的PCM格式音频数据,如果不带头信息,不知道其采样率等相关信息,就无法用播放器播放出来。下面是默认的头信息格式:
struct wave_pcm_hdr
{
char riff[4];
SR_DWORD size_8;
char wave[4];
char fmt[4];
SR_DWORD dwFmtSize;
SR_WORD format_tag;
SR_WORD channels;
SR_DWORD samples_per_sec;
SR_DWORD avg_bytes_per_sec;
SR_WORD block_align;
SR_WORD bits_per_sample;
char data[4];
SR_DWORD data_size;
} ;
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
};
将头信息写入音频数据中:
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;
}
if (synth_status == MSP_TTS_FLAG_DATA_END || ret != 0)
break;
}
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)