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

ops/2025/3/10 3:06:23/

目录

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

1.1.初始化AI模块:

1.2.启动AI模块:

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

二代码实战

pcm%E6%95%B0%E6%8D%AE%E9%9C%80%E8%A6%81%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%9A-toc" name="tableOfContents" style="margin-left:40px">三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;
}

pcm%E6%95%B0%E6%8D%AE%E9%9C%80%E8%A6%81%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%9A" name="%E4%B8%89ffplay%E6%92%AD%E6%94%BEpcm%E6%95%B0%E6%8D%AE%E9%9C%80%E8%A6%81%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%9A" style="text-align:justify">三ffplay播放pcm数据需要的命令:

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


http://www.ppmy.cn/ops/164546.html

相关文章

大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。

大白话JavaScript实现一个函数&#xff0c;将字符串中的每个单词首字母大写。 答题思路 理解需求&#xff1a;要写一个函数&#xff0c;它能接收一个字符串&#xff0c;然后把这个字符串里每个单词的第一个字母变成大写。分解步骤 拆分单词&#xff1a;一般单词之间是用空格隔…

IDC权威认证!永洪科技入选 IDC「GBI图谱」,点亮生成式 BI 价值灯塔

大数据市场正在稳步前进&#xff0c;生成式AI已成为厂商服务的重点方向&#xff0c;其发展离不开数据底座建设和数据工程管理&#xff0c;反过来AI也会帮助开发运维人员、业务人员和管理层更好地使用、查询数据。IDC调研数据显示&#xff0c;在生成式AI的驱动下&#xff0c;未来…

Qt:day4

一、作业 1&#xff1a;实现绘图的时候&#xff0c;颜色的随时调整&#xff1b; 2&#xff1a;追加橡皮擦功能&#xff1b; 3&#xff1a;配合键盘事件&#xff0c;实现功能&#xff1b; 当键盘按 ctrlz 的时候&#xff0c;撤销最后一次绘图。 【Headers / widget.h】&#xff…

flink重启策略

一、重启策略核心意义 Flink 重启策略&#xff08;Restart Strategy&#xff09;是容错机制的核心组件&#xff0c;用于定义作业在发生故障时如何恢复执行。其核心目标为&#xff1a; 最小化停机时间&#xff1a;快速恢复数据处理&#xff0c;降低业务影响。平衡资源消耗&…

密码学(哈希函数)

4.1 Hash函数与数据完整性 数据完整性&#xff1a; 检测传输消息&#xff08;加密或未加密&#xff09;的修改。 密码学Hash函数&#xff1a; 构建某些数据的简短“指纹”&#xff1b;如果数据被篡改&#xff0c;则该指纹&#xff08;以高概率&#xff09;不再有效。Hash函数…

MyBatis-Plus 与 Spring Boot 的最佳实践

在现代 Java 开发中,MyBatis-Plus 和 Spring Boot 的结合已经成为了一种非常流行的技术栈。MyBatis-Plus 是 MyBatis 的增强工具,提供了许多便捷的功能,而 Spring Boot 则简化了 Spring 应用的开发流程。本文将探讨如何将 MyBatis-Plus 与 Spring Boot 进行整合,并分享一些…

在项目中如何用jmeter进行接口测试

一、接口测试的准备工作 获取接口文档 与开发团队确认接口说明文档&#xff0c;明确接口的请求方式&#xff08;GET/POST&#xff09;、URL、参数&#xff08;Query、Body、Header&#xff09;、响应格式&#xff08;JSON/XML&#xff09;及预期结果410。 若文档缺失&#xff…

http链接转成https的链接的几种方法

以下是一个将HTTP链接转换为HTTPS的JavaScript函数&#xff0c;处理了多种常见输入情况&#xff1a; function convertToHttps(url) {if (typeof url ! string) return url;// 移除首尾空格并处理空字符串const trimmedUrl url.trim();if (!trimmedUrl) return https://;// 替…