关于AVI格式中的音频
我在做一个AVI播放器
现在做到音频播放
目前无法播放
放出来的是杂音 并且也无法收到DONE等响应 我的理解是MP3的头文件的问题
下面是相关信息 请高手指点
以下是我要用到的AVI格式中的MP3头文件信息
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;
WAVEFORMATEX wave;
下面是我从文件中读出来的信息
*splayer.c:782 - pMe->wave.wFormatTag is 85 U
*splayer.c:783 - pMe->wave.nChannels is 1
*splayer.c:784 - pMe->wave.nSamplesPerSec is 16000 €>
*splayer.c:785 - pMe->wave.nAvgBytesPerSec is 1950
*splayer.c:786 - pMe->wave.nBlockAlign is 1
*splayer.c:787 - pMe->wave.wBitsPerSample is 0
*splayer.c:788 - pMe->wave.cbSize is 12
貌似BREW控制MP3头信息的结构是
typedef struct
{
AEESoundPlayerFile fType;
AEESoundPlayerMP3Version version;
AEESoundPlayerMP3Layer layer;
boolean crcFlag;
AEESoundPlayerMP3BitRate bitrate;
AEESoundPlayerMP3SampleRate sampleRate;
AEESoundPlayerMP3Channel channel;
AEESoundPlayerMP3Extension extension;
boolean copyrightFlag;
boolean originalFlag;
AEESoundPlayerMP3Emphasis emphasis;
char title[AEE_ID3_TAG_LENGTH];
char artist[AEE_ID3_TAG_LENGTH];
char album[AEE_ID3_TAG_LENGTH];
char year[4];
char comment[AEE_ID3_TAG_LENGTH];
uint8 genre;
} AEESoundPlayerMP3Spec;
我试图在SOUNDPLAYER的回调里面修改信息
下面是我的回调函数
static void CBSound(void * pUser,AEESoundPlayerCmd eCBType,AEESoundPlayerStatus eSPStatus,uint32 dwParam)
{
splayer* pMe = (splayer*)pUser;
AEESoundPlayerMP3Spec* spec=(AEESoundPlayerMP3Spec*)pUser;
spec->fType=AEE_SOUNDPLAYER_FILE_MP3;
spec->channel=AEE_SOUNDPLAYER_MP3_CHANNEL_SINGLE;
spec->bitrate=pMe->wave.wBitsPerSample;
spec->sampleRate=pMe->wave.nSamplesPerSec;
spec->crcFlag=FALSE;
spec->copyrightFlag =FALSE;
spec->originalFlag=FALSE;
spec->emphasis=AEE_SOUNDPLAYER_MP3_EMPHASIS_NONE;
switch(eSPStatus)
{
case AEE_SOUNDPLAYER_DONE:
{
ISOUNDPLAYER_Stop(pMe->pISoundPlayer);
ISOUNDPLAYER_RegisterNotify(pMe->pISoundPlayer,NULL,NULL);
pMe->ifdone=TRUE;
FREE(pMe->mp3p);
pMe->mp3p=NULL;
FREE(pMe->info.pData);
pMe->info.pData=NULL;
break;
}
}
return;
}
主循环
boolean aaa(splayer* pMe,const char * AviFile)
{
uint32 readdata,dwsize;
byte *pointer;
int seeklen,i,readsize,j;
readsize=4;
seeklen=0;
dwsize=0;
ISHELL_CreateInstance(pMe->pIShell,AEECLSID_FILEMGR,(void**)&pMe->mAvi);
if (IFILEMGR_Test(pMe->mAvi,AviFile)==SUCCESS)
{
pMe->fAvi=IFILEMGR_OpenFile(pMe->mAvi,AviFile,_OFM_READ);
}
else DBGPRINTF("can't open file");
IFILEMGR_GetInfo(pMe->mAvi,AviFile,&pMe->fileinfo);
DBGPRINTF("THIS IS AAA");
for (;;)
{
IFILE_Seek(pMe->fAvi,_SEEK_START,seeklen);
IFILE_Read(pMe->fAvi,&readdata,readsize);
//DBGPRINTF("i is %d",i);
if ( (mmioFOURCC('0','0','w','b')==readdata) || (mmioFOURCC('0','1','w','b')==readdata) )
{
seeklen+=4;
DBGPRINTF("%d______%d_______%s",readdata,seeklen,&(AECHAR)readdata);
IFILE_Seek(pMe->fAvi,_SEEK_START,seeklen);
IFILE_Read(pMe->fAvi,&readdata,readsize);
dwsize=readdata;
seeklen+=4;
DBGPRINTF("dwsize is %d",dwsize);
pMe->mp3p=(byte*)MALLOC(dwsize*sizeof(byte));
IFILE_Seek(pMe->fAvi,_SEEK_START,seeklen);
IFILE_Read(pMe->fAvi,pMe->mp3p,dwsize);
seeklen+=dwsize-dwsize%4-8;
plays(pMe,dwsize);
for(;;)
{
if(pMe->ifdone)
{
DBGPRINTF("done");
break;
}
}
pMe->ifdone=FALSE;
return TRUE;
}
seeklen+=4;
if(seeklen>=pMe->fileinfo.dwSize)
break;
else if(pMe->ifdone)
{
DBGPRINTF("done");
break;
}
}
return FALSE;
}
还请大家帮帮忙