海思3516开发记录-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
转载请注明出处,如有不当欢迎指正
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)