关于音频压缩时WAVEFORMATEX的尾巴填充的问题!!!!紧急!!

RomanticProgrammer 2005-06-08 02:55:48
http://community.csdn.net/Expert/topic/4047/4047850.xml?temp=.3877527
...全文
465 30 打赏 收藏 举报
写回复
用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)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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