brew网络raw PCM数据播放问题

yuephone 2010-02-27 05:41:25
小弟刚学Brew不久,碰到如下问题,
首先在从网络接收到amr-nb数据流,实现边接收, 边解码, 边播放, 但是听到的声音断断续续..
如果把解完码之后的数据保存成大文件, 播放, 能正常听到声音, 网络速度正常!!!
所以定位到播放有问题, 不知如何解决........
望请高手指点...
播放的部分代码如下:

Step 1:
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MEDIAPCM, (void **)&pMe->m_pIMedia);
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOURCEUTIL, (void**)&pMe->m_pISourceUtil);

ISOURCEUTIL_SourceFromMemory(
pMe->m_pISourceUtil,
pMe->pMediaBuffer, // 放从网络接收到的,解完码之后的raw PCM数据
pMe->dwMediaBufferSize, // 数据大小
NULL,
NULL,
&pMe->m_pISource
);

MEMSET(&pMe->spec, (int)0, sizeof(pMe->spec));
pMe->spec.wSize = sizeof(pMe->spec);
pMe->spec.clsMedia = AEECLSID_MEDIAPCM;
pMe->spec.wChannels = 1;
pMe->spec.dwSamplesPerSec = 8000;
pMe->spec.wBitsPerSample = 16;
pMe->spec.bUnsigned= FALSE;

// Set up AEEMediaDataEx
pMe->mde.clsData = MMD_ISOURCE;
pMe->mde.pData = (void *)pMe->m_pISource;
pMe->mde.dwSize = 0;
pMe->mde.dwStructSize = sizeof(pMe->mde);
pMe->mde.dwCaps = 0;
pMe->mde.bRaw = TRUE;
pMe->mde.dwBufferSize = 0;
pMe->mde.pSpec = &pMe->spec;
pMe->mde.dwSpecSize = sizeof(pMe->spec);

IMEDIA_SetMediaDataEx(pMe->m_pIMedia, &pMe->mde, 1);

IMEDIA_RegisterNotify(pMe->m_pIMedia, MediaNotifyCallback, pMe);
IMEDIA_Play(pMe->m_pIMedia);

STEP 2:
在回调函数MediaNotifyCallback的MM_STATUS_DONE状态中重新设置播放函数,
ISHELL_Resume(pMe->a.m_pIShell,&pMe->m_cbAudio);
其中pMe->m_cbAudio重新调用1
听到的声音断断续续....
请有经验的朋友帮帮忙, 提出解决方案, 列出部分示例代码,先在这里谢过了...





...全文
2078 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sqbing 2011-09-23
  • 打赏
  • 举报
回复
这里在用IFIFO播放PCM时要注意一点,务必控制好IFIFO的UsedSize,因为如果让MEDIA读到ISource_Wait,MEDIA会把这个返回值当做是播放的结束标志,即使后面再往IFIFO里塞数据,MEDIA 也不会再读,仅仅是停留在MM_STATE_PLAY状态,回调中也只会有Tick而已。

一定要注意!
huangzhl03 2010-03-21
  • 打赏
  • 举报
回复
楼上的地址有点问题,具体代码可以到 http://download.csdn.net/source/2150066 下载
huangzhl03 2010-03-21
  • 打赏
  • 举报
回复
我写了个播放PCM数据流的示例,具体代码可以到:http://d.download.csdn.net/down/2150066/ 下载。
twoconk 2010-03-05
  • 打赏
  • 举报
回复
定时器不精确是正常现象,毕竟是软定时

一般比较短的定时功能建议用 ISHELL_Resume()~~
yuephone 2010-03-05
  • 打赏
  • 举报
回复
twoconk,你好!
十分感谢你的帮助!
yuephone 2010-03-04
  • 打赏
  • 举报
回复
twoconk, 你好!
我按照你的方法试了一下,确实很好用!
声音不会再断断续续了!
十分感谢你的帮忙!!!!!!!!!!!!!!!

小弟现在又遇上个问题,在播放音频的时候,我设置了定时器,
void timer_func(AudioTest *pMe)
{
DBGPRINTF("********************%d************************", GETUPTIMEMS()-pMe->m_nTimerTest);
pMe->m_nTimerTest = GETUPTIMEMS();
ISHELL_SetTimer(pMe->a.m_pIShell, 10, (PFNNOTIFY)timer_func, pMe);
}
在不播放音频的情况下,响应时间在10MS或者11MS,比较准时,但是播放音频的时候,定时器的回调不能稳定的工作,有时候延时达500毫秒,不知道是什么原因,或者说有没有什么解决办法?
twoconk 2010-03-04
  • 打赏
  • 举报
回复
今天下午尝试用FIFO播放MP3文件,基本前几秒保持连续,使用方法:

ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_FIFO, (void**)&pMe->m_pFIFO);

IFIFO_OpenEx(pMe->m_pFIFO, “fifo:/shared/foobar”, AEEFIFO_MODE_RW);//注意,在对应的文件系统中有:fs:/shared/foobar这个目录

IFIFO_SetBufSize(pMe->m_pFIFO, 2048*4);//这个buff可以适当开的大些

IFIFO_Write(pMe->m_pFIFO, (char *)pMe->pMediaBuffer, pMe->dwMediaBufferSize);

其他一样,只需要修改:
pMe->mde.pData = (void *)pMe->m_pFIFO;//pMe->m_pISource;

然后网络数据到来时,只需要调用IFIFO_Write(pMe->m_pFIFO, (char *)pMe->pMediaBuffer, pMe->dwMediaBufferSize);
在读写数据时间恰当的情况下,基本上能保证播放的连续性
twoconk 2010-03-04
  • 打赏
  • 举报
回复
引用 11 楼 yuephone 的回复:
小弟接触Brew才两个星期, Brew里面有FIFO的数据结构吗


可以参考AEEFIFO.h 看看
yuephone 2010-03-04
  • 打赏
  • 举报
回复
小弟接触Brew才两个星期, Brew里面有FIFO的数据结构吗
twoconk 2010-03-04
  • 打赏
  • 举报
回复
通过你的描述来看:
在回调函数MediaNotifyCallback的MM_STATUS_DONE状态中重新设置播放函数,
ISHELL_Resume(pMe->a.m_pIShell,&pMe->m_cbAudio);
其中pMe->m_cbAudio重新调用1

貌似是播放完了pMe->pMediaBuffer 的数据之后,再播放pMe->pMediaBuffer的数据, 两个动作之间的时间差必然会产生断续,流程所限.

不知道能不能用FIFO 取代Source,将buffer中的数据写到fifo中,保持数据的连续性

关注楼主的最后实现~
yuephone 2010-03-02
  • 打赏
  • 举报
回复
我收到的AMR-NB数据大小是32个字节,解码完之后的大小是320个字节.
当我设置成MMD_ISOURCE的时候,发现本来应该是2秒的声音,播放的时候就200多毫秒.
2秒的文件大小是320*50*2=32K字节,是不是参数设置有问题
播放的日志显示如下:
OEMMediaCMX.c:4403 - ===Src setup: Start
OEMMediaCMX.c:4425 - ===Src setup: Done
OEMMediaCMX.c:3891 - ===Put:F:8820l W:8820l R:0l S:8820l===
OEMMediaCMX.c:3891 - ===Put:F:17640l W:17640l R:0l S:8820l===
OEMMediaCMX.c:3891 - ===Put:F:26460l W:26460l R:0l S:8820l===
OEMMediaCMX.c:3891 - ===Put:F:32000l W:32000l R:0l S:5540l===
OEMMediaCMX.c:1338 - ===Select Wave codec
OEMMediaCMX.c:4687 - ===Play codec
OEMMediaCMX.c:4693 - ===Play codec
OEMMediaCMX.c:3959 - ===CMXCB: pos=0l len=2048l
OEMMediaCMX.c:3891 - ===Put:F:20l W:20l R:0l S:20l===
Event - 0x0 Size 8 { 00 00 00 00 38 77 AA A1 }
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:29952l W:32000l R:2048l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=2048l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:40l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:27904l W:32000l R:4096l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=4096l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:60l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:25856l W:32000l R:6144l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=6144l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:0l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:23808l W:32000l R:8192l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=8192l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:20l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:21760l W:32000l R:10240l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=10240l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:40l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:19712l W:32000l R:12288l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=12288l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:60l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:17664l W:32000l R:14336l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=14336l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:0l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:15616l W:32000l R:16384l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:4075 - ===ReqSrc: MORE data
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:0l===
OEMMediaCMX.c:4183 - ===ReadSrc: EOS 0
*dbgprintf*:0 - ===CMXCB: pos=16384l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:20l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:13568l W:32000l R:18432l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=18432l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:40l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:11520l W:32000l R:20480l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=20480l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:60l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:9472l W:32000l R:22528l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=22528l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:0l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:7424l W:32000l R:24576l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=24576l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:20l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:5376l W:32000l R:26624l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=26624l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:40l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:3328l W:32000l R:28672l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:40l R:40l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=28672l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:60l R:40l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:1280l W:32000l R:30720l S:2048l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:60l R:60l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=30720l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:0l R:60l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:32000l R:32000l S:1280l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:0l R:0l S:0l===
*dbgprintf*:0 - ===CMXCB: pos=32000l len=2048l
*dbgprintf*:0 - ===Put:F:20l W:20l R:0l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:20l===
OEMMediaCMX.c:3941 - ===Get:F:0l W:32000l R:32000l S:0l===
OEMMediaCMX.c:4002 - ===CMXNotify: nReq=2048l nLen=2048
OEMMediaCMX.c:3941 - ===Get:F:0l W:20l R:20l S:0l===
线程 'Win32 线程' (0xb14) 已退出,返回值为 0 (0x0)。
OEMMediaCMX.c:4445 - ===Flushing stream data...
yuephone 2010-03-02
  • 打赏
  • 举报
回复
sxcnfly,你好!
MEMSET(&pMe->spec, (int)0, sizeof(pMe->spec));
pMe->spec.wSize = sizeof(pMe->spec);
pMe->spec.clsMedia = AEECLSID_MEDIAPCM;
pMe->spec.wChannels = 1;
pMe->spec.dwSamplesPerSec = 8000;
pMe->spec.wBitsPerSample = 16;
pMe->spec.wBlockSize = pMe->spec.wChannels * pMe->spec.wBitsPerSample/8;
pMe->spec.dwBytesPerSec = pMe->spec.dwSamplesPerSec * pMe->spec.wChannels * pMe->spec.wBitsPerSample/8;
pMe->spec.bUnsigned= FALSE;

pMe->mde.clsData = MMD_BUFFER;
pMe->mde.pData = (void *)pMe->pMediaBuffer;
pMe->mde.dwSize = 6400;
pMe->mde.dwStructSize = sizeof(pMe->mde);
pMe->mde.dwCaps = 0;
pMe->mde.bRaw = TRUE;
pMe->mde.dwBufferSize = 0;
pMe->mde.pSpec = &pMe->spec;
pMe->mde.dwSpecSize = sizeof(pMe->spec);
播放的时候,没有声音.
我是在模拟器上测试的.
日志上打印如下信息:
OEMMediaCMX.c:1338 - ===Select Wave codec
OEMMediaCMX.c:4687 - ===Play codec
OEMMediaCMX.c:4693 - ===Play codec
Event - 0x0 Size 8 { 00 00 00 00 38 77 AA A1 }
其它的,没有了.是不是我的设置有问题?
sxcnfly 2010-03-02
  • 打赏
  • 举报
回复
既然这样buffer方式应该可以的,我曾经用过。。。
yuephone 2010-03-01
  • 打赏
  • 举报
回复
sxcnfly你好!
我播放的格式不是ARM-NB的,我已经解码成PCM数据流了...
解完之后的PCM是流的格式.有Mobile上是没问题的
sxcnfly 2010-03-01
  • 打赏
  • 举报
回复
amr本身是有头信息的,不支持流播放的,只能下载完成之后在播放。
sxcnfly 2010-03-01
  • 打赏
  • 举报
回复
因为你本身不是流媒体格式,mp3就可以的。
yuephone 2010-03-01
  • 打赏
  • 举报
回复
sxcnfly你好:
我试了用buffer的方式,在调用IMEDIA_SetMediaDataEx会显示失败...后来只能改用Source
strayedbird 2010-03-01
  • 打赏
  • 举报
回复
缓冲区大小调整大一些,放得下1秒的帧数据,也许能够解决问题
sxcnfly 2010-02-28
  • 打赏
  • 举报
回复
source接口在我们芯片是不支持的,因此我也没有使用过,在线播放我们是通过buffer方式来支持的。

2,851

社区成员

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

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