如何将未压缩的wav文件进行g.726编码

jmflovezlf 2011-04-28 05:19:20
弄这个问题,弄了一天了,急死我了。
问题是这样的:就是将麦克风的声音录下来,并将其按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久,还是没搞出来。

麻烦大家给我说说,感激不尽

...全文
436 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
浮云 2011-05-03
  • 打赏
  • 举报
回复
虽然从定义上看,wav文件wFormatTag可以是WAVE_FORMAT_PCM,也可以是其它值,比如lz说的g726,但实际上,很多播放器并不会支持
你听到杂音原因可能是播放器不支持,也可能是文件打包没打好
建议:
1,找一个确定规范的包含g726音频的wav样本文件,确认播放器能支持
2,播放器确定能支持的情况下,再调整wav参数
另外也可以调试一下kmp,看它输出到render的数据到底是怎么样的,我怀疑kmp把g726音频当作pcm了
仅供参考
满衣兄 2011-05-03
  • 打赏
  • 举报
回复
你把726的数据不解码直接播放肯定全是杂音啊,播放器播放的数据最终只能是PCM
满衣兄 2011-05-03
  • 打赏
  • 举报
回复
WAV文件的格式是 文件头+PCM数据 而不是 文件头+726编码的数据,你这里把数据压缩后存放在WAV文件里是不可以直接播放的,如果要播放那么必须把WAV头去掉,然后把数据用726解码,然后才可以播放。
WAV存放的本身就是PCM数据,你存放726数据显然是不合适的。
jmflovezlf 2011-05-03
  • 打赏
  • 举报
回复
谁有code,给一份呀……
楼上说的我都懂,现在压缩后有很大杂音
kfanffvga 2011-04-30
  • 打赏
  • 举报
回复
wave 文件是有文件头的,但是g729是不应该压缩wave的文件头的
CyberLogix 2011-04-29
  • 打赏
  • 举报
回复
找个G726编码器吧WAV中的PCM数据压缩编码一下就可一了
jmflovezlf 2011-04-29
  • 打赏
  • 举报
回复
咋这么悲剧呢,没人顶
满衣兄 2011-04-29
  • 打赏
  • 举报
回复
你得到麦克风直接保存在文件里就行了,不需要保存为WAV文件,WAV不可以直接转换为726
jmflovezlf 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oexpress 的回复:]

找个G726编码器吧WAV中的PCM数据压缩编码一下就可一了
[/Quote]
我在网上也找了几个音频转换的工具,它们把wav转换为g.726时,去掉了wav的文件头,只是将里面的音频数据
按照g.726进行编码,然后保存在一个文件中!
jmflovezlf 2011-04-28
  • 打赏
  • 举报
回复
补充一点:
kmp应该是自带了G.726的解码器吧?,可是有点我不明白,即使采用16kbps,在源码中,其编码还是有三种:AUDIO_ENCODING_ALAW、AUDIO_ENCODING_ULAW、AUDIO_ENCODING_LINEAR,在解码的时候,解码器(第三方的)如何进行区分呢?

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧