立即注册
查看: 1573|回复: 0

[问题] Hi3531立体声(双声道)采集问题

发表于 2017-4-17 11:33:36 | 显示全部楼层 |阅读模式 来自 广东省深圳市
先决条件:

hi3531平台uclibc使用SIO4 I2S连接 TLV320AIC31 48K采样 STEROR(立体声) u32ChnCnt=2通道

海思关于立体声这有这么一个简单的说明:

对于双声道模式,只应对左声道(即编号小于设备属性中通道数 u32ChnCnt 一半的通 道)进行操作, SDK 内部会自动对右声道也进行相应的操作。

那么问题来了(AI通道为0,1):

数据是走通道的,双声道是的数据都走通道0 还是左声道走Aich0,右声道走Aich1AI(4,0)--->AENC(0) 有数据

AI(4,1)--->AENC(1) 无数据 (我现在就是走2个通道的,但是通道1没有数据)如果是只操作通道0保存PCM播放还是单通道的

AI 调试信息:



海思的双通道数据数据到底该怎么用?

====================================

经过2天的调试立体声的数据可以出来了,下面和大家分享下调试的过程

我这里使用的是LPCM格式,原始的未压缩的PCM格式.
1.确定你使用的SIO口,这个是硬件连接请确保你使用的是正确的

  1. #define SAMPLE_AUDIO_PTNUMPERFRM 320
  2. #if HICHIP == HI3531_V100
  3. #define SAMPLE_AUDIO_AI_DEV 4// 硬件确定后该这里,我使用的是SIO4
  4. #else
  5. #define SAMPLE_AUDIO_AI_DEV 0
  6. #endif
  7. #define SAMPLE_AUDIO_AO_DEV 4
复制代码
2. 确定AI属性是立体声
  1. /* init stAio. all of cases will use it */

  2.   stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_48000; // 48K sample

  3.   stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;

  4.   stAioAttr.enWorkmode = AIO_MODE_I2S_SLAVE;

  5.   stAioAttr.enSoundmode =AUDIO_SOUND_MODE_STEREO; //立体声

  6.   stAioAttr.u32EXFlag = 1;

  7.   stAioAttr.u32FrmNum = 30;

  8.   stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;

  9.   stAioAttr.u32ChnCnt = 2; // 只使用2个AI通道,最大支持16个通道

  10.   stAioAttr.u32ClkSel = 1;

复制代码
3.只使能stAioAttr.u32ChnCnt 小于 stAioAttr.u32ChnCnt/2的ai通道

原因是这个:
对于双声道模式,只应对左声道(即编号小于设备属性中通道数 u32ChnCnt 一半的通 道)进行操作, SDK 内部会自动对右声道也进行相应的操作。

4.使用UserGetMode方式取数据
  1. HI_S32 HI_MPI_AI_GetFrame(AUDIO_DEV AudioDevId, AI_CHN AiChn,
  2. AUDIO_FRAME_S *pstFrm, AEC_FRAME_S *pstAecFrm, HI_BOOL bBlock);


  3. typedef struct hiAUDIO_FRAME_S
  4. {
  5. AUDIO_BIT_WIDTH_E enBitwidth; /*audio frame bitwidth*/
  6. AUDIO_SOUND_MODE_E enSoundmode; /*audio frame momo or stereo mode*/
  7. HI_VOID *pVirAddr[2];// 双声道下pVirAddr[0]表示左声道,pVirAddr[1]表示右声道
  8. HI_U32 u32PhyAddr[2];
  9. HI_U64 u64TimeStamp;/*audio frame timestamp*/
  10. HI_U32 u32Seq; /*audio frame seq*/
  11. HI_U32 u32Len; /*data lenth per channel in frame*/
  12. HI_U32 u32PoolId[2];
  13. }AUDIO_FRAME_S;
复制代码

最为关键的就是数据的存储问题,一开始我是这样存储数据的。

  1. fwrite(stFrame.pVirAddr[0],1 ,stFrame.u32Len , pstAiCtl->pfd);
  2. fwrite(stFrame.pVirAddr[1],1 ,stFrame.u32Len , pstAiCtl->pfd);
复制代码

写成文件怎么也不对,后来Google了下PCM格式才知道是数据格式问题,改成这样

  1. for(i=0; i<stFrame.u32Len; i+=2) {
  2.   fwrite(stFrame.pVirAddr[0]+i,1 ,2 , pstAiCtl->pfd);        
  3.   fwrite(stFrame.pVirAddr[1]+i,1 ,2 , pstAiCtl->pfd);        
  4. }
复制代码

LPCM各个模式下的数据存储格式:


也就是说数据是交错排放的,有点类似于YUV里面的packed模式。

一个遗留的问题是不管使用SYS_BIND的方式还是在AiChn里面使用 HI_MPI_AENC_SendFrame发送编码真,使用HI_MPI_AENC_GetStream取得的数据始终是mono的,不知道为什么。

如果有知道的朋友麻烦分享下。

最后丢个测试的图片和我录的PCM(48k 16bit STEREO)数据给大家,需要的下载测试


我知道答案 回答被采纳将会获得5 RD币 已有0人回答
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表