主页 > 手机  > 

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

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

目录

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

1.1.初始化AI模块:

1.2.启动AI模块:

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

二代码实战

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


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

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 <assert.h> #include <fcntl.h> #include <getopt.h> #include <pthread.h> #include <signal.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #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文件

标签:

3.多线程获取音频AI的PCM数据由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“3.多线程获取音频AI的PCM数据