RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集

        前面两篇已经交代AI和AENC模块的配置,这篇就让这两个模块绑定起来,绑定的原因是,Aenc从Ai模块拿到采集的原始数据进行编码。

        使用 RK_MPI_SYS_Bind 把 AI 节点和 AENC 进行绑定,其中 enModId 是模块 ID 号选择的是 RK_ID_AI、s32ChnId 是通道号,通道号则从容器 AENC 容器获取。开启 AENC 线程采集每一帧视频编码数据并存储到音频队列。

        绑定的函数是有rv1126通过的, RK_MPI_SYS_Bind,先来认识一下这个数据结构。

         看到RK_MPI_SYS_Bind的参数是两个需要绑定模块,这两个数据结构,在之前说视频模块绑定的时候,已经说过了这两个参数。这里我偷懒一下,不说了。

   
{//1.VI和VENC绑定//1.1定义出AI和AENC模块MPP_CHN_S ai_channel;MPP_CHN_S aenc_channel;//1.2先把容器里面的id获取出来RV1126_AI_CONTAINER ai_container;get_ai_container(0, &ai_container);RV1126_AENC_CONTAINER aenc_container;get_aenc_container(0, &aenc_container);ai_channel.s32ChnId = ai_container.ai_id;ai_channel.enModId = RK_ID_AI; //这里用的AI模块,选AIaenc_channel.s32ChnId = aenc_container.aenc_id;aenc_channel.enModId =  RK_ID_AENC;//这里用的AENC模块,选AENC//AI和VENC绑定ret = RK_MPI_SYS_Bind(&ai_channel, &aenc_channel);if(ret != 0){printf("AI和VENC绑定失败\n");}else{printf("AI和VENC绑定成功\n");}
}

        绑定之后就开启线程,开始获取一帧一帧数据包。

 //线程参数AENC_PROC_PARAM * aenc_proc_param = (AENC_PROC_PARAM*)malloc(sizeof(AENC_PROC_PARAM));aenc_proc_param->aenc_id = aenc_channel.s32ChnId;//2.创建AENC线程,获取音频编码数据pthread_t a_pid;ret = pthread_create(&a_pid, NULL,audio_aenc_thread,  (void*)aenc_proc_param);

线程处理流程:

//获取编码数据的线程
void* audio_aenc_thread(void* args)
{int ret;//线程分离,自己回收资源pthread_detach(pthread_self());MEDIA_BUFFER mb = NULL;定义一个媒体缓存区,用于接受编码器的输出数据AENC_PROC_PARAM* aenc_arg = static_cast<AENC_PROC_PARAM*> (args);free(args);//一直循环在这里拿数据while(1){//获取音频编码器的数据mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_ADEC, aenc_arg->aenc_id, -1);if(!mb){printf("获取编码器数据失败\n");break; //推出循环}//获取成功printf("获取编码器数据成功\n");//为音频包分配一个内存audio_data_packet_t *audio_packet =(audio_data_packet_t*) malloc(sizeof(audio_data_packet_t));if(!audio_packet){perror("音频包分配内存失败\n");}memset(&audio_packet, 0, sizeof(audio_packet)); //清空内存//把拿到的音频编码数据拷贝packet包里面去memcpy(audio_packet, RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb));//把包的长度拷贝进去audio_packet->audio_frame_size = RK_MPI_MB_GetSize(mb);//把packet放到队列里面去 audio_queue->putAudioPacketQueue(audio_packet);//释放缓存区,方便下一个包使用RK_MPI_MB_ReleaseBuffer(mb);}//到这里就是获取缓存区失败,或者编码器里面没有内容了//释放绑定的接口,和释放AI和AENC模块MPP_CHN_S ai_channel;MPP_CHN_S aenc_channel;ai_channel.enModId = RK_ID_AI;ai_channel.s32ChnId = 0 ;  //我只有一个是通道,如果有多个通道可以把ai的通道号一起传进来aenc_channel.enModId = RK_ID_AENC; aenc_channel.s32ChnId = aenc_arg->aenc_id; //AI的通道号已经被传了进来,所以不用在容器里面拿ret = RK_MPI_SYS_UnBind(&ai_channel, &aenc_channel);if(ret != 0 ){printf("解绑失败\n");}printf("解绑成功\n");ret = RK_MPI_AENC_DestroyChn(aenc_arg->aenc_id);if(ret != 0 ){printf("AENC销毁失败\n");}printf("AENC销毁成功\n");ret = RK_MPI_AI_DisableChn( 0 );if(ret != 0){printf("关闭AI模块势能失败\n");}printf("关闭AI模块势能成功\n");return nullptr;}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.5G PoE交换机 TL-SE2109P 简单开箱评测,8个2.5G电口+1个10G光口(SFP+)

TPLINK&#xff08;普联&#xff09;的万兆上联的2.5G网管交换机TL-SE2109P简单开箱测评。8个PoE 2.5G电口&#xff0c;1个万兆SFP上联口。 2.5G交换机 TL-SE2420 简单开箱评测&#xff0c;16个2.5G电口4个10G光口(SFP)&#xff1a;https://blog.zeruns.com/archives/837.html…

若依框架搭建学习

按这位大神的教程一步一步来。我只写注意事项。 https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5OTgxOTg0Ng&actiongetalbum&album_id2441331662295973890&scene173&from_msgid2247483925&from_itemidx1&count3&nolastread1#wechat_redirect…

学成在线_内容管理模块_创建模块工程

学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content&#xff1a;内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…

GCPAAS/DashBoard:完全免费的仪表盘设计,基于Vue+ElementUI+G2Plot+Echarts,开源代码,简单易用!还在等什么呢

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 GCPAAS/DashBoard&#xff0c;一款基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘目录管理…

登录校验Cookie、Session、JWT

目录 基础知识&#xff1a;登录校验的场景 基础知识&#xff1a;会话 ​编辑方案一&#xff1a;Cookie 方案二&#xff1a;Session 方案三&#xff1a;令牌技术 JWT 令牌 基础知识&#xff1a;登录校验的场景 基础知识&#xff1a;会话 什么是会话&#xff1f;什么是会话跟…

Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

Android BitmapShader实现狙击瞄具十字交叉线准星&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.…

gitignore忽略已经提交过的

已经在.gitignore文件中添加了过滤规则来忽略bin和obj等文件夹&#xff0c;但这些文件夹仍然出现在提交中&#xff0c;可能是因为这些文件夹在添加.gitignore规则之前已经被提交到Git仓库中了。要解决这个问题&#xff0c;您需要从Git的索引中移除这些文件夹&#xff0c;并确保…

Docker 中安装 Redis 并开启远程访问

在 Docker 中安装 Redis 并开启远程访问&#xff0c;以便本机可以连接的详细步骤&#xff1a; 一、拉取 Redis 镜像 首先&#xff0c;你需要从 Docker Hub 拉取 Redis 的镜像。使用以下命令&#xff1a; bash docker pull redis:latest这将拉取最新版本的 Redis 镜像。如果你…

ABP - 缓存模块(1)

ABP - 缓存模块&#xff08;1&#xff09; 1. 与 .NET Core 缓存的关系和差异2. Abp 缓存的使用2.1 常规使用2.2 非字符串类型的 Key2.3 批量操作 3. 额外功能 1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching &#xff0c;而对于分布式缓存…

技术洞察:C++在后端开发中的前沿趋势与社会影响

文章目录 引言C在后端开发中的前沿趋势1. 高性能计算的需求2. 微服务架构的兴起3. 跨平台开发的便利性 跨领域技术融合与创新实践1. C与人工智能的结合2. C与区块链技术的融合 C对社会与人文的影响1. 提升生产力与创新能力2. 促进技术教育与人才培养3. 技术与人文的深度融合 结…

浅谈云计算22 | Kubernetes容器编排引擎

Kubernetes容器编排引擎 一、Kubernetes管理对象1.1 Kubernetes组件和架构1.2 主要管理对象类型 二、Kubernetes 服务2.1 服务的作用与原理2.2 服务类型 三、Kubernetes网络管理3.1 网络模型与目标3.2 网络组件3.2.1 kube-proxy3.2.2 网络插件 3.3 网络通信流程 四、Kubernetes…

Redis 和 MySQL 结合使用

Redis 和 MySQL 结合使用的场景非常常见&#xff0c;通常是利用 Redis 作为缓存层来提升 MySQL 数据库的性能&#xff0c;减少数据库的压力&#xff0c;同时提高系统的响应速度。下面是它们结合使用的几种常见方法&#xff1a; 1. 缓存数据库&#xff08;Cache-Aside&#xff…

【HarmonyOS NAPI 深度探索9】发布到 npm 并管理版本

【HarmonyOS NAPI 深度探索9】发布到 npm 并管理版本 开发了一个强大的 N-API 模块后&#xff0c;下一步就是将它发布到 npm&#xff0c;让更多开发者可以使用。同时&#xff0c;随着模块的更新迭代&#xff0c;版本管理也非常重要。今天&#xff0c;我们将讲解如何将 N-API 模…

如何在linux系统上完成定时开机和更新github端口的任务

任务背景 1.即使打开代理&#xff0c;有的时候github去clone比较大的文件时也会出问题。这时需要每小时更新一次github的host端口&#xff1b; 2.马上要放假&#xff0c;想远程登录在学校的台式电脑&#xff0c;但学校内网又不太好穿透。退而求其次&#xff0c;选择定时启动电…

MATLAB基础应用精讲-【数模应用】三维海浪模型仿真(附MATLAB和python代码实现)

目录 前言 ​算法原理 动态海面的建模方法 海浪谱理论 海洋水体构建技术 (一)波形模型 (二)水体着色 三维海浪模型建模 二维不规则长峰波海浪仿真 三维不规则短峰波海浪仿真 海浪建模的理论分析 谐波海面模型 Gerstner波模型 波动方程 代码实现 MATLAB p…

vector迭代器的使用以及迭代器失效

一、iterator的使用注意 begin与end 遵循左闭右开的原则&#xff0c;begin 指向vector的第一个元素&#xff0c;end 指向vector的最后一个元素的往下一个位置。 rbegin 与 rend rbegin指向最后一个元素的位置&#xff0c;rend指向第一个元素的往前一个位置。 二、vector的常…

无降智o1 pro——一次特别的ChatGPT专业模式探索

这段时间和朋友们交流 ChatGPT 的使用心得&#xff0c;大家都提到一个很“神秘”的服务&#xff1a;它基于 O1 Pro 模型&#xff0c;能够在对话里一直保持相对高水平的理解和回复&#xff0c;不会突然变得“降智”。同时&#xff0c;整体使用还做了免折腾的网络设置——简单一点…

Web前端开发技术之HTMLCSS知识点总结

学习路线 一、新闻网界面1. 代码示例2. 效果展示3. 知识点总结3.1 HTML标签和字符实体3.2 超链接、颜色描述与标题元素3.3 关于图片和视频标签&#xff1a;3.4 CSS引入方式3.5 CSS选择器优先级 二、flex布局1. 代码示例2. 效果展示3. 知识点总结3.1 span标签和flex容器的区别3.…

ToDesk设置临时密码和安全密码都可以当做连接密码使用

ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码&#xff0c;想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码&#xff0c;安全性确实很强 和定时Tokey一样&#xff0c;固定时间切换。 但是 如果我们要经常连接这个电脑&a…

js高亮文本

高亮文本 const inputs ["这是一个普通文本&#xff0c;包含关键字测试。",<p style"font-size: 10px">这是一个<span>GVM</span> <strong>测试</strong>内容。</p>, ];const keywords ["测试", "G…