RV1126 NO.30:RV1126多线程获取音频AI的PCM数据
摘要:本文介绍了RV1126芯片多线程获取音频PCM数据的具体流程。主要包括三个步骤:1)初始化AI模块,设置采样率、通道数等参数;2)启动AI模块开始采集;3)创建独立线程持续获取音频数据并保存为PCM文件。文中提供了详细的代码实现,包括参数配置、线程创建和数据获取等关键步骤,展示了如何通过RK_MPI_AI_*系列API实现音频采集功能。该方案适用于需要实时获取音频数据的嵌入式应用场景。
一.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;//采样格式,S16格式直接对应PCM原始数据,便于后续编码/处理
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;
}
更多推荐
所有评论(0)