资讯动态

RV1126 音视频开发:AENC 音频编码模块详解

发布时间:2026/8/22 10:47:37 来源:尧图企业网站定制
1. 引言在 RV1126 音视频开发中AENCAudio Encoder音频编码模块是瑞芯微多媒体处理链路中的核心组件之一。它负责将采集到的原始音频数据如 PCM编码为指定的压缩格式如 AAC、G711、G726 等以便于后续的存储或网络传输。本文将结合 RV1126 的 RKMPPRockchip Media Process Platform框架详细介绍 AENC 模块的初始化、配置、编码流程以及实际开发中的注意事项帮助开发者快速上手。2. AENC 模块概述2.1 什么是 AENCAENC 是 RKMPP 中负责音频编码的功能模块。与视频编码VENC类似AENC 通过 MPIMedia Process Interface对外提供统一的编程接口屏蔽了底层硬件编解码器的差异。2.2 支持的编码格式RV1126 的 AENC 模块通常支持以下音频编码格式AAC常用于网络流媒体压缩率高音质好。G711A/U LawPCM 压缩格式广泛用于 VoIP 和安防监控。G726低码率语音编码常用于对讲系统。2.3 在音视频链路中的位置典型的音频处理链路如下音频采集 AI音频处理 AENC封装 MUX网络传输/存储3. 开发环境准备3.1 硬件平台主控芯片RV1126音频输入I2S 接口麦克风阵列或 Line In3.2 软件环境SDKRockchip Linux SDK含 RKMPP 库交叉编译工具链arm-rockchip830-linux-uclibcgnueabihf头文件路径include/rkaiq/、include/rk_mpi_audio.h4. AENC 模块开发流程4.1 代码执行流程总结上述示例代码的整体执行流程可以概括为以下几个步骤初始化 AI 音频采集通道设置采样率48000Hz、采样格式S16、声道数2等参数并通过RK_MPI_AI_SetChnAttr配置、RK_MPI_AI_EnableChn使能 AI 通道。创建 AENC 编码通道配置编码类型为 AAC、码率 64kbps、采样率与 AI 通道保持一致通过RK_MPI_AENC_CreateChn创建编码通道。绑定 AI 与 AENC 通道通过RK_MPI_SYS_Bind将 AI 采集通道与 AENC 编码通道绑定使 PCM 数据自动从 AI 流向 AENC无需手动搬运数据。创建线程获取编码码流启动get_audio_aenc_thread线程循环调用RK_MPI_SYS_GetMediaBuffer从 AENC 通道获取编码后的 AAC 数据。写入 ADTS 头并保存文件为每帧 AAC 裸流添加 7 字节的 ADTS 头包含采样率、声道数、帧长度等信息然后写入test_capture.aac文件。释放缓冲区并循环写入完成后调用RK_MPI_MB_ReleaseBuffer释放缓冲区继续获取下一帧数据。主线程保持运行主线程通过while(1) sleep(2)保持进程常驻等待编码线程持续工作。配置并使能 AI 采集通道创建 AENC 编码通道RK_MPI_SYS_Bind 绑定 AI 与 AENC创建线程获取编码码流获取 AAC 数据 RK_MPI_SYS_GetMediaBuffer添加 ADTS 头并写入文件释放缓冲区 RK_MPI_MB_ReleaseBuffer4.2 ADTS 参数介绍在上一节的流程中我们为每帧 AAC 裸流添加了 7 字节的 ADTSAudio Data Transport Stream头。ADTS 是 AAC 音频的一种封装格式用于在传输或存储时标识每一帧的起始位置和参数信息使解码器能够正确解析码流。ADTS 头固定为 7 字节其各字节的位域含义如下字节位域长度bit说明0syncword12同步字固定为0xFFF用于标识一帧 ADTS 数据的开始1ID1MPEG 标识0表示 MPEG-41表示 MPEG-21layer2固定为001protection_absent1是否关闭 CRC 校验1表示无 CRC2profile2AAC 档次01表示 AAC-LCLow Complexity2sampling_frequency_index4采样率索引对应关系见下表2private_bit1私有位通常为02channel_configuration3声道数配置2表示双声道3original_copy1原始/拷贝标识通常为03home1家庭标识通常为03copyright_identification_bit1版权标识位通常为03copyright_identification_start1版权标识起始位通常为03-4aac_frame_length13当前帧总长度含 ADTS 头单位字节5adts_buffer_fullness11码率控制状态0x7FF表示码率可变VBR5-6number_of_raw_data_blocks_in_frame2当前帧包含的原始数据块数通常为00其中sampling_frequency_index与采样率的对应关系如下sampling_frequency_index采样率Hz0960001882002640003480004441005320006240007220508160009120001011025118000127350对照示例代码中的GetAdtsHeader函数pu8AdtsHdr[0] 0xFF、pu8AdtsHdr[1] 0xF1写入同步字0xFFF并设置 ID、layer、protection_absent 等字段。pu8AdtsHdr[2]通过(AAC_PROFILE_LOW 6) (u8FreqIdx 2) (u8Channel 2)设置 profile、采样率索引和声道数的高位。pu8AdtsHdr[3]、pu8AdtsHdr[4]、pu8AdtsHdr[5]写入声道数低位、帧长度aac_frame_length和adts_buffer_fullness。pu8AdtsHdr[6] 0xFC设置number_of_raw_data_blocks_in_frame为0表示每帧只包含一个原始数据块。4.3 AENC模块完整代码#includeassert.h#includefcntl.h#includegetopt.h#includepthread.h#includesignal.h#includestdbool.h#includestdio.h#includestdlib.h#includetime.h#includeunistd.h#includeinclude/rkmedia/rkmedia_api.h#includeinclude/rkmedia/rkmedia_buffer.h#includeinclude/rkmedia/rkmedia_common.h#includerkmedia_api.h#defineAUDIO_PATHdefault#defineAI_CHN0#defineAENC_CHN0#defineAAC_PROFILE_LOW1typedefstructAacFreqIdx_{RK_S32 u32SampleRate;RK_U8 u8FreqIdx;}AacFreqIdx;AacFreqIdx AacFreqIdxTbl[13]{{96000,0},{88200,1},{64000,2},{48000,3},{44100,4},{32000,5},{24000,6},{22050,7},{16000,8},{12000,9},{11025,10},{8000,11},{7350,12}};staticvoidGetAdtsHeader(RK_U8*pu8AdtsHdr,RK_S32 u32SmpleRate,RK_U8 u8Channel,RK_U32 u32DataLen){RK_U8 u8FreqIdx0;for(inti0;i13;i){if(u32SmpleRateAacFreqIdxTbl[i].u32SampleRate){u8FreqIdxAacFreqIdxTbl[i].u8FreqIdx;break;}}RK_U32 u32PacketLenu32DataLen7;pu8AdtsHdr[0]0xFF;// 主要是写入syncword同步字节的前8位pu8AdtsHdr[1]0xF1;// 主要是写入syncword同步字节的后4位,并且设置ID号、layer、protection_absentpu8AdtsHdr[2]((AAC_PROFILE_LOW)6)(u8FreqIdx2)(u8Channel2);// 设置音频profile、sample_rate_index、声道数pu8AdtsHdr[3](((u8Channel3)6)(u32PacketLen11));// 设置声道数original_copyhomecopyright_identification_bit、copyright_identification_start、aac_frame_lengthpu8AdtsHdr[4]((u32PacketLen0x7FF)3);// 设置aac_frame_lengthadts_buffer_fullnesspu8AdtsHdr[5](((u32PacketLen7)5)0x1F);// 设置adts_buffer_fullness number_of_raw_data_blocks_in_framepu8AdtsHdr[6]0xFC;// 设置 number_of_raw_data_blocks_in_frame}void*get_audio_aenc_thread(void*args){pthread_detach(pthread_self());FILE*aac_filefopen(test_capture.aac,w);MEDIA_BUFFER mbNULL;RK_U8 aac_header[7];while(1){mbRK_MPI_SYS_GetMediaBuffer(RK_ID_AENC,AENC_CHN,-1);if(!mb){printf(RK_MPI_SYS_GetMediaBuffer break....\n);break;}printf(Get AAC_Buffer Success...\n);//获取AENC的AAC码流头部GetAdtsHeader(aac_header,48000,2,RK_MPI_MB_GetSize(mb));fwrite(aac_header,1,7,aac_file);//写入7个字节的头部fwrite(RK_MPI_MB_GetPtr(mb),1,RK_MPI_MB_GetSize(mb),aac_file);//写入AAC的ES码流RK_MPI_MB_ReleaseBuffer(mb);}}intmain(intargc,char*argv[]){intret;AI_CHN_ATTR_S ai_chn_s;ai_chn_s.pcAudioNodeAUDIO_PATH;//音频采样路径ai_chn_s.u32SampleRate48000;//音频采样率ai_chn_s.u32NbSamples1024;//音频采样个数ai_chn_s.u32Channels2;//音频采样通道ai_chn_s.enSampleFormatRK_SAMPLE_FMT_S16;//采样格式ai_chn_s.enAiLayoutAI_LAYOUT_NORMAL;//采样布局retRK_MPI_AI_SetChnAttr(AI_CHN,ai_chn_s);//设置AI属性if(ret){printf(RK_MPI_AI_SetChnAttr failed...\n);}else{printf(RK_MPI_AI_SetChnAttr success...\n);}retRK_MPI_AI_EnableChn(AI_CHN);//使能AI模块if(ret){printf(RK_MPI_AI_EnableChn failed...\n);}else{printf(RK_MPI_AI_EnableChn success...\n);}AENC_CHN_ATTR_S aenc_chn_attrs;//AENCaenc_chn_attrs.enCodecTypeRK_CODEC_TYPE_AAC;//AENC模块的编码协议aenc_chn_attrs.u32Bitrate64000;//音频编码比特率,64kbpsaenc_chn_attrs.u32Quality1;//音频质量aenc_chn_attrs.stAencAAC.u32Channels2;//音频通道数aenc_chn_attrs.stAencAAC.u32SampleRate48000;//音频编码采样率这里要和AI模块的采样率一致retRK_MPI_AENC_CreateChn(AENC_CHN,aenc_chn_attrs);//创建AENC模块if(ret){printf(RK_MPI_AENC_CreateChn failed....\n);}else{printf(RK_MPI_AENC_CreateChn success....\n);}MPP_CHN_S ai_mpp_chn_s;ai_mpp_chn_s.enModIdRK_ID_AI;ai_mpp_chn_s.s32ChnIdAI_CHN;MPP_CHN_S aenc_mpp_chn_s;aenc_mpp_chn_s.enModIdRK_ID_AENC;aenc_mpp_chn_s.s32ChnIdAENC_CHN;retRK_MPI_SYS_Bind(ai_mpp_chn_s,aenc_mpp_chn_s);//绑定AI模块和AENC模块if(ret){printf(RK_MPI_SYS_Bind failed....\n);}else{printf(RK_MPI_SYS_Bind success....\n);}pthread_t pid;pthread_create(pid,NULL,get_audio_aenc_thread,NULL);//创建线程获取AENC码流while(1){sleep(2);}RK_MPI_SYS_UnBind(ai_mpp_chn_s,aenc_mpp_chn_s);RK_MPI_AENC_DestroyChn(AENC_CHN);RK_MPI_AI_DisableChn(AI_CHN);return0;}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价