当前位置: 首页 » 博客 » 技术文章 » 正文

3531立体声调试

放大字体  缩小字体 发布日期:2017-11-22  作者:GoodMan  浏览次数:109
核心提示:先决条件:* Hi3531 平台uclibc* 使用SIO4I2S连接 TLV320AIC31 48K采样STEROR(立体声) u32ChnCnt=2通道海思关于立体声这有这么
先决条件: * Hi3531 平台uclibc * 使用SIO4 I2S连接 TLV320AIC31 48K采样 STEROR(立体声) u32ChnCnt=2通道 海思关于立体声这有这么一个简单的说明: > ***对于双声道模式,只应对左声道(即编号小于设备属性中通道数 u32ChnCnt 一半的通 道)进行操作, SDK 内部会自动对右声道也进行相应的操作。*** 那么问题来了(AI通道为0,1): 1. 数据是走通道的,双声道是的数据都走通道0 还是左声道走Aich0,右声道走Aich1 2. AI(4,0)--->AENC(0) 有数据 AI(4,1)--->AENC(1) 无数据 AI 调试信息 ![](/uploads/1511350761_88283.jpg) 我这里使用的是LPCM格式,原始的未压缩的PCM格式 1. 确定你使用的SIO口,这个是硬件连接请确保你使用的是正确的 ``` #define SAMPLE_AUDIO_PTNUMPERFRM 320 #if HICHIP == HI3531_V100 #define SAMPLE_AUDIO_AI_DEV 4 // 硬件确定后该这里,我使用的是SIO4 #else #define SAMPLE_AUDIO_AI_DEV 0 #endif #define SAMPLE_AUDIO_AO_DEV 4 ``` 2. 确定AI属性是立体声 ``` stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_48000; // 48K sample stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; stAioAttr.enWorkmode = AIO_MODE_I2S_SLAVE; stAioAttr.enSoundmode = AUDIO_SOUND_MODE_STEREO; //立体声 stAioAttr.u32EXFlag = 1; stAioAttr.u32FrmNum = 30; stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; stAioAttr.u32ChnCnt = 2; // 只使用2个AI通道,最大支持16个通道 stAioAttr.u32ClkSel = 1; ``` 3. 只使能stAioAttr.u32ChnCnt 小于 stAioAttr.u32ChnCnt/2的ai通道 原因是这个: > ***对于双声道模式,只应对左声道(即编号小于设备属性中通道数 u32ChnCnt 一半的通 道)进行操作, SDK 内部会自动对右声道也进行相应的操作。*** 4. 使用UserGetMode ``` HI_S32 HI_MPI_AI_GetFrame(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_FRAME_S *pstFrm, AEC_FRAME_S *pstAecFrm, HI_BOOL bBlock); typedef struct hiAUDIO_FRAME_S { AUDIO_BIT_WIDTH_E enBitwidth; AUDIO_SOUND_MODE_E enSoundmode; HI_VOID *pVirAddr[2];// 双声道下pVirAddr[0]表示左声道,pVirAddr[1]表示右声道 HI_U32 u32PhyAddr[2]; HI_U64 u64TimeStamp; HI_U32 u32Seq; HI_U32 u32Len; HI_U32 u32PoolId[2]; }AUDIO_FRAME_S; ``` 最为关键的就是数据的存储问题,一开始我是这样存储数据的。 ``` fwrite(stFrame.pVirAddr[0], 1 ,stFrame.u32Len , pstAiCtl->pfd); fwrite(stFrame.pVirAddr[1], 1 ,stFrame.u32Len , pstAiCtl->pfd); ``` 写成文件怎么也不对,后来Google了下PCM格式才知道是数据格式问题,改成这样 ``` for(i=0; ipfd); fwrite(stFrame.pVirAddr[1]+i, 1 ,2 , pstAiCtl->pfd); } ``` LPCM各个模式下的数据存储格式: ![](/uploads/1511350784_97533.jpg) 也就是说数据是交错排放的,有点类似于YUV里面的packed模式。 最后遗留的问题是不管使用SYS_BIND的方式还是在AiChn里面使用 HI_MPI_AENC_SendFrame发送编码真,使用HI_MPI_AENC_GetStream取得的数据始终是mono的,不知道为什么。 测试的效果如下: ![](/uploads/1511350864_20748.jpg)
 
关键词: audio,立体声
 
[ 博客搜索 ]  [ 加入收藏 ]  [ 告诉好友 ]  [ 打印本文 ]  [ 违规举报 ]  [ 关闭窗口 ]

 
0条 [查看全部]  相关评论

 
推荐图文
推荐博客
点击排行