Mew

Mew

0个粉丝

3

问答

0

专栏

0

资料

Mew  发布于  2018-08-01 14:28:23
采纳率 0%
3个问答
3852

请教如何播放双声道的PCM音频数据

 
Hi3518EV200。
我在打开输出设备后,打开并绑定了2个输出通道和解码通道,分别往2个解码通道发送数据,但是执行时只能听到通道0,也就是左声道的声音,通道2没声音且不断提示“[Func]:HI_MPI_AO_SendFrame [Line]:1854 [Info]:AO chn 1 is not enable”。
如果是打开输出设备后,只打开并绑定1个输出通道和解码通道,出来的声音很慢,听起来像是以单声道的速度在播放。
应该怎么做才能正确输出左右2个声道的声音呢?
[code]
int main()
{
    HI_S32 ret;

    VB_CONF_S vbConf;
    MPP_SYS_CONF_S mppSysConf;
    HI_S32 fdAcodec;
    ACODEC_FS_E i2sFs;

    AUDIO_DEV aoDev = 0;
    AO_CHN aoChnL = 0;
    AO_CHN aoChnR = 1;
    ADEC_CHN adecChnL = 0;
    ADEC_CHN adecChnR = 1;

    AIO_ATTR_S aoAttr;
    ADEC_ATTR_LPCM_S adecAttrLpcm;
    ADEC_CHN_ATTR_S adecChnAttr;
    MPP_CHN_S mppSrcChnL, mppDstChnL;
    MPP_CHN_S mppSrcChnR, mppDstChnR;
    AUDIO_STREAM_S streamL;
    AUDIO_STREAM_S streamR;

    FILE *fpL = NULL;
    FILE *fpR = NULL;
    char bufL[640] = {0};
    char bufR[640] = {0};
    HI_U32 size = 0;


    //初始化MPP系统
    HI_MPI_SYS_Exit();
    HI_MPI_VB_Exit();
    memset(&vbConf, 0, sizeof(VB_CONF_S));
    HI_MPI_VB_SetConf(&vbConf);
    HI_MPI_VB_Init();
    mppSysConf.u32AlignWidth = 64;
    HI_MPI_SYS_SetConf(&mppSysConf);
    HI_MPI_SYS_Init();

    //初始化AudioCodec
    fdAcodec = open(ACODEC_FILE, O_RDWR);
    ioctl(fdAcodec, ACODEC_SOFT_RESET_CTRL);
    i2sFs = ACODEC_FS_44100;
    ioctl(fdAcodec, ACODEC_SET_I2S1_FS, &i2sFs);
    close(fdAcodec);

    //打开输出设备
    aoAttr.enSamplerate   = AUDIO_SAMPLE_RATE_44100;
    aoAttr.enBitwidth     = AUDIO_BIT_WIDTH_16;
    aoAttr.enWorkmode     = AIO_MODE_I2S_MASTER;
    aoAttr.enSoundmode    = AUDIO_SOUND_MODE_STEREO;
    aoAttr.u32EXFlag      = 0;
    aoAttr.u32FrmNum      = 30;
    aoAttr.u32PtNumPerFrm = 320;
    aoAttr.u32ChnCnt      = 2;
    aoAttr.u32ClkSel      = 0;
    ret = HI_MPI_AO_SetPubAttr(aoDev, &aoAttr);
    if(ret != HI_SUCCESS)
    {
        printf("HI_MPI_AO_SetPubAttr error: 0x%x\n", ret);
    }
    ret = HI_MPI_AO_Enable(aoDev);
    if(ret != HI_SUCCESS)
    {
        printf("HI_MPI_AO_Enable error: 0x%x\n", ret);
    }

    //打开输出通道
    ret = HI_MPI_AO_EnableChn(aoDev, aoChnL);
    if(ret != HI_SUCCESS)
    {
        printf("HI_MPI_AO_EnableChn error: 0x%x\n", ret);
    }
    //HI_MPI_AO_EnableChn(aoDev, aoChnR);   //根据文档描述不用使能此通道

    //打开解码通道
    adecChnAttr.enType = PT_LPCM;
    adecChnAttr.u32BufSize = 20;
    adecChnAttr.enMode = ADEC_MODE_PACK;
    adecChnAttr.pValue = &adecAttrLpcm;
    HI_MPI_ADEC_CreateChn(adecChnL, &adecChnAttr);
    HI_MPI_ADEC_CreateChn(adecChnR, &adecChnAttr);

    //绑定输出通道和解码通道
    mppSrcChnL.enModId = HI_ID_ADEC;
    mppSrcChnL.s32DevId = 0;
    mppSrcChnL.s32ChnId = adecChnL;
    mppDstChnL.enModId = HI_ID_AO;
    mppDstChnL.s32DevId = aoDev;
    mppDstChnL.s32ChnId = aoChnL;
    HI_MPI_SYS_Bind(&mppSrcChnL, &mppDstChnL);
    mppSrcChnR.enModId = HI_ID_ADEC;
    mppSrcChnR.s32DevId = 0;
    mppSrcChnR.s32ChnId = adecChnR;
    mppDstChnR.enModId = HI_ID_AO;
    mppDstChnR.s32DevId = aoDev;
    mppDstChnR.s32ChnId = aoChnR;
    HI_MPI_SYS_Bind(&mppSrcChnR, &mppDstChnR);

    //设置音量
    HI_MPI_AO_SetVolume(aoDev, 6);

    //开始播放
#if(0)
    fpL = fopen("/tfcard/chan1.wav", "r+");
    fpR = fopen("/tfcard/chan1-1.wav", "r+");
    while(1)
    {
        size = fread(bufL, 1, sizeof(bufL), fpL);
        if(size == 0) break;
        streamL.pStream = (HI_U8 *)bufL;
        streamL.u32Len = size;
        HI_MPI_ADEC_SendStream(adecChnL, &streamL, HI_TRUE);

        size = fread(bufR, 1, sizeof(bufR), fpR);
        if(size == 0) break;
        streamR.pStream = (HI_U8 *)bufR;
        streamR.u32Len = size;
        HI_MPI_ADEC_SendStream(adecChnR, &streamR, HI_TRUE);
    }
    fclose(fpL);
    fclose(fpR);
#else
    fpL = fopen("/tfcard/chan2.wav", "r+");
    while(1)
    {
        size = fread(bufL, 1, sizeof(bufL), fpL);
        if(size == 0) break;
        streamL.pStream = (HI_U8 *)bufL;
        streamL.u32Len = size;
        HI_MPI_ADEC_SendStream(adecChnL, &streamL, HI_TRUE);
    }
    fclose(fpL);
#endif

    //关闭通道
    HI_MPI_SYS_UnBind(&mppSrcChnL, &mppDstChnL);
    HI_MPI_SYS_UnBind(&mppSrcChnR, &mppDstChnR);
    HI_MPI_AO_DisableChn(aoDev, aoChnL);
    HI_MPI_AO_DisableChn(aoDev, aoChnR);
    HI_MPI_AO_Disable(aoDev);
    HI_MPI_ADEC_DestroyChn(adecChnL);
    HI_MPI_ADEC_DestroyChn(adecChnR);

    //关闭MPP系统
    HI_MPI_SYS_Exit();
    HI_MPI_VB_Exit();

    return 0;
}
[/code]
我来回答
回答7个
时间排序
认可量排序

Mew

0个粉丝

3

问答

0

专栏

0

资料

Mew 2018-08-01 18:50:05
认可0
自己顶一下,希望有高手们指点一下。

封锁记忆

0个粉丝

39

问答

0

专栏

1

资料

封锁记忆 2018-08-02 18:53:45
认可0
18E好像只能单通道吧

win992590594

0个粉丝

6

问答

0

专栏

0

资料

win992590594 2018-08-13 18:44:13
认可0
楼主解决了吗?

win992590594

0个粉丝

6

问答

0

专栏

0

资料

win992590594 2018-08-14 22:27:08
认可0
楼主解决了的话,求指导解决方法

jipd

0个粉丝

14

问答

0

专栏

0

资料

jipd 2018-08-02 16:01:34
认可0
帮顶。。。。:victory::victory:

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2018-08-03 09:42:39
认可0
:lol:lol:lol:lol:lol:lol:lol

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2018-08-14 10:07:49
认可0
:lol:lol:lol:lol:lol
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区