欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 3.多线程获取音频AI的PCM数据

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

2025/4/30 12:01:45 来源:https://blog.csdn.net/weixin_51931174/article/details/144590560  浏览:    关键词: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; //音频路径,默认defaultai_chn_s.u32SampleRate = 48000; //音频采样率ai_chn_s.u32Channels = 2;   //音频通道数ai_chn_s.u32NbSamples = 1024; //音频采样个数,这里固定1024ai_chn_s.enSampleFormat = RK_SAMPLE_FMT_S16;ai_chn_s.enAiLayout = AI_LAYOUT_NORMAL;  //NORMALret = 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文件

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词