关于AVI格式中的音频

wings4ever 2008-10-22 05:18:01
我在做一个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;
}

还请大家帮帮忙
...全文
620 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wings4ever 2008-10-23
  • 打赏
  • 举报
回复
不行啊 在AVI里面读出来的只是MP3的数据 不包含头结构的 我没明白你的意思
wings4ever 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 unibrew 的回复:]

set的时候指定为file就可以,不需要你读取多文件的流。 set完成后就可以play,你暂时可以不设定notify。 多测试看看。

简单测试就是:
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUNDPLAYER, (void **)&pMe->m_pISoundPlayer);
ISOUNDPLAYER_Set(pMe->m_pISoundPlayer, SDT_FILE, “test.mp3");
ISOUNDPLAYER_Play (pMe->m_pISoundPlayer);

只要这3行代码就可以播放你的mp3文件了。
[/Quote]

大哥 我不是要从MP3文件里播 我要从BUFFER里播 要只那么简单我还用问啊?

现在我的情况是 已经能播出BUFFER里的声音了 但是不知道怎么实现连续播放
在模拟器上直接运行的话 只是重复播放第一个数据里的声音
但是如果单步执行的话 是可以连续播放每个数据里的声音的

哪位大哥能指点一下算法 谢谢了
unibrew 2008-10-23
  • 打赏
  • 举报
回复

set的时候指定为file就可以,不需要你读取多文件的流。 set完成后就可以play,你暂时可以不设定notify。 多测试看看。

简单测试就是:
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUNDPLAYER, (void **)&pMe->m_pISoundPlayer);
ISOUNDPLAYER_Set(pMe->m_pISoundPlayer, SDT_FILE, “test.mp3");
ISOUNDPLAYER_Play (pMe->m_pISoundPlayer);

只要这3行代码就可以播放你的mp3文件了。
unibrew 2008-10-22
  • 打赏
  • 举报
回复
ISHELL_CreateInstance(,AEECLSID_SOUNDPLAYER,)
ISOUNDPLAYER_Set or ISOUNDPLAYER_SetInfo
ISOUNDPLAYER_RegisterNotify
ISOUNDPLAYER_Play

CallBack() 获取状态,不设置回调都可以。


pUser的值不要随便修改, 去掉覆盖pUser的代码看看,应该是很简单的功能, 考虑的太负责了,解码器支持mp3的,如果不支持即使你参数也不行。 可以参见soundplay的demo程序。

953

社区成员

发帖
与我相关
我的任务
社区描述
为开发者提供高通丰富的解决方案及全面技术下载内容。本版以AI人工智能、WoS移动笔记本、XR、IoT 物联网、Auto 汽车、生成式AI等核心板块组成,为开发者提供一个便捷及高效的学习交流平台。
人工智能物联网机器学习 企业社区 北京·东城区
社区管理员
  • Qualcomm开发
  • csdnsqst0050
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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