webrtc中的线程(二)ProcesThread

webrtc中的线程 和 webrtc线程间的invoke,send,post 首先,这篇文章比较多,会不定期更新添加新的内容; 一:《webrtc中的线程》 从PeerConnectionFactory这个类中可知: 首先,webrtc中至少有三个非常重要的线程(当然还有别的线程): rtc::Thread* network_thread_; rtc::Thread* worker_thread_; rtc::Thread* signalin... 阅读详情


在webrtc中另外一个用的比较多的线程对象是 ProcessThread,它主要用于执行定时任务。它的实现相较 rtc::Thread也简单些。

类图

类图.pngProcessThread继承自TaskQueueBase,所以它也是一个异步任务队列。它也是一个接口,具体实现类为ProcesThreadImpl。

成员变量

因为它是一个异步任务队列,它内部的队列就是std::queue<QueuedTack*> queue_,而rtc::Event wake_up_就是驱动队列的事件:当队列为空时,线程阻塞在wake_up_上;当往队列放入任务,则通过wake_up_唤醒线程。

ProcessThreadImpl与rtc::Thread不同,它并没有直接封住操作系统的线程类API,而是使用了rtc::PlatformThread线程对象,rtc::PlatformThread就是对操作系统线程类API的封装。

ModuleList modules_是定时任务队列,执行定时任务队列是ProcessThreadImpl的主要功能。

核心方法

ProcessThreadImpl的核心方法是bool Process(),代码框架如下:

bool ProcessThreadImpl::Process() {
    ...
    //执行定时任务
    for (ModuleCallback& m : modules_) {
    	if (m.next_callback == 0)
        	m.next_callback = GetNextCallbackTime(m.module, now);

      	if (m.next_callback <= now ||
          m.next_callback == kCallProcessImmediately) {
        	{
          		m.module->Process();
        	}
        
        	int64_t new_now = rtc::TimeMillis();
        	m.next_callback = GetNextCallbackTime(m.module, new_now);
      	}

      	if (m.next_callback < next_checkpoint) {
        	next_checkpoint = m.next_callback;
    	}
    }

	//执行delayed_tasks_中的任务
    while (!delayed_tasks_.empty() && delayed_tasks_.top().run_at_ms <= now) {
      	queue_.push(delayed_tasks_.top().task);
      	delayed_tasks_.pop();
    }

    if (!delayed_tasks_.empty()) {
      next_checkpoint =
          std::min(next_checkpoint, delayed_tasks_.top().run_at_ms);
    }

	//执行queue_中的任务
    while (!queue_.empty()) {
      QueuedTask* task = queue_.front();
      queue_.pop();
      ...
      if (task->Run()) {
        delete task;
      }
      ...
    }

	//等待在wake_up_上
   	int64_t time_to_wait = next_checkpoint - rtc::TimeMillis();
  	if (time_to_wait > 0)
    	wake_up_.Wait(static_cast<int>(time_to_wait));
}

实现还是比较简单,就是依次执行几个任务队列中的任务。

成员方法

  • void PostTask(std::unique_ptr<QueuedTask> task)
  • void PostDelayedTask(std::unique_ptr<QueuedTask> task,uint32_t milliseconds)

两个Post方法是继承自TaskQueueBase,也不像rtc::Thread提供了更多种类的Post方法。

  • void RegisterModule(Module* module, const rtc::Location& from)
  • void DeRegisterModule(Module* module)

这两个方法是ProcessThreadImpl主要功能方法,就是往Module list中插入或删除Module,一个Module就是一个定时任务,它是一个接口类,定义如下:

class Module {
public:
    virtual int64_t TimeUntilNextProcess() = 0;
    virtual void Process() = 0;
};

TimeUntilNextProcess就是返回执行间隔。

ProcessThread在Pacing,audio 模块都有用到,主要用法就是注册Module来执行定时任务。

webrtc中的video rtp packet 接收组包过程 当前版本为webrtc58;   一:webrtc中,接收视频packet的基本过程是(这里说的的H264,vp8和vp9是一样的过程,在解析后会判断类型,构造RtpDepacketizer):  //接收 video rtp_packet 通过 class PhysicalSocket : public AsyncSocket, public sigslot::has_slots&lt;... 阅读详情

相关推荐

WebRTC-线程模型(1)

在介绍WebRTC的线程模型之前,先介绍webrtc线程模型中用到的几个简单、常用的模块或函数。webrtc是一个代码宝库,且它本身跨平台(windows,linux,ios,android),不管是哪个平台上面开发,都可以从中学习到很多有用的东西。一、 设置线程名platform_thread.ccvoid SetCurrentThreadName(const char* name) { #if

while(1) { smile(); } 8万+

WebRTC源码分析之平台线程-PlatformThread

文章目录PlatformThread使用示例示例-创建执行一次的线程示例-创建可以执行多次的线程示例-高优先级线程先运行PlatformThread源码分析数据成员构造器和析构器设置线程的属性线程的入口函数创建线程回收线程小结 WebRTC是跨多种平台的,为了方便线程的使用,把各个平台的线程封装成了PlatformThread类。PlatformThread封装的线程是有优先级的,线程的执行并不是按时间片轮询执行的,而是高优先级的线程会一直在CPU中执行,直到有更高优先级的线程到来或主动让出CPU。 Pla

专注音视频基础、WebRTC、ffmpeg、流媒体服务器 1365

VSCode配置C/C++语言环境(小白专用保姆教程)(超细)

VSCode配置C/C++语言环境(小白专用保姆教程)(超细)

ITQWQ的博客 8229

webrtc中的线程(一) rtc::Thread

是webrtc中最重要的线程类型。它与WebRtc库的实现深度结合。线程类型,主要是用作执行一些定时任务。这篇文章将介绍rtc::Thread及它在WebRtc中的使用。的线程模型如下: 不仅仅是只产生一个线程,它还包含一个队列**(message list)**,将它称为异步任务队列更适合。它的基本功能就是在线程中执行任务队列中的任务。它靠事件驱动,也就是说当中没有任务()时,它会阻塞在事件等待上,当有事件唤醒时后会继续在队列中去任务执行。在图中可以看到它可以处理IO事件,这里的IO事件就是网络数据的收发

mo4776的博客 1854

ESP32-S3驱动PCA9685模块:I2C扩展16路舵机控制实战指南

本文提供了ESP32-S3通过I2C总线驱动PCA9685模块扩展16路PWM输出的完整实战指南。详细解析了PCA9685模块原理、硬件连接、I2C地址配置,并给出了核心驱动代码与角度控制函数,帮助开发者解决微控制器PWM引脚不足的问题,轻松实现多路舵机控制。

weixin_32005771的博客 519

不用编码器也能玩转BLDC?手把手教你反电动势定位实战

本文详细介绍了无刷直流电机(BLDC)的无传感器控制方案——反电动势定位法,通过STM32实战演示如何实现基本控制。文章涵盖核心原理、硬件准备、信号采集技巧及代码实现,特别适合静音风扇、小型机器人等对成本敏感的应用场景,帮助开发者降低硬件成本并提升系统可靠性。

lg888的博客 898

WebRTC学习进阶之路 --- 十七、源码分析之WebRTC的数据流水线详解&模块机制核心ProcessThread与ProcessThreadImpl

WebRTC学习进阶之路系列总目录:https://blog.youkuaiyun.com/xiaomucgwlmx/article/details/103204274 对于实时音视频应用来讲,媒体数据从采集到渲染,在数据流水线上依次完成一系列处理。流水线由不同的功能模块组成,彼此分工协作:数据采集模块负责从摄像头/麦克风采集音视频数据,编解码模块负责对数据进行编解码,RTP模块负责数据打包和解包。数据流水线上的数据处理速度是影响应用实时性的最重要因素。与此同时,从服务质量保证角度讲,应用需要知道数据流水线的运行状态,

cchao985771161的博客 514

基于phpstudy搭建pikachu靶场

一、phpstudy下载安装配置 phpstudy介绍 简单介绍一下phpstudy,详细请参考百度解读。pikachu是基于PHP环境搭建的,需要数据库支持,所以装pikachu之前需要先安装它需要的环境,就像你养鱼需要给它提供水环境一样。安装phpstudy能满足pikachu的需求,所以先安装phpstudy。 phpStudy是一个PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是

ptxybird的博客 1万+

WebRTC源码分析-线程基础之线程基本功能

目录 前言 Thread对象的创建 线程的启动 线程的终止 线程的sleep,join以及阻塞权限 获取当前线程对象 && 判断是否是当前线程 线程的Wrap 总结 前言 如之前的总述文章所述,rtc::Thread类封装了WebRTC中线程的一般功能,比如设置线程名称,启动线程执行用户代码,线程的join,sleep,run,stop等方法;同时也提供了线程内...

ice_ly000的博客 2967

UE5 Niagara基础知识讲解

在UE5版本中,Niagara粒子系统引入了许多可添加的模块,分别用于控制发射器的生成和更新、粒子的生成和更新以及渲染效果。本文采用虚幻5.2.1版本,以图文方式对Niagara基础知识进行讲解。

一碗清深的博客 2470

31、MSP430FR2355时钟系统与低功耗模式解析

本文详细解析了MSP430FR2355的时钟系统和低功耗模式。首先介绍了时钟系统的组成,包括XT1振荡器、DCO、MODCLK、MCLK、SMCLK和ACLK的功能与配置方法。接着探讨了MSP430FR2355的五种低功耗模式及其配置要点,并分析了时钟系统与低功耗模式之间的协同关系。最后通过实际应用案例展示了如何在具体场景中优化系统功耗。文章旨在帮助开发者充分利用MSP430FR2355的时钟与低功耗特性,实现高性能、低功耗的嵌入式系统设计。

mars5的博客 195

WEBRTC内线程的使用

如果不是当前线程中,那么会推入sendlist_中,唤醒socketserver以开启MessageQueue中任务的检查执行,随后等到线程处理完毕,在此同时需要获取到当前线程的运行具柄,继续执行当前线程的任务,保证当前线程需要处理的同步任务不卡住,当目标任务执行完毕后返回。使用线程模型主要用来解决多线程的问题,在多线程代码开发时经常会碰到多线程问题:如共同访问相同的资源导致的问题,此时需要采用锁进行处理,又比如线程功能不同,某些业务逻辑不允许阻塞,因此需要切换到合适的线程执行。...

qq_27031005的博客 567

人工蜂鸟算法(AHA)详解:原理、实现与应用

人工蜂鸟算法(AHA)是一种受蜂鸟飞行技能和觅食策略启发的新型元启发式优化算法。该算法模拟蜂鸟的全向飞行、记忆能力和觅食行为,通过引导觅食、领地觅食和迁徙觅食三种策略在解空间高效搜索。AHA将优化问题解类比为食物源,蜂鸟作为搜索代理,利用访问表记录访问信息。算法核心包括三种飞行技能建模(全向、对角线和轴向飞行)以及对应的数学公式实现。Python实现展示了种群初始化、适应度计算和觅食行为模拟等关键步骤。AHA以其高效的全局搜索能力、良好收敛性和鲁棒性,在复杂优化问题中表现优异。

qq_42212808的博客 905

WebRTC源码分析-线程基础之线程管理

前言 WebRTC中的线程管理是通过ThreadManager对象来实施的,该类起着牧羊者的作用,rtc::Thread类对象就是羊群。其通过什么样的技术来实现对rtc::Thread管理的?在不同的系统平台下如何实现?下文将进行阐述。 该类的声明和定义与Thread类一样,位于rtc_base目录下的thread.h与thread.cc文件中。先看其类的声明: class Thread...

ice_ly000的博客 2619

vue3 - 实现WebRTC播放实时rtsp视频流+NVR录像机回放,web前端浏览器网页播放RTSP推流,支持海康威视大华等摄像头/监控设备对接(监控摄像头录像及回放,拿到rtsp视频流如何处理)

vue3,webrtc-streamer,rtsp视频流,监控画面,nvr录像机,回放功能,监控摄像头设备,vue3播放Rtsp推流示例代码,前端如何在vue3项目中播放rtsp视频流,VUE中播放RTSP实时推流播放解决方案,vue3 webrtc播放rtsp视频流,vue3实现rtsp视频流浏览器实时播放,海康摄像机、NVR、流媒体服务器、回放取流RTSP地址,vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频,播放海康rtsp监控视频,海康摄像机/录像机预览+回放RT

✅ 精选推荐文章 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WebRTC学习进阶之路 --- 十四、源码分析之WebRTC中的线程详解-ThreadManager&Thread

WebRTC学习进阶之路系列总目录:https://blog.youkuaiyun.com/xiaomucgwlmx/article/details/103204274 前言 WebRTC源码中的很多注释是很赞的,看源码的时候多加阅读注释有助于更好的理解。 WebRTC实现了跨平台(Windows,MacOS,Linux,IOS,Android)的线程类rtc::Thread,WebRTC内部的netwo...

SmallBottle-CGWLMX的博客 3888

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WebRTC 源码导读 104 · platform_thread

WebRTC 源码导读

aggresss 691

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WebRTC 升级接口方法调整(Windows)

WebRTC 调整 1、VideoFrameBuffer 改成 I420BufferInterface,使用 ToI420 转换 2、MediaFile 没有了,相关代码被注释,都是测试功能 3、AudioDeviceModuleImpl::Create 接口调整 4、LOG_F 没有了, RTC_LOG_F 代替 5、CreatePeerConnection 接口变化(已经调整) 6...

luansxx的专栏 906

2020-09-16 Java 多线程及线程安全

Java多线程 进程:一个程序的执行过程叫进程 线程:进程的一条执行路径 多线程:进程的多条执行路径 线程的五种状态 实现方式之一 声明一个类,继承Thread类,重写run()方法,调用类的实例对象的start()方法。 public class Test extends Thread{ @Override public void run (){ //线程执行代码块 } } //main方法 main(arg){ new Test().start(); //线程启动 ,如果调用的是r

0的博客 425

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 242

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 391

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 339

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 71

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 347

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 304

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 437
上一篇: C/C++程序编译与链接(四) 创建动态库
下一篇: C/C++程序编译与链接(五) 定位库文件
mo4776
博客等级 码龄10年 370粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo4776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值