海思3516开发记录-AAC音频解码

海思平台播放AAC文件

  • 1.说明
  • 2.音频解码
    • 音频API 参考:
    • 解码aac流程:
    • 音频设置
    • 音频解码相关错误码

1.说明

海思3516平台内置了aac解码库,可以直接解码aac音频文件,但要支持mp3播放的话就需要下载一个额外的mp3解码库,进行移植。意思就是内置解码库只支持aac解码。音频组件提供的编解码功能基于独立封装的 AAC 编解码库,核心编解码器工作在用户态,使用 CPU 软件编解码。
下面我主要记录下aac解码过程。

2.音频解码

音频API 参考:

  • HI_MPI_AENC_RegisterEncoder: 注册编码器。
  • HI_MPI_AENC_UnRegisterEncoder: 注销编码器。
  • HI_MPI_ADEC_RegisterDecoder: 注册解码器。
  • HI_MPI_ADEC_UnRegisterDecoder: 注销解码器。
  • HI_MPI_AENC_AacInit: 注册 AAC 编码器。
  • HI_MPI_ADEC_AacInit: 注册 AAC 解码器

解码aac流程:

步骤1:mpp系统初始化

步骤2:注册解码器   
 
步骤3:打开音频解码器,创建解码通道
   
步骤4:打开音频AO,创建AO通道

步骤5:音频AO绑定到ADEC

步骤6:音频解码器配置参数

步骤7:打开音频文件->解码

至此,音频播放就完成。美妙的音乐就会在耳边响起。
音频播放需要开启线程,在线程里不断读取数据发送
HI_MPI_ADEC_SendStream();
直到所有数据解码完成,结束本次解码流程,解码结束后要释放相关资源,否则会造成内存泄漏。

音频设置

这里俩种方法都可以使用,
方法1:通过ioctl进行音量设置,
方法2:通过海思接口进行AO音量设置。

//方法1
int Hisi_audio_set_volume(const int vol)
{
    int iAcodecOutputvol = vol;
    HI_S32 fdAcodec = -1;
    fdAcodec = open(ACODEC_FILE, O_RDWR);
    if (fdAcodec < 0)
    {
        printf("%s: can't open Acodec,%s\n", __FUNCTION__, ACODEC_FILE);
        return HI_FAILURE;
    }
    if(ioctl(fdAcodec, ACODEC_SET_OUTPUT_VOL, &iAcodecOutputvol))
    {
        printf("[%s::%d] ACODEC_SET_OUTPUT_VOL fail : %x  \n",__func__,__LINE__,iAcodecOutputvol);
        return HI_FAILURE;
    }
    printf("[%s::%d] ACODEC_SET_OUTPUT_VOL : %x  \n",__func__,__LINE__,iAcodecOutputvol);
    close(fdAcodec);    
    fflush(stdout);
    
    return HI_SUCCESS;
}

//方法2
int Hisi_audio_set_volume(const int vol)
{
    HI_S32 s32Ret = HI_MPI_AO_SetVolume(AoDev, (HI_S32)iAcodecOutputvol);
    if (HI_SUCCESS != s32Ret)
    {
        printf("%s: HI_MPI_AO_SetVolume(%d), failed with %#x!\n", \
               __FUNCTION__, AoDev, s32Ret);
        return HI_FAILURE;   
    }
    printf("set volume %d          \n", iAcodecOutputvol);
    return HI_SUCCESS;
}

需要注意的是,音频音量等相关操作必须音频解码通道创建后操作,否则会报错0x0188005。
音频音量获取接口类似,大家可以自行测试一下。还有需要注意的一点是音频参数的配置,
AUDIO_SAMPLE_RATE_44100,设置比特率44100,那么音频文件也要是这个码率。否则播放的时候会失真甚至解码失败。

音频解码相关错误码

错误码 错误原因
0xA0188001 音频解码设备号无效
0xA0188002 音频解码通道号无效
0xA0178003 音频解码参数设置无效
0xA0178005 音频解码通道未创建
0xA0178006 输入参数空指针错误
0xA0178007 编码通道未配置
0xA0178008 操作不被支持
0xA0178009 操作不允许
0xA017800C 系统内存不足
0xA0178007D 解码通道缓存分配失败
0xA018800E 解码通道缓存空
0xA018800F 解码通道缓存满
0xA0188010 系统没有初始化
0xA0188040 音频解码数据错误

aac解码介绍到此结束。
有喜欢的小伙伴点个赞!

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正

你可能感兴趣的:(Linux,linux,arm,音频编码解码,aac)