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

打印 上一主题 下一主题

主题 956|帖子 956|积分 2868

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次

一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);
.......................
}

二代码实战

  1. #include <assert.h>
  2. #include <fcntl.h>
  3. #include <getopt.h>
  4. #include <pthread.h>
  5. #include <signal.h>
  6. #include <stdbool.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <time.h>
  10. #include <unistd.h>
  11. #include "rkmedia_api.h"
  12. #define AUDIO_PATH "default"
  13. #define AI_CHN 0
  14. //获取PCM数据的线程
  15. void * get_ai_pcm_thread(void * args)
  16. {
  17.     pthread_detach(pthread_self());
  18.     FILE * pcm_file = fopen("test_ai.pcm", "w+");
  19.     MEDIA_BUFFER mb ;
  20.     while (1)
  21.     {
  22.         //获取PCM数据的线程
  23.         mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_AI, AI_CHN, -1);
  24.         if(!mb)
  25.         {
  26.             printf("RK_MPI_SYS_GetMediaBuffer Failed....\n");
  27.             break;
  28.         }
  29.         
  30.         printf("get_pcm_data success...\n");
  31.         fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, pcm_file);
  32.         RK_MPI_MB_ReleaseBuffer(mb);
  33.     }
  34. }
  35. int main(int argc, char *argv[])
  36. {
  37.     int ret;
  38.     AI_CHN_ATTR_S ai_chn_s;
  39.     ai_chn_s.pcAudioNode = AUDIO_PATH; //音频路径,默认default
  40.     ai_chn_s.u32SampleRate = 48000; //音频采样率
  41.     ai_chn_s.u32Channels = 2;   //音频通道数
  42.     ai_chn_s.u32NbSamples = 1024; //音频采样个数,这里固定1024
  43.     ai_chn_s.enSampleFormat = RK_SAMPLE_FMT_S16;
  44.     ai_chn_s.enAiLayout = AI_LAYOUT_NORMAL;  //NORMAL
  45.     ret = RK_MPI_AI_SetChnAttr(AI_CHN, &ai_chn_s);  //设置AI模块
  46.     if(ret)
  47.     {
  48.         printf("Set Ai_Chn_Attr Failed....\n");
  49.     }
  50.     else
  51.     {
  52.         printf("Set Ai_Chn_Attr Success....\n");
  53.     }
  54.     ret = RK_MPI_AI_EnableChn(AI_CHN);  //使能AI模块
  55.     if(ret)
  56.     {
  57.         printf("Enable Ai_Chn_Attr Failed....\n");
  58.     }
  59.     ret = RK_MPI_AI_StartStream(AI_CHN); //启动音频AI模块
  60.     if(ret)
  61.     {
  62.         printf("RK_MPI_AI_StartStream Failed....\n");
  63.     }
  64.     pthread_t pid;
  65.     pthread_create(&pid, NULL, get_ai_pcm_thread, NULL);
  66.     while (1)
  67.     {
  68.         sleep(2);
  69.     }
  70.     RK_MPI_AI_DisableChn(AI_CHN);
  71.     return 0;
  72. }
复制代码

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表