webrtc代码走读十八(webrtc线程汇总)

一、webrtc线程汇总

在windows环境下,导出demo的dump文件,分析webrtc创建的线程

这里仅记录了webrtc创建的线程,h264编解码线程没有在这里整理。

线程类型线程名称全局变量功能所属模块
Threadsignaling_threadsignaling_thread_信令线程,主要负责事件和状态消息处理
Threadworker_threadworker_thread_工作者线程,主要跟各种数据流相关消息处理
Threadnetwork_threadnetwork_thread_网络线程,处理接收网络报文网络
PlatformThreadPacerThreadpacer_thread_pacer平滑发送报文网络
PlatformThreadVoiceProcessThread_moduleProcessThreadPtr好像是VOD检测?还是会场混音算法?待确认
PlatformThreadcall_worker_queueworker_queue_音视频网络状态检测资源管理
PlatformThreadModuleProcessThreadmodule_process_thread_挂载定时调用函数资源管理
PlatformThreadEncoderQueueencoder_queue_视频编码视频
PlatformThreadDecodingThreaddecode_thread_视频解码(kHighestPriority)视频
PlatformThreadIncomingVideoStreamincoming_render_queue_视频渲染(HIGH)视频
PlatformThreadAudioEncoderQueueencoder_queue_音频编码音频
CreateThread _hRecThread音频采集音频
CreateThread _hPlayThread音频渲染(解码和渲染在一个线程里)音频
CreateThread _hGetCaptureVolumeThread获取音量参数音频
CreateThread _hSetCaptureVolumeThread配置音频参数音频
PlatformThreadrtc-low-priolow_priority_worker_queue_音频录制维护功能(LOW)维护
PlatformThreadAudioDeviceBufferTimertask_queue_周期调用LogStats维护
PlatformThreadrtc_event_logtask_queue_维护功能维护

二、webrtc线程介绍

1、thread

rtc::Thread及ThreadManager、MessageQueue,Runnable一起提供了如下基础功能:

1)线程管理:通过ThreadManager单例对象,可以管理所有的Thread实例。

2)线程基本功能:rtc::Thread提供创建线程对象,设置线程名称,启动线程等接口。

3)消息循环、投递:rtc::Thread通过继承MessageQueue类,提供消息内部循环,线程间异步,同步投递功能。

4)跨线程执行方法:提供了跨线程执行方法,并返回执行结果的功能。

5)多路分离器:通过持有SocketServer对象,实现了多路分离器的功能,能处理网络IO;

webrtc的signaling_thread、worker_thread、network_thread使用了thread线程。代码中经常看到invoke、send、post实现的就是垮线程发送消息功能。

2、ProcessThread

webrtc中有定时任务的需求,比方说要定时发送RTCP报文,定时pacer平滑发送音视频数据等。这部分可以使用Module、ProcessThreadImpl、ProcessThread配合来完成。

TimeUntilNextProcess定义定时调用时间;Process定义定时调用处理函数;ProcessThreadAttached定义绑定的线程。

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

 protected:
  virtual ~Module() {}
};

3、PlatformThread

还有一些编码器、解码等线程,虽然不是定时调度,但是要求尽力最快处理的任务。在platform Thread里面实现。

该线程创建及调度的路径如下:

1)创建路径

TaskQueue::TaskQueue
->TaskQueue::Impl::Impl
->WorkerThread::WorkerThread
->PlatformThread::PlatformThread

2)调度路径

PlatformThread::StartThread
->PlatformThread::Run
->TaskQueue::Impl::ThreadMain
->TaskQueue::Impl::ThreadState::RunThreadMain
->TaskQueue::Impl::RunPendingTasks//该函数可以下挂多个任务,比如编码任务、渲染任务等

这部分可以参考《webrtc代码走读三(视频数据处理流程汇总)》相关函数调度关系图

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当涉及到使用 WebRTC VAD (Voice Activity Detection) 的代码时,你可以参考以下示例: ```python # 导入所需的库 from webrtcvad import Vad import wave # 创建一个 VAD 实例 vad = Vad() # 设置 VAD 的模式(1,2,3) vad.set_mode(2) # 打开音频文件 audio_file = wave.open('audio.wav', 'rb') # 读取音频文件的参数 sample_width = audio_file.getsampwidth() sample_rate = audio_file.getframerate() # 每次处理的音频帧大小(10 毫秒) frame_size = int(sample_rate / 100) # 用于存储检测到的音频活动段的列表 active_segments = [] # 读取并处理音频文件 while True: # 读取一帧音频数据 frame = audio_file.readframes(frame_size) # 如果没有读取到数据,则结束循环 if not frame: break # 将音频数据传递给 VAD 进行活动检测 is_speech = vad.is_speech(frame, sample_rate) # 如果检测到音频活动,则将活动段添加到列表 if is_speech: active_segments.append(frame) # 关闭音频文件 audio_file.close() # 输出活动段的数量 print(f"Detected {len(active_segments)} active segments") # 处理检测到的活动段... ``` 上述代码,我们首先导入了必要的库,包括 `webrtcvad` 和 `wave`。然后,我们创建了一个 VAD 实例,并通过 `set_mode` 方法设置 VAD 的模式(1、2 或 3)。接下来,我们打开待处理的音频文件,并读取其参数(采样宽度和采样率)。 我们使用 `readframes` 方法读取每一帧音频数据,并将其传递给 VAD 的 `is_speech` 方法进行活动检测。如果检测到音频活动,则将该活动段添加到 `active_segments` 列表。 最后,我们关闭音频文件,并可以进一步处理检测到的音频活动段。 请注意,上述代码仅为示例,你可能需要根据实际情况进行适当修改和调整。另外,在使用之前,请确保已安装 `webrtcvad` 库,可以通过以下命令进行安装: ``` pip install webrtcvad ``` 希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值