目录

3.多线程获取音频AI的PCM数据

3.多线程获取音频AI的PCM数据


一********RV1126多线程获取音频PCM数据的流程

https://i-blog.csdnimg.cn/direct/e611548b60aa45589f6bb36b09afbc47.png RV1126多线程采集AI模块的数据,一般分为三个步骤:分别是初始化AI模块、启动AI模块开启采集、开启多线程采集AI数据并保存到本地。

1.1.初始化AI模块:

AI模块的初始化实际上就是对AI_CHN_ATTR_S 的参数进行设置、然后调用RK_MPI_AI_SetChnAttr 设置AI模块并使能RK_MPI_AI_EnableChn, 代码如下: AI_CHN_ATTR_S ai_chn_s; ai_chn_s.pcAudioNode = AUDIO_PATH; ai_chn_s.u32Channels = 2; ai_chn_s.u32NbSamples = 1024; ai_chn_s.u32SampleRate = 48000; ai_chn_s.enAiLayout = AI_LAYOUT_NORMAL; ai_chn_s.enSampleFormat = RK_SAMPLE_FMT_S16; ret = RK_MPI_AI_SetChnAttr(AI_CHN, &ai_chn_s); if(ret) { printf(“RK_MPI_AI_SetChnAttr Failed…\n”); } ret = RK_MPI_AI_EnableChn(AI_CHN); if(ret) { printf(“RK_MPI_AI_EnableChn Failed…\n”); }

1.2.启动AI模块:

设置完上面的AI模块后,就要开启AI模块的工作,使用的API是RK_MPI_AI_StartStream********。 代码如下: ………………………………………………………….. ret = RK_MPI_AI_StartStream(AI_CHN); if(ret) { printf(“RK_MPI_AI_StartStream Failed…\n”); } ……………………………………………………………..

1.3.开启多线程获取PCM音频数据:

开启一个线程去采集每一帧VI模块的数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_AI,通道号ID是AI创建的通道ID号****。**** 这个API的具体作用已经在之前的获取AI数据: …………………………………. while(1) { ……………………. mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_AI, s32_chn_id, -1); fwrite(RK_MPI_MB_GetPtr(mb),RK_MPI_MB_GetSize(mb), 1, pcm_file****);**** ………………….. }

二代码实战

#include #include #include #include #include #include #include #include #include #include #include “rkmedia_api.h” #define AUDIO_PATH “default” #define AI_CHN 0 //获取PCM数据的线程 void * get_ai_pcm_thread(void * args) { pthread_detach(pthread_self()); FILE * pcm_file = fopen(“test_ai.pcm”, “w+”); MEDIA_BUFFER mb ; while (1) { //获取PCM数据的线程 mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_AI, AI_CHN, -1); if(!mb) { printf(“RK_MPI_SYS_GetMediaBuffer Failed….\n”); break; } printf(“get_pcm_data success…\n”); fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, pcm_file); RK_MPI_MB_ReleaseBuffer(mb); } } int main(int argc, char *argv[]) { int ret; AI_CHN_ATTR_S ai_chn_s; ai_chn_s.pcAudioNode = AUDIO_PATH; //音频路径,默认default ai_chn_s.u32SampleRate = 48000; //音频采样率 ai_chn_s.u32Channels = 2; //音频通道数 ai_chn_s.u32NbSamples = 1024; //音频采样个数,这里固定1024 ai_chn_s.enSampleFormat = RK_SAMPLE_FMT_S16; ai_chn_s.enAiLayout = AI_LAYOUT_NORMAL; //NORMAL ret = RK_MPI_AI_SetChnAttr(AI_CHN, &ai_chn_s); //设置AI模块 if(ret) { printf(“Set Ai_Chn_Attr Failed….\n”); } else { printf(“Set Ai_Chn_Attr Success….\n”); } ret = RK_MPI_AI_EnableChn(AI_CHN); //使能AI模块 if(ret) { printf(“Enable Ai_Chn_Attr Failed….\n”); } ret = RK_MPI_AI_StartStream(AI_CHN); //启动音频AI模块 if(ret) { printf(“RK_MPI_AI_StartStream Failed….\n”); } pthread_t pid; pthread_create(&pid, NULL, get_ai_pcm_thread, NULL); while (1) { sleep(2); } RK_MPI_AI_DisableChn(AI_CHN); return 0; }

三ffplay播放pcm数据需要的命令:

ffplay -ar 采样率 -channels 通道数 -f 采样格式(s16le) -i pcm文件