社区
网络及通讯开发
帖子详情
关于音频压缩时WAVEFORMATEX的尾巴填充的问题!!!!紧急!!
RomanticProgrammer
2005-06-08 02:55:48
http://community.csdn.net/Expert/topic/4047/4047850.xml?temp=.3877527
...全文
465
30
打赏
收藏
关于音频压缩时WAVEFORMATEX的尾巴填充的问题!!!!紧急!!
http://community.csdn.net/Expert/topic/4047/4047850.xml?temp=.3877527
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
30 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
kese
2005-07-02
打赏
举报
回复
好,大家继续努力,在问题没解决前,请RomanticProgrammer别结贴。
我们要做的只不过是利用现有的解压缩算法对音频解压缩,不可能我们用都不会用。
RomanticProgrammer
2005-06-29
打赏
举报
回复
to kese(可可) :
我说了,我只是在网上查到的g723的extra data,但是我无法得到其他的啊....
===
难道这个问题真的无人能解决吗!?
kese
2005-06-17
打赏
举报
回复
你是不是通过枚举格式得到的?
我估计这是比较好的,不过代码方面需要仔细设计。
msg723在我的电脑中有这个。我在做pcm->ccitt时是直接分析音频数据的,
我觉得这个方法比较直接,总的来说,恭喜你拉!
RomanticProgrammer
2005-06-16
打赏
举报
回复
to kese(可可) :
谢谢您!我说的G.723是msg723!它的Extra data我已经查到了,所以不用麻烦您分析音频数据了。
其次,我需要的时候其他压缩算法(比如gsm610等)的Extra Data。而且我在压缩之前得到extra data,不是在压缩中的数据中得到extra data!
RomanticProgrammer
2005-06-14
打赏
举报
回复
??
constantine
2005-06-14
打赏
举报
回复
我看看到的
static const struct {
WAVEFORMATEX wf;
BYTE extra[10];
} g7231format = {
{ 66, 1, 8000, 800, 24, 0, 10 },
{ 2, 0, 0xce, 0x9a, 0x32, 0xf7, 0xa2, 0xae, 0xde, 0xac }
};
这个东西我怀疑也是错的,也搞不定,实在看不到66的,很怀疑!
我自己都是直接使用用向量数组的,填充的时候只要填充WAVEFORMATEX,扩充包是不用填的,
压缩的时候传进向量数组就可以了
constantine
2005-06-14
打赏
举报
回复
to 企鹅兄:要对比才知道,而且后面的扩充结构根据不同的压缩算法是不一样的,大部分好像都定义好了,你要mp3的吗?我回头查查看,现在在网巴的,没有资料
to 可可:openh323是一组协议,做voip一般就要按照这个,当然你可以自己定义
你可以上他的官方网站看,我也不是很清楚,要问我大哥才知道,不过他不在
kese
2005-06-14
打赏
举报
回复
关于extra data在我的代码中应该可以读取,至于填充还需要作出修改。
你要先把音频数据发给我,让我分析其中的数据结构,最好是100k以内的经过g.723压缩的音频文件。
再告诉你一遍我的邮箱:aklongke@yahoo.com.cn
RomanticProgrammer
2005-06-13
打赏
举报
回复
to kese(可可) :
你的代码里面没有填充extra data啊!!
RomanticProgrammer
2005-06-13
打赏
举报
回复
to :constantine(飘遥的安吉儿)
mp3的Extra data是什么,你是怎样查到的!?
kese
2005-06-13
打赏
举报
回复
openh323是什么,在哪里打开
constantine
2005-06-13
打赏
举报
回复
static const struct {
WAVEFORMATEX wf;
BYTE extra[10];
} g7231format = {
{ 66, 1, 8000, 800, 24, 0, 10 },
{ 2, 0, 0xce, 0x9a, 0x32, 0xf7, 0xa2, 0xae, 0xde, 0xac }
};
不过在mmreg里面看不到这样的结构
constantine
2005-06-13
打赏
举报
回复
晕,查了一下openh323,还真的有66的
constantine
2005-06-13
打赏
举报
回复
G723 压缩都是直接用参数的,
{ 0x42,0x0,0x1,0x0,0x40,0x1f,0x0,0x0,0x20,0x3,0x0,0x0,0x18,0x0,0x0,0x0,
0xa,0x0,0x2, 0x0, 0xce, 0x9a, 0x32,0xf7, 0xa2, 0xae, 0xde, 0xac };
初始化的时候wFormatTag = WAVE_FORMAT_PCM;//或者WAVE_FORMAT_ALAW;
66是那个宏?如可可说得,我看到也是
for WAVE_FORMAT_G721_ADPCM (0x0040)
不是723的
kese
2005-06-13
打赏
举报
回复
void changwf(WAVEFORMATEX* pwfx)
{
pwfx->wFormatTag=6;
pwfx->nSamplesPerSec=8000;
pwfx->nAvgBytesPerSec=8000;
pwfx->nBlockAlign=1;
pwfx->wBitsPerSample=8;
}
这个函数你必须再修改,来满足你的格式。
还有你用的是vc所以头文件要做如下改动
#include <mmsystem.hpp> 改为#include <mmsystem.h>
字符串格式格式也要改。AnsiString有做相应的修改
改好后能不能发一个简单的工程给我。包括声音文件。
你所谓的g.723到底是一个什么压缩格式,能给个全称吗?
我的邮箱:aklongke@yahoo.com.cn
RomanticProgrammer
2005-06-13
打赏
举报
回复
Thank you !
But no implement of function changwf in your code!!??
kese
2005-06-13
打赏
举报
回复
//---------------------------------------------------------------------------
#pragma hdrstop
#include "wavconverunit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
wavconver::wavfmt::wavfmt(WAVEFORMATEX * pwfx)
{
if(pmywfx!=NULL)
GlobalFree(pmywfx);
pmywfx=pwfx;
}
wavconver::wavfmt::wavfmt()
{
pmywfx=static_cast<WAVEFORMATEX*>(GlobalAlloc(0,sizeof(WAVEFORMATEX)));
}
wavconver::wavfmt::~wavfmt()
{
if(pmywfx!=NULL)
GlobalFree(pmywfx);
}
WAVEFORMATEX* wavconver::wavfmt::renew(WAVEFORMATEX* pwfx)
{
free();
pmywfx=pwfx;
return pmywfx;
}
void wavconver::wavfmt::free()
{
if(pmywfx!=NULL)
GlobalFree(pmywfx);
pmywfx=NULL;
}
WAVEFORMATEX* wavconver::wavfmt::operator ->()
{
return pmywfx;
}
WAVEFORMATEX wavconver::wavfmt::operator*()
{
return *pmywfx;
}
wavconver::wavconver()
{
}
wavconver::~wavconver()
{
}
bool wavconver::openmm(HMMIO *lphmmio,char *file,DWORD dwOpenFlags)
{
*lphmmio=NULL;
*lphmmio=mmioOpen(file,NULL,dwOpenFlags);
if(*lphmmio==NULL)
return false;
else
return true;
}
bool wavconver::closemm(HMMIO *lphmmio)
{
if(mmioClose(*lphmmio,0)==0)
return true;
else
return false;
}
bool wavconver::riffcopychunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck)
{
MMCKINFO ck;
void *pbuf;
ck.ckid = lpck->ckid;
ck.cksize = lpck->cksize;
pbuf=GlobalAlloc(0,ck.cksize);
if(pbuf==NULL)
return false;
if(mmioCreateChunk(hmmioDst, &ck, 0))
return false;
mmioRead(hmmioSrc, (char*)pbuf, lpck->cksize);
mmioWrite(hmmioDst, (char*)pbuf, lpck->cksize);
mmioAscend(hmmioDst, &ck, 0);
GlobalFree(pbuf);
return true;
}
void wavconver::formatanddata(char * file, DWORD * lpdata)
{
HMMIO hmmio;
MMCKINFO ck,ckRIFF;
*lpdata=0;
if(!openmm(&hmmio,file,MMIO_READ | MMIO_DENYWRITE | MMIO_ALLOCBUF))
throw "open file failured!";
ckRIFF.fccType=mmioFOURCC('W','A','V','E');
if(mmioDescend(hmmio, &ckRIFF, NULL, MMIO_FINDRIFF))
throw "findriff failured!";
while (MMSYSERR_NOERROR == mmioDescend(hmmio, &ck, &ckRIFF, 0)){
switch (ck.ckid){
case mmioFOURCC('f','m','t',' '):
dwwfx=ck.cksize;
srcwfx.renew(static_cast<WAVEFORMATEX*>(GlobalAlloc(0,dwwfx)));
destwfx.renew(static_cast<WAVEFORMATEX*>(GlobalAlloc(0,dwwfx)));
if(mmioRead(hmmio,(char*)srcwfx.pmywfx,dwwfx)!=(long)dwwfx)
throw "mmioRead fmt error";
memcpy(destwfx.pmywfx,srcwfx.pmywfx,dwwfx);
break;
case mmioFOURCC('d','a','t','a'):
if(*lpdata!=0)
break;
*lpdata=ck.cksize;
break;
}
mmioAscend(hmmio,&ck,0);
}
closemm(&hmmio);
}
void wavconver::convert(char * destfile, char * srcfile,changefmt changeformatex)
{
DWORD srcdata;
DWORD destdata;
HACMSTREAM has;
ACMSTREAMHEADER ash;
MMCKINFO ck,cksrc,ckdest;
char *psrc;
char *pdest;
MMRESULT mmr;
formatanddata(srcfile,&srcdata);
changeformatex(destwfx.pmywfx);
mmr=acmStreamOpen(&has,0,srcwfx.pmywfx,destwfx.pmywfx,0,0,0,ACM_STREAMOPENF_NONREALTIME );
if (MMSYSERR_NOERROR != mmr){
throw "acmStreamOpen error";
}
mmr=acmStreamSize(has,srcdata,&destdata,ACM_STREAMSIZEF_SOURCE);
if (MMSYSERR_NOERROR != mmr){
throw "acmStreamSize error";
}
psrc=static_cast<char*>(GlobalAlloc(0,srcdata));
pdest=static_cast<char*>(GlobalAlloc(0,destdata));
if(!openmm(&hmmioSrc,srcfile,MMIO_READ | MMIO_DENYWRITE | MMIO_ALLOCBUF))
throw "srcfile open error";
if(!openmm(&hmmioDest,destfile,MMIO_CREATE | MMIO_WRITE | MMIO_EXCLUSIVE | MMIO_ALLOCBUF))
throw "destfile open error";
ash.cbStruct=sizeof(ash);
ash.fdwStatus=0;
ash.dwUser=0;
ash.pbSrc=psrc;
ash.cbSrcLength=srcdata;
ash.cbSrcLengthUsed=0;
ash.dwSrcUser=srcdata;
ash.pbDst=pdest;
ash.cbDstLength=destdata;
ash.cbDstLengthUsed=0;
ash.dwDstUser=destdata;
mmr=acmStreamPrepareHeader(has,&ash,0);
if (MMSYSERR_NOERROR != mmr){
throw "acmStreamPrepareHeader error";
}
ckdest.fccType=mmioFOURCC('W','A','V','E');
ckdest.cksize=destdata+sizeof(FOURCC)*3+sizeof(DWORD)*2+dwwfx;
mmioCreateChunk(hmmioDest,&ckdest,MMIO_CREATERIFF);
cksrc.fccType=mmioFOURCC('W','A','V','E');
mmioDescend(hmmioSrc,&cksrc, NULL, MMIO_FINDRIFF);
ckdest.ckid=mmioFOURCC('f','m','t',' ');
ckdest.cksize=dwwfx;
mmioCreateChunk(hmmioDest,&ckdest,0);
mmioWrite(hmmioDest,(char*)destwfx.pmywfx,dwwfx);
mmioAscend(hmmioDest,&ckdest,0);
ckdest.ckid=mmioFOURCC('d','a','t','a');
ckdest.cksize=destdata;
mmioCreateChunk(hmmioDest,&ckdest,0);
mmioAscend(hmmioDest,&ckdest,0);
mmioRead(hmmioSrc,psrc,srcdata);
acmStreamConvert(has,&ash,ACM_STREAMCONVERTF_BLOCKALIGN |ACM_STREAMCONVERTF_END);
mmioWrite(hmmioDest,pdest,destdata);
mmioClose(hmmioSrc,0);
mmioAscend(hmmioDest,&ckdest,0);
mmioClose(hmmioDest,0);
if(ACMSTREAMHEADER_STATUSF_PREPARED & ash.fdwStatus){
ash.cbSrcLength=srcdata;
ash.cbDstLength=destdata;
acmStreamUnprepareHeader(has,&ash,0);
}
acmStreamClose(has,0);
GlobalFree(psrc);
GlobalFree(pdest);
}
kese
2005-06-13
打赏
举报
回复
//---------------------------------------------------------------------------
#ifndef wavconverunitH
#define wavconverunitH
//---------------------------------------------------------------------------
#include <mmsystem.hpp>
#include <mmreg.h>
#include <msacm.h>
//---------------------------------------------------------------------------
class wavconver
{
private:
class wavfmt
{
private:
public:
WAVEFORMATEX *pmywfx;
wavfmt(WAVEFORMATEX * pwfx);
wavfmt();
~wavfmt();
WAVEFORMATEX* renew(WAVEFORMATEX* pwfx);
void free();
WAVEFORMATEX* operator ->();
WAVEFORMATEX operator*();
};
public:
typedef void (*changefmt)(WAVEFORMATEX*);
wavconver();
~wavconver();
AnsiString srcname;
AnsiString destname;
HMMIO hmmioSrc;
HMMIO hmmioDest;
DWORD dwwfx;
bool openmm(HMMIO *lphmmio,char *file,DWORD dwOpenFlags);
bool closemm(HMMIO *lphmmio);
wavfmt srcwfx;
wavfmt destwfx;
bool riffcopychunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck);
void formatanddata(char * file, DWORD * lpdata);
void convert(char * destfile, char * srcfile,changefmt changeformatex);
};
#endif
kese
2005-06-13
打赏
举报
回复
关于g.723的wFormatTag我查到了如下几个值,
#define WAVE_FORMAT_G723_ADPCM 0x0014
#define WAVE_FORMAT_MSG723 0x0042
#define WAVE_FORMAT_LUCENT_G723 0x0059
#define WAVE_FORMAT_VIVO_G723 0x0111
#define WAVE_FORMAT_DIGITAL_G723 0x0123
至于你说的66,我查到的是
#define WAVE_FORMAT_G721_ADPCM 0x0040
关于尾巴,不少的资料中提到了!大凡提到wav的chunk的资料中都有所提及。
http://www.borg.com/~jglatt/tech/wave.htm
这里的资料特别是关于格式讲得最为详细。
由于时间限制,我直接给出我的单元文件。
其中你应该只需修改void changwf(WAVEFORMATEX* pwfx)就可满足你。
kese
2005-06-10
打赏
举报
回复
我争取明天给你答复,因为我自己也在作一个从pcm到ccitt的转化。
端午快乐,祝你好运!
加载更多回复(10)
WAV
E
FORM
A
TEX
WAV
E
FORM
A
TEX
是由Microsoft注册的 typedef struct{ WORD w
Form
atTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD cbSize;}
WAV
EFOR
WAV
E
FORM
A
TEX
结构的说明
在对
音频
编解码中,表示声音的特征用
WAV
E
FORM
A
TEX
这个结构,最初的PCM数据是没有
压缩
的,所以,这个结构中的cbSize为0,如果对于其他的
音频
格式,这个表示额外的信息的大小,用于解码和编码的。 在windows下定义的格式,在mmreg.h中,可以知道赋给w
Form
atTag的值可以是: #define
WAV
E_
FORM
AT_UNKNOWN
WAV
E
FORM
A
TEX
解析
WAV
E
FORM
A
TEX
是由Microsoft注册的 typedef struct { WORD w
Form
atTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD c
Windows
音频
处理过程
WINDOWS下对
音频
的处理,大致可分为两部分,即
音频
的输入、输出,和ACM
压缩
处理。 一般情况下在WINDOWS下可以调用诸如sndPlaySound等API(MCI)来播放一个
WAV
文件,但那显然不是我们需要做的。必须能够直接对
音频
数据流进行处理。在WINDOWS下,也为之提供了一系列的API,以
wav
eIn和
wav
eOut开头的一组API就是干这个的。 先说输入吧。常用的相关AP...
国产
音频
压缩
格式JLM——JLM
音频
播放
基于JLM格式的windows和linux下的
音频
播放功能源码
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章