硬件相关内容

ACC编解码器

海思平台内置了ACC编解码器。

音频接口

音频输入输出接口简称AIO(Audio Input/Output)接口,用于和Audio Codec对接,完成声音的录制和播放。AIO接口分为两种类型:只支持输入或只支持输出,当为输入类型时,又称为 AIP,当为输出类型时,又称为 AOP。

软件中负责抽象音频接口输入功能的单元,称之为 AI 设备;负责抽象音频接口输出功能的单元,称之为 AO 设备。

对每个输入输出接口,软件根据该接口支持的功能,分别与 AI 设备和 AO 设备建立映射关系。例如:AIP0 只支持音频输入,则 AIP0 映射为 AiDev0;AOP0 只支持音频输出,则 AOP0 映射为 AoDev0。

播放原理

芯片利用 DMA 将内存中的数据传输到 AO 设备。AO设备通过 I2S 时序或 PCM 时序向 Audio Codec 发送数据。Audio Codec 完成数字信号到模拟信号的转换过程,并输出模拟信号。示意图如下所示。

音频接口时序

支持标准 IIS 接口时序模式和 PCM 接口时序模式,并提供灵活的配置以支持与多种 Audio Codec 对接。详细的时序支持情况请参考对应芯片的用户指南。

AI、AO通道

API相关

音频相关的API都在HiMPP中。

音频 API 接口依赖 HI_MPI_SYS_Init 和 HI_MPI_SYS_Exit 的顺序调用,不支持异步调用 HI_MPI_SYS_Init 和 HI_MPI_SYS_Exit。

基本流程

1、创建独立线程。

2、先调用 HI_MPI_SYS_Init()。

3、调用音频相关的接口初始化,如 HI_MPI_ADEC_AacInit()。

4、打开fopen()音频文件。

5、读取文件。

6、发送frame到AO接口

....

n、出初始化时,需要先调用音频相关接口去初始化,如 HI_MPI_ADEC_AacDeInit(),再调用 HI_MPI_SYS_Exit()。

重点函数

和ACC解码相关的 API 函数名称基本为 HI_MPI_ADEC_xxxx(),包括如下几个。

HI_MPI_ADEC_CreateChn

创建音频解码通道。

HI_MPI_ADEC_DestoryChn

销毁音频解码通道。

HI_MPI_ADEC_SendStream

发送音频解码流到音频解码通道。

  • 创建解码通道时可以指定解码方式为 pack 方式或 stream 方式。

    • - pack 方式用于确定码流包为一帧的情况下,比如从 AENC 直接获取的码流,从文件读取确切知道一帧边界(语音编码码流长度固定,很容易确定边界)的码流,效率较高。
    • - stream 方式用于不确定码流包为一帧的情况下,效率较低,且可能会有延迟。
  • 支持阻塞或非阻塞方式发送码流。
  • 当阻塞方式发送码流时,如果用于缓存解码后的音频帧的 Buffer 满,则此接口调用会被阻塞,直至解码后的音频帧数据被取走,或 ADEC 通道被销毁。

【参数】

AdChn 通道号。
取值范围:[0, ADEC_MAX_CHN_NUM)。
输入
pstStream 音频码流。 输入
bBlock 阻塞标识。
HI_TRUE:阻塞。
HI_FALSE:非阻塞。

HI_MPI_ADEC_ClearChnBuf

清除 ADEC 通道中当前的音频数据缓存。

HI_MPI_ADEC_RegisterDecoder

注册解码器。

HI_MPI_ADEC_UnRegisterDecoder

注销解码器。

HI_MPI_ADEC_GetFrame

获取音频解码帧数据。

HI_MPI_ADEC_ReleaseFrame

释放音频解码帧数据。

HI_MPI_ADEC_SendEndOfStream

向解码器发送码流结束标志符,并清除码流Buffer。

数据结构

AIO_ATTR_S

定义音频输入输出设备属性结构体。

typedef struct hiAIO_ATTR_S {AUDIO_SAMPLE_RATE_E enSamplerate; /*sample rate*/AUDIO_BIT_WIDTH_E enBitwidth; /*bitwidth*/AIO_MODE_E enWorkmode; /*master or slave mode*/AUDIO_SOUND_MODE_E enSoundmode; /*momo or steror*/HI_U32 u32EXFlag; /*expand 8bit to 16bit */HI_U32 u32FrmNum; /*frame num in buffer*/HI_U32 u32PtNumPerFrm; /*number of samples*/HI_U32 u32ChnCnt;HI_U32 u32ClkSel;AIO_I2STYPE_E enI2sType;
}AIO_ATTR_S;
enSamplerate 音频采样率(从模式下,此参数不起作用)。
静态属性。
enBitwidth 音频采样精度(从模式下,此参数必须和音频 AD/DA 的采样精
度匹配)。
静态属性。
enWorkmode 音频输入输出工作模式。
静态属性。
enSoundmode 音频声道模式。
静态属性。
u32EXFlag 取值范围:{0, 1, 2}。
 0:不扩展。
 1:扩展成 16 位,8bit 到 16bit 扩展标志(只对 AI 采样精度为
8bit 时有效)。
 2:24 位裁剪成 16 位,在外置 Codec 的场景下可能用到。
静态属性,保留参数,一般设置成 1 即可。
u32FrmNum 缓存帧数目。
取值范围:[2, MAX_AUDIO_FRAME_NUM]。
静态属性。
u32PtNumPerFrm 每帧的采样点个数。
取值范围:G711、G726、ADPCM_DVI4 编码时取值为 80、
160、240、320、480;ADPCM_IMA 编码时取值为 81、161、
241、321、481。
AI 取值范围为:[80, 2048],AO 取值范围为:[80, 4096]。
静态属性。
u32ChnCnt 支持的通道数目。
取值:1、2、4、8、16。
(输入最多支持 AIO_MAX_CHN_NUM 个通道,输出最多支持 2
个通道)。
u32ClkSel 配置 AI 设备 0 是否复用 AO 设备 0 的帧同步时钟及位流时钟。
取值:0、1。
0:不复用;
1:复用。
enI2sType 配置设备 I2S 类型 (仅
Hi3559AV100/Hi3519AV100/Hi3516CV500/Hi3516EV200 支持该
参数)。
AI 取值:AIO_I2STYPE_INNERCODEC,
AIO_I2STYPE_EXTERN
AO 取值:AIO_I2STYPE_INNERCODEC,
AIO_I2STYPE_EXTERN,AIO_I2STYPE_INNERHDMI。
静态属性。

ADEC_CHN_ATTR_S

定义解码通道属性结构体。

typedef struct hiADEC_CH_ATTR_S {PAYLOAD_TYPE_E enType;HI_U32 u32BufSize;ADEC_MODE_E enMode;HI_VOID ATTRIBUTE *pValue;
} ADEC_CHN_ATTR_S;
enType 音频解码协议类型。
静态属性。
u32BufSize 音频解码缓存大小。
取值范围:[2, MAX_AUDIO_FRAME_NUM],以帧为单位。
静态属性。
enMode 解码方式。
静态属性。
pValue 具体协议属性指针。

简单样例

来自海思 SDK 的 Sample 。

/******************************************************************************
* function : get stream from file, and send it  to Adec
******************************************************************************/
void *SAMPLE_COMM_AUDIO_AdecProc(SAMPLE_ADEC_S *pstAdec)
{HI_S32 s32Ret;AUDIO_STREAM_S stAudioStream;HI_U32 u32Len = 2048;HI_U32 u32ReadLen;HI_S32 s32AdecChn;HI_U8 *pu8AudioStream = NULL;SAMPLE_ADEC_S *pstAdecCtl = (SAMPLE_ADEC_S *)pstAdec;AO_CHN_STATE_S pstStatus;FILE *pfd = pstAdecCtl->pfd;s32AdecChn = pstAdecCtl->AdChn;pu8AudioStream = (HI_U8*)malloc(sizeof(HI_U8)*MAX_AUDIO_STREAM_LEN);if (NULL == pu8AudioStream){printf("%s: malloc failed!\n", __FUNCTION__);return NULL;}while (HI_TRUE == pstAdecCtl->bStart){/* read from file */stAudioStream.pStream = pu8AudioStream;u32ReadLen = fread(stAudioStream.pStream, 1, u32Len, pfd);if (u32ReadLen <= 0){/*s32Ret = HI_MPI_ADEC_SendEndOfStream(s32AdecChn, HI_FALSE);if (HI_SUCCESS != s32Ret){printf("%s: HI_MPI_ADEC_SendEndOfStream failed!\n", __FUNCTION__);}fseek(pfd, 0, SEEK_SET);*/printf("u32ReadLen <= 0 break! s32Ret:%d \n",s32Ret);break;}/* here only demo adec streaming sending mode, but pack sending mode is commended */stAudioStream.u32Len = u32ReadLen;s32Ret = HI_MPI_ADEC_SendStream(s32AdecChn, &stAudioStream, HI_TRUE);if(HI_SUCCESS != s32Ret){printf("%s: HI_MPI_ADEC_SendStream(%d) failed with %#x!\n",\__FUNCTION__, s32AdecChn, s32Ret);//break;}usleep(1000*10);}while (HI_TRUE == pstAdecCtl->bStart){s32Ret = HI_MPI_AO_QueryChnStat(0, 0,&pstStatus);//printf("pstStatus.u32ChnBusyNum: %d\n",pstStatus.u32ChnBusyNum);if(pstStatus.u32ChnBusyNum < 1){s32Ret = HI_MPI_ADEC_SendEndOfStream(s32AdecChn, HI_FALSE);if (HI_SUCCESS != s32Ret){printf("%s: HI_MPI_ADEC_SendEndOfStream failed!\n", __FUNCTION__);}break;}sleep(1);}free(pu8AudioStream);pu8AudioStream = NULL;fclose(pfd);pstAdecCtl->bStart = HI_FALSE;return NULL;
}/******************************************************************************
* function : Create the thread to get stream from file and send to adec
******************************************************************************/
HI_S32 SAMPLE_COMM_AUDIO_CreatTrdFileAdec(ADEC_CHN AdChn, FILE *pAdcFd) {SAMPLE_ADEC_S *pstAdec = NULL;if (NULL == pAdcFd){return HI_FAILURE;}pstAdec = &gs_stSampleAdec[AdChn];pstAdec->AdChn = AdChn;pstAdec->pfd = pAdcFd;pstAdec->bStart = HI_TRUE;//pthread_create(&pstAdec->stAdPid, 0, SAMPLE_COMM_AUDIO_AdecProc, pstAdec);SAMPLE_COMM_AUDIO_AdecProc(pstAdec);return HI_SUCCESS;
}HI_S32 main(int argc, char *argv[]) {char ch;HI_S32 s32Ret= HI_SUCCESS;AIO_ATTR_S stAioAttr;/* init stAio. all of cases will use it */memset(&stAioAttr, 0, sizeof(AIO_ATTR_S));stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;stAioAttr.enWorkmode = AIO_WORK_MODE;stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;stAioAttr.u32EXFlag = 0;stAioAttr.u32FrmNum = 30;stAioAttr.u32ChnCnt = 1;
#ifdef HI_ACODEC_TYPE_TLV320AIC31stAioAttr.u32ClkSel = 1;
#elsestAioAttr.u32ClkSel = 0;
#endifstAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000;stAioAttr.u32PtNumPerFrm = (AAC_TYPE_AACLC == gs_enAacType) ? 1024 : 2048;//signal(SIGINT, SAMPLE_AUDIO_HandleSig);//signal(SIGTERM, SAMPLE_AUDIO_HandleSig);s32Ret = SAMPLE_COMM_SYS_Init();if (HI_SUCCESS != s32Ret) {printf("%s: system init failed with %d!\n", __FUNCTION__, s32Ret);return HI_FAILURE;}/* register aac encoder and decoder */HI_MPI_ADEC_AacInit();s32Ret = SAMPLE_AUDIO_AdecAo(argv[1],&stAioAttr);/* read audio stream from file,decode and send AO*/if (s32Ret != HI_SUCCESS) {}SAMPLE_COMM_SYS_Exit();return HI_SUCCESS;
}

Hi3519A播放ACC理解相关推荐

  1. qt4.8.6 基于Phonon的播放器无法播放acc等音频文件解决方法

    对于Qt多媒体应用开发,主要使用Phonon多媒体框架.但是受制于框架的设计,实际的多媒体功能都由后端(Backends)来实现,Phonon框架本身不提供多媒体资源的编码和解码.对于Windows平 ...

  2. 深入理解Activity的生命周期

    当用户在系统与你的应用之间切换的过程中,你的应用中的Activity实例也会在自己的不同生命周期中切换.例如,用户第一次打开你的应用,应用展现在用户的手机桌面,获取用户的输入焦点.在这个过程中,And ...

  3. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  4. 普通帧,关键帧,空白关键帧的区别

    1. 特点 帧--是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的每一帧都可以包含需要显示的所有内容,包括图形.声音.各种素材和其他多种对 ...

  5. 移动端视频缓存保障与CDN调度优化

    本文由网易云信资深音视频客户端工程师张根宁在LiveVideoStackCon 2019上海音视频技术大会的演讲整理而成,张根宁分享了团队在线视频播放器优化的主要方向,即缓冲和卡顿问题.对于卡顿,可以 ...

  6. python怎么在运行中查看执行状态_python,_python程序运行时 查看对象状态,python - phpStudy...

    python程序运行时 查看对象状态 不知大家有没有用过Rthymbox的python console. Rthymbox可以在运行的时候,让它的 交互式命令行 对程序进行控制. 比如说可以调用pla ...

  7. win10控制面板快捷键_你没玩过的全新版本 Win10这些操作你知多少

    不知不觉,Win10与我们相伴已经整整四个年头了,从最开始的组团抗拒到现在的默默接受,个中滋味相信谁心里都有个数. 近日微软开始推送"Win10更新五月版",那么Win10中到底都 ...

  8. 简单c语语言游戏教案大全,大班语言活动教案大全简单趣味

    从小培养幼儿学说普通话的兴趣.同时家长应注意用规范的语言来与幼儿进行日常交谈. 以下是小编精心收集整理的幼儿园大班语言活动方案,下面小编就和大家分享,来欣赏一下吧. 幼儿园大班语言活动方案1 活动目标 ...

  9. win10控制面板快捷键_你没玩过的全新版本:Win10这些操作你知多少

    不知不觉,Windows 10与我们相伴已经整整四个年头了,从最开始的组团抗拒到现在的默默接受,个中滋味相信谁心里都有个数.近日微软开始推送"Win10更新五月版",那么Win10 ...

最新文章

  1. JQuery操作下拉框
  2. OGNL探秘之一:数据转换的乐园
  3. 一、linux驱动理论
  4. w8计算机配置要求,win8系统最低配置要求有哪些|win8系统是否有最低配置要求-系统城...
  5. 牛X,.NET6又双叒叕新版本,这是要起飞吗?
  6. mac下安装前端模板引擎Jinja2
  7. PyTorch :transforms的二十二个方法
  8. Java 将HTML转为Word
  9. flutter框架优缺点,flutter开发的app有哪些
  10. python 拼图验证码
  11. poj2112,最大流,最优挤奶方案
  12. SQL12 获取每个部门中当前员工薪水最高的相关信息
  13. Python:存取npy格式数据
  14. ih5连接mysql数据库_iH5高级教程:H5数据应用,数据库基础
  15. 解决ImportError: /home/douxiao/anaconda3/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
  16. 将GIF转成视频MP4、MOV
  17. Android Studio2.0 教程从入门到精通MAC版 - 安装篇
  18. python微信抢红包神器_快过年啦,还怕手速慢,我用Python自动抢红包!
  19. java 调用火狐内核_[图文]自己动手做J浏览器——基于JAVA和火狐内核(gecko)
  20. thinkphp6 生成在线预览的pdf

热门文章

  1. 【mysql】-【innodb数据存储结构】
  2. 基于Android开发通讯录功能
  3. java 视频系统_java web电影网视频点播系统
  4. Charon的python数据可视化分析4(饼状图)
  5. 【收藏】桃花庵歌-唐寅
  6. 解压tar.zx命令
  7. 解决项目上的红叉和红色感叹号的方法。
  8. 一位互联网老兵曲曲折折的 16 年!
  9. 手把手带大家搭建一个java个人网站(腾讯云为例)
  10. 深入理解计算机系统-第七章(链接)笔记