nescafea

nescafea

0个粉丝

2

问答

0

专栏

0

资料

nescafea  发布于  2016-06-08 17:02:13
采纳率 0%
2个问答
5220

请教Hi3518无法从Ai获取音频数据的问题

 

     本人是新手,请教大家关于Hi3518音频获取的问题。
     目前我基于sample_audio来进行调测,通过从Ai直接获取RAW audio data,然后发送给客户端来直接播放。我设置了audio playload type为LPCM,所以我的理解是RAW audio data就是PCM格式的数据,其他参数为8000HZ,16bit采样,单声道。但是实际运行发现客户端始终没有声音,后来将收到的audio data保存为WAV文件,在PC上观察其频谱发现是一条幅度为0的没有起伏的直线,感觉没有获取到正确的raw data。为了进一步排除,我事先录制了一个8000HZ,16bit采样,单声道的WAV文件,每次select到Ai有数据时,实际发送WAV文件中的PCM数据,则客户端可以听到事先录制好的声音。

     我基本排除了硬件、MIC的焊接等原因,始终怀疑是代码内部AI相关的代码有问题,但是由于没什么经验一直没能确定原因。先把相关的代码贴出来,请大家指教。

   (1)  
    stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000;
    stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
    stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER;
    stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
    stAioAttr.u32EXFlag = 1;
    stAioAttr.u32FrmNum = 30;
    stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
    stAioAttr.u32ChnCnt = 2;
    stAioAttr.u32ClkSel = 1;

   (2) 配置audio codec
    fdAcodec = open("/dev/acodec", O_RDWR);
    if (fdAcodec < 0)
    {
        printf("%s: can't open acodec,%s\n", __FUNCTION__, ACODEC_FILE);
        return HI_FAILURE;

    }

   (3) 下面的代码中bMicIn这时值为HI_FALSE,所以if中的代码没执行,不过我也试过改为HI_TRUE,现象相同。
    if (ioctl(fdAcodec, ACODEC_SET_I2S1_FS, &i2s_fs_sel))  //设置采样格式
    {
        printf("%s: set acodec sample rate failed\n", __FUNCTION__);
        close(fdAcodec);
        return HI_FAILURE;
    }

    if (HI_TRUE == bMicIn)
    {
        /*do not select micin */
#if 0
        mixer_mic_ctrl = 1;
        if (ioctl(fdAcodec, ACODEC_SET_MIXER_MIC, &mixer_mic_ctrl))
        {
            printf("%s: set acodec micin failed\n", __FUNCTION__);
            close(fdAcodec);
            return HI_FAILURE;
        }
#endif

        i2s_val = 0x00;
        if (ioctl(fdAcodec, ACODEC_SET_MICL_MUTE, &i2s_val))
        {
            printf("%s: set acodec micin mute off failed\n", __FUNCTION__);
            close(fdAcodec);
            return HI_FAILURE;
        }

        if (ioctl(fdAcodec, ACODEC_SET_MICR_MUTE, &i2s_val))
        {
            printf("%s: set acodec micin mute off failed\n", __FUNCTION__);
            close(fdAcodec);
            return HI_FAILURE;
        }

        /* set volume plus (0~0x1f,default 0x0c) */
        gain_mic = 0x18;
        if (ioctl(fdAcodec, ACODEC_SET_GAIN_MICL, &gain_mic))
        {
            printf("%s: set acodec micin volume failed\n", __FUNCTION__);
            close(fdAcodec);
            return HI_FAILURE;
        }

        if (ioctl(fdAcodec, ACODEC_SET_GAIN_MICR, &gain_mic))
        {
            printf("%s: set acodec micin volume failed\n", __FUNCTION__);
            close(fdAcodec);
            return HI_FAILURE;
        }
    }
    else
    {
    }

    close(fdAcodec);

   (4) start Ai
    SAMPLE_COMM_AUDIO_StartAi(......)
  
   (5) create thread to call select to read RAW data from Ai

    大致流程就是如上所描述,拜托大家不吝指教!!!

     
   
我来回答
回答11个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-08 17:10:37
认可0
把运行时的 /proc/umap/ai 贴出来

nescafea

0个粉丝

2

问答

0

专栏

0

资料

nescafea 2016-06-08 17:41:39
认可0
[AI] Version: [Hi3518_MPP_V1.0.8.1 ], Build Time: [Mar 18 2014, 11:52:07]

-----AI DEV ATTR---------------------------------------------------------------------------------------------------------
AiDev WorkMod   SampR  BitWid  ChnCnt  ClkSel SondMod  PoiNum  ExFlag  FrmNum
    0 i2s_mas    8kHZ   16bit       2       1    mono     320       1      30

-----AI DEV STATUS-------------------------------------------------------------------------------------------------------
AiDev      IntCnt FrmTime  MaxFrmTime  DMAChn  DMAReq TranLen IsrTime  MaxIsrTime   DMAPhy0   DMAPhy1 CurDMAPhy PinPon    ErrCnt
    0        1452   40013       41698       0       0    2560     418         461  830ab000  830aba00  830ab000      1         0

-----AI CHN STATUS-------------------------------------------------------------------------------------------------------
AiDev   AiChn   State    Read   Write      BufFul u32Data0 u32Data1   AecAo     AecFail    bAnr  bResmp  PoiNum   SampR ResmpType
    0       0  enable       0       0           0        2 ffff0008 (-1,-1)           0 disable disable       0  (null)    (null)
    0       1  enable       0       0           0 fffd0002    8fffe (-1,-1)           0 disable disable       0  (null)    (null)

请指教。

csuzhsh

1个粉丝

14

问答

0

专栏

0

资料

csuzhsh 2016-06-10 07:50:22
认可0
你是通过外挂音频芯片通过I2S获取数据

nescafea

0个粉丝

2

问答

0

专栏

0

资料

nescafea 2016-06-11 01:14:56
认可0
抱歉,我对硬件这部分不是特别熟悉。目前我是使用3518的开发板,请教了熟悉的硬件人员,他们也不确定是不是通过I2S从外挂获取音频。怎么看出来是通过外挂音频芯片通过I2S获取数据?
我看3518的手册,3518只支持通过SIO且自己为I2S MASTER,需要为其他部分提供时钟,而且海思的示例代码也是上面的流程(不过示例代码的确也不出声音,这点我试过了),如果是通过外挂音频芯片通过I2S获取数据,那么上面的代码需要如何修改呢?或者硬件上还需要什么配置吗?请多指教,多谢了!!!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-12 08:15:22
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=31428&ptid=11555]nescafea 发表于 2016-6-11 01:14[/url]
抱歉,我对硬件这部分不是特别熟悉。目前我是使用3518的开发板,请教了熟悉的硬件人员,他们也不确定是不是 ...[/quote]

从ai的信息来看, 数据确实是很小  (   2 ffff0008 (-1,-1)  )基本为零

另外  stAioAttr.u32ClkSel = 1;
文档上说  
stAioAttr.u32ClkSel 配置AI 设备0 是否复用AO 设备0 的帧同步时钟及位流时钟。
取值:0、1。0:复用;1:复用。

楼主还开了Ao吗?不然设为0试一试

nescafea

0个粉丝

2

问答

0

专栏

0

资料

nescafea 2016-06-13 00:12:36
认可0
多谢您的建议,我试一下再来汇报结果。
还有一点我不明白,如果ai数据很小,那为什么我会正常select到数据呢?之前有过socket开发经验,没有数据时select应该不返回或者返回超时才对啊?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-13 08:04:32
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=31521&ptid=11555]nescafea 发表于 2016-6-13 00:12[/url]
多谢您的建议,我试一下再来汇报结果。
还有一点我不明白,如果ai数据很小,那为什么我会正常select到数据 ...[/quote]

有没有和小不小好像没必然联系吧

数据的值小表示有数据, 所以select返回有数据

nescafea

0个粉丝

2

问答

0

专栏

0

资料

nescafea 2016-06-13 15:48:34
认可0
      我测试了楼上兄台所说的将stAioAttr.u32ClkSel改为0的情况,声音依旧不正常。
      我仔细梳理了一下软件的流程,在初始化MPP后,设置了stAioAttr的各个成员,其中大多数成员的设置没什么可怀疑的,u32ClkSel设置为0和1的情况我也都进行了测试,问题依旧。
      根据datasheet,我使用的3518E使用 SIO 接口做为音频接口,且文档中提到Hi3518/Hi3516C 使用内部 audio codec,SIO0 只支持 I2S主模式,可用于对讲,所以我设置了AIO_MODE_I2S_MASTER。
      我目前只需要从Ai获取RAW audio data,所以在配置完codec之后,我只启动了Ai,create thread去从Ai所对应的句柄select数据,aenc及ao则根本没有去start,按说流程很简单,不知道问题出在哪里。
      配置codec的流程首先做了soft reset,然后下发了ACODEC_SET_I2S1_FS,参数为0x18。整个过程中没有出现任何错误,但是声音就是没出来。目前将客户端音量开到最大,可以听见声音很小的白噪声。配置codec的代码里面有选择将MIC设置为MIXER的流程,但是注释掉了,关掉注释也没有出声音。
      到处搜索了一下,有人提到遇到类似问题,提到最终将MIC又改为LINEIN后就好了,但是我确实没理解是硬件上改动了接线还是软件里进行了MIXER的设置,我也尝试将MIXER修改为LINEIN,没什么效果。
     能够提供的信息基本就这些,请大家多指教,我确实是黔驴技穷了......

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-13 16:02:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=31565&ptid=11555]nescafea 发表于 2016-6-13 15:48[/url]
我测试了楼上兄台所说的将stAioAttr.u32ClkSel改为0的情况,声音依旧不正常。
      我仔细梳理了一 ...[/quote]


海思的音频部分是很简单的,硬件没问题的情况下基本没难度,尤其是使用内置codec的情况

从ai信息来看是采集的声音数据值很小

如果认为软件没有问题, 要考虑一下输入的问题了

1. 使用什么做为声音源? 建议使用PC或手机,用耳机线输出做为输入, 声音调到最大
2. 和硬件确认接入部分没有问题, 不然是浪费时间

nescafea

0个粉丝

2

问答

0

专栏

0

资料

nescafea 2016-06-15 15:12:33
认可0
  多谢大家的耐心指导,最终使用LINEIN管脚外接音源终于听见了正常的声音。从datasheet的说明猜测,可能是MIC电路没有加偏置,多谢楼上的英雄。:handshake

qn1513739312

0个粉丝

1

问答

0

专栏

0

资料

qn1513739312 2017-12-29 10:09:15
认可0
楼主问题解决了么?
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区