|
https://blog.csdn.net/zqj6893/article/details/25562633
AUDIO模块包括音频输入、音频输出、音频编码、音频解码四个子模块。音频输入和 输出模块通过对Hi35xx芯片SIO接口的控制实现音频输入输出功能。音频编码和解码模块提供对G711、G726、ADPCM格式的音频编解码功能,并支持录制和播放LPCM格式的原始音频文件。 音频输入输出接口SIO(SonicInput/Output),用于和AudioCodec对接,完成声音的录制和播放。 对每个SIO接口的音频输入和音频输出功能,软件分别用AI和AO两个模块来管理,称之为AI设备和AO设备,并按照SIO序号为其编号。例如与SIO0接口对应的软件设备分别为AiDev0和AoDev0。 HI3518录音和播放原理: 录音:原始音频信号以模拟信号的形式给出后,通过AudioCodec,按一定采样率和采样精度转换为数字信号。AudioCodec以I2S时序或PCM时序的方式,将数字信号传输给SIO接口,SIO支持多路复用的接收模式。Hi35xx芯片利用DMAC将SIO接口中的音频数据保存到内存中,完成录音操作。 播放:Hi35xx芯片利用DMAC将内存中的数据传输到SIO接口。SIO接口通过I2S时序或PCM时序向AudioCODEC发送数据。AudioCodec完成数字信号到模拟信号的转换过程,并输出模拟信号。 Hi35xx音频部分的编码类型G711、G726、ADPCM_DVI4与ADPCM_ORG_DVI4是使用硬编码,ADPCM_IMA是使用CPU软件解码,其中Hi3518/Hi3516C芯片没有硬件编码模块,所有的编码方式都使用软件编码;而所有的解码功能基于独立封装的海思音频编解码库,核心解码器工作在用户态,使用CPU软件解码。SDK支持通过SYS模块的绑定接口,将一个AI通道绑定到AENC通道,实现录音编码功能;也可以将一个ADEC通道绑定到AO通道,实现解码播放功能。 使用海思语音编解码库进行G711、G726、ADPCM格式的编码,编码后的码流遵循以下表格中描述的帧结构,即在每帧码流数据的净荷数据之前填充有4个字节的帧头;使用语音编解码库进行以上格式的解码时,需要读取相应的帧头信息。  这4个字节的帧头内容即为如下数组中的值: staticchararyHeard[4]={0,1,160,0};//hisiaudioheader 利用ACODEC库进行音频解码播放时,每发送一包音频数据到解码通道前,都必须先把这个数组中的内容组合到包的头部位置,否则解码出错。 G711、G726、ADPCM编码协议的采样率均为8KHz。 其中,Hi3518/Hi3516C使用内部audiocodec。Hi3518A/Hi3516C支持双声道,左右声道输入,左右声道输出。Hi3518C只支持单声道,左声道输入、左声道输出。 音频AI和AO支持的最大通道数为16通道(其中Hi3518/Hi3516C芯片受内置codec限制,只支持2通道),且配置AI和AO设备时需要将通道配置为偶数。 Hi3518/Hi3516C只支持16bit位宽。 Hi3518A/Hi3518C/Hi3516C提供一个内置的AudioCodec,并在芯片内部对接到SIO0接口,即SIO0接口只能通过内置的AudioCodec完成声音的播放及录制。因为AudioCodec不能发送同步时钟,所以SIO0接口只能配置为I2S时序的主模式(MASTER)。用户需要正确配置SIO0和AudioCodec对接时序才可接收或发送音频数据。 AudioCodec分为模拟部分和数字部分。模拟部分可以通过模拟混音(MICPGA)选择由麦克风输入(MICIN)或线性输入(LINEIN),模拟混音支持增益调节。数字部分有ADC和DAC,完成模拟信号和数字信号之间的转换,并且可分别调节音量。用户在进行音量调节时,可综合模拟部分和数字部分的音量调节,建议优先调节模拟部分音量。 AudioCodec支持去加重滤波、pop音抑制和高通滤波,并默认开启这些功能。 AudioCodec的用户态接口以ioctl形式体现,其形式如下: intioctl(intfd, unsignedlongcmd, …… ); 该函数是Linux标准接口,具备可变参数特性。但在AudioCodec中,实际只需要3个参数。因此,其语法形式等同于: intioctl(intfd, unsignedlongcmd, CMD_DATA_TYPE*cmddata); 其中,CMD_DATA_TYPE随参数cmd的变化而变化。 综上所述,HI3518C音频子系统初始化时应该作以下软件配置: 
音频编码录制流程: 1、音频输入属性(见AIO_ATTR_S结构体); 2、配置音频编码、解码模块(ACODEC); 3、设置AI设备属性;启用AI设备;启用AI通道;(启用AI噪声抑制、启用AI重采样,此两项可选。); 4、根据音频编码协议创建音频编码通道; 5、绑定音频编码通道到音频输入通道; 6、HI_MPI_AENC_GetFd(AENC_CHNAeChn)获取音频编码通道的Fd; 7、HI_MPI_AENC_GetStream从编码通道获取编码之后的音频数据; 8、用户保存或者转发此数据。 音频解码播放流程: 1、音频输出属性(见AIO_ATTR_S结构体)初始化; 2、配置音频编码、解码模块(ACODEC); 3、根据音频编码协议创建音频解码通道; 4、设置AO设备属性;启用AO设备;启用AO通道(启用AO重采样,此项可选); 5、绑定音频输出通道到音频解码通道; 6、向每包待发送的音频数据头添加4字节的海思音频协议头; 7、HI_MPI_ADEC_SendStream向音频解码通道发送组合之后的音频数据包; 8、播放声音。 Hi35xxSIO支持扩展的多路接收的I2S及PCM接口时序,对接CODEC的时序模式选择、同步时钟、采样位宽等配置必须与Hi35xxSIO的配置保持一致,否则可能采集不到正确的数据。上面代码中AUDIO_POINT_NUM=320,则通过调用口HI_MPI_AENC_GetStream从音频编码通道获取到的每包音频数据大小都为324字节(320字节的净荷数据+4字节海思音频数据头),使用ACODEC进行解码播放时,每次调用HI_MPI_ADEC_SendStream将音频数据发往音频解码通道时,数据长度也必须是324字节(320字节的净荷数据+4字节海思音频数据头)。 在音频初始化配置完毕后,需要首先对ACODEC模块进行配置,在配置ACODEC模块时,注意: 1、要把MICIN静音(MUTE)功能关闭。  2、输入设备选用LINEIN。 此处我有一点疑惑,设备的输入明明接的是MIC,我一开始也是未加思索就选择MICIN来进行配置ACODEC的,但是音频编码流程完毕后获取到的音频数据播放时只有“沙沙沙”的背景音,听不到话筒端的说话声音,纠结了两天,其它各项参数确定没有问题了,尝试着把MICIN改为LINEIN,声音OK,无语。。。。。。 目前听到的采集到的声音和解码播放的声音都很清晰,只是有点小,后续再尝试通过ioctl及相应的ACODEC模块给出的各种增益调节命令来调整音频监听与对讲的音量大小。。。。。。
|