如何将未压缩的wav文件进行g.726编码
弄这个问题,弄了一天了,急死我了。
问题是这样的:就是将麦克风的声音录下来,并将其按G.726方式进行编码,编码后文件保持wav文件结构。我现在可以把未压缩的音频保存为wav格式的文件,但是不知道如何将其进行G.726进行编码?
依据.wav的文件结构,其中在Format Chunk“fmt”部分有这么一个结构:
[code=C/C++][
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
/code]
我的未压缩的wav文件的'fmt'结构是这么设置的 :
wFormatTag = WAVE_FORMAT_PCM;
nChannels = 1;
nSamplesPerSec = 8000
wBitsPerSample = 16
nBlockAlign= nChannels * wBitsPerSample / 8;
nAvgBytesPerSec= nBlockAlign * nSamplesPerSec;
cbSize = 0;
关于将未压缩的wav采用G.726进行编码,我的思路是这样的,也不知道对不对?
1.将wav中的音频数据按照G.726进行编码(将PCM转化为16kbps的ADPCM信号,AUDIO_ENCODING_ULAW)
2.将wav文件的相关结构如:'RIFF'结构中表示大小的域、‘data’中表示大小的域、以及“fmt”结构等进行修改。
在这里,“fmt”的设置我这这么写的:
fmt_block.wavFormat.wFormatTag = 0x45; //G.726编码
fmt_block.wavFormat.wChannels = 0x01; //单声道
fmt_block.wavFormat.dwSamplesPerSec = 8000;
fmt_block.wavFormat.dwAvgBytesPerSec = 4000;
fmt_block.wavFormat.wBlockAlign = 1;
fmt_block.wavFormat.wBitsPerSample = 2;
我就是这么进行编码的,可是,用kmp播放压缩后的wav文件,全是杂音,吵死了,搞了n久,还是没搞出来。
麻烦大家给我说说,感激不尽