IMedia ISource mp3

benbin 2009-09-21 07:08:16
大家好,
我想用isource方式播放MP3:
ISHELL_CreateInstance(me->piShell, AEECLSID_SOURCEUTIL, &me->piSourceUtil);
ISHELL_CreateInstance(me->piShell, AEECLSID_FILEMGR, &me->piFileMgr);
me->piTest = IFILEMGR_OpenFile(me->piFileMgr, "test.wav", _OFM_READ);
// Create a ISource
ISOURCEUTIL_SourceFromAStream(me->piSourceUtil,(IAStream *)me->piTest,&me->piTestSource);

/* create imedia. */
iRet = ISHELL_CreateInstance(me->piShell,AEECLSID_MEDIAMP3,(void **)&me->piMedia);
/* set media data. */
stMd.dwStructSize = sizeof(AEEMediaDataEx);
stMd.dwCaps = 0;
stMd.bRaw = FALSE;
stMd.dwBufferSize = 0;
stMd.pSpec = NULL;
stMd.dwSpecSize = 0;
stMd.clsData = MMD_ISOURCE;
stMd.pData = (TE_VOID *)me->piTestSource;
stMd.dwSize = 0;
iRet = IMEDIA_SetMediaDataEx(me->piMedia,&stMd,1);

IMEDIA_RegisterNotify(me->piMedia, (PFNMEDIANOTIFY)MediaNotify, me);
IMEDIA_Play(me->piMedia);


模拟器上调试,在MediaNotify内收到如下消息:
MM_STATUS_START
MM_STATUS_MEDIA_SPEC
MM_STATUS_ABORT


请问我的处理是否有问题,谢谢。
...全文
1772 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
magic_ice 2009-09-24
  • 打赏
  • 举报
回复
在模拟器上面指定ISource为MP3是行不通. 应该是模拟器没支持..
但PCM则可以. 即使输入源是MP3.

而IMEDIA_GetTotlaTime, 在PCM模式下的ISource能得到正确的值啊.

// File 转 ISourc 后
if (pCmdNotify->nCmd == MM_CMD_GETTOTALTIME)
{
if (pCmdNotify->nStatus == MM_STATUS_DONE || pCmdNotify->nStatus == MM_STATUS_ABORT)
{
int lTotalTime_ = ((uint32)pCmdNotify->pCmdData) / 1000;
DBGPRINTF ("TotalTime is %d", lTotalTime_);
if (SUCCESS != IMedia_Play (pCmdNotify->pIMedia))
{
DBGPRINTF ( "start not success");
}
}
}

这是我的测试代码..
楼主自己多DBGPINTF, 跟踪下.
祝你早日找到原因了
benbin 2009-09-24
  • 打赏
  • 举报
回复
我再顶。
magic_ice 2009-09-24
  • 打赏
  • 举报
回复
@ benben504000

以下文字可能属于没组织的文字..见谅啊

for MM_CMD_GETTOTALTIME
1.这个是异步的..
2.IMedia_GetTotalTime() only works in the READY state
3.我只测试过MMD_FILE, 能获取播放文件的总时间, 至于 file to source 再获取总时间这点...还是你自己多试试吧.

sorry
benbin 2009-09-23
  • 打赏
  • 举报
回复
hi,magic_ice:

我在device上用AEECLSID_MEDIAMP3时调用IMedia_Play 或 IMedia_GetTotalTime会直接返回1:EFAILED;
用AEECLSID_MEDIAPCM 时,则全都正常,但在MediaNotify回调函数内收到MM_CMD_GETTOTALTIME消息时,总时长的值很大,不正确,代码如下:
case MM_CMD_GETTOTALTIME:
if(MM_STATUS_DONE == pstCmdNotify->nStatus)
{
uiTotalTime= ((TE_UINT)pstCmdNotify->pCmdData) / 1000; //pstCmdNotify->pCmdData值很大
}

请问这是咋回事啊,晕头了,高手请指教。
benbin 2009-09-22
  • 打赏
  • 举报
回复
换成mp3还是不行,请指教。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hhygcy 的回复:]
兄台 你说播放的是MP3 可是
C/C++ codeme->piTest= IFILEMGR_OpenFile(me->piFileMgr,"test.wav", _OFM_READ);
这句代码赫然写着 wav?

[/Quote]
是呀,换个MP3试试吧
benbin 2009-09-22
  • 打赏
  • 举报
回复
好的,谢谢,我试试。
magic_ice 2009-09-22
  • 打赏
  • 举报
回复

如果是Mp3格式的话
把这句 "iRet = ISHELL_CreateInstance(me->piShell,AEECLSID_MEDIAMP3,(void **)&me->piMedia);" 里面的AEECLSID_MEDIAMP3 换成 AEECLSID_MEDIAPCM
经验上来说
能行.
原理上
还不能解析清楚
sorry
hhygcy 2009-09-21
  • 打赏
  • 举报
回复
兄台 你说播放的是MP3 可是
me->piTest = IFILEMGR_OpenFile(me->piFileMgr, "test.wav", _OFM_READ); 

这句代码赫然写着 wav?

2,851

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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