【webrtc】rtc thread 使用 例子及PostTask

本文介绍了WebRTC中线程的使用,重点讨论了PostTask异步执行任务的三种方式,包括消息通知、同步等待和非阻塞处理。特别是非阻塞方式,常用于时间通知和统计信息收集,通过bind和Move语义简化任务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 如果有任务队列,可以直接让task queue post task 执行。
  • 如果需要创建线程,那么也可以在线程里post task 执行,主要用到非阻塞的方式。

看源码,创建线程后执行任务,有三种用法,还是比较实用的:

  • 1 支持消息处理,这种可以用来做事件通知,也可以用来做定时器。
  • 2 支持同步等待其他线程处理,invoke其他线程,但阻塞自己,这种目前我没用上。
  • 3 支持不阻塞自己,处理任务 ,任务可以用bind 来构造,这种最简单直接,经常用。
  • 主要看第一和第三。
  • 举例说明:

第一种

  • 比如 一个重复的事件:

  • 先实现一个 消息处理

OnMessage(rtc::Message* msg)

  • 这里根据消息id 来处理:<
### WebRTC VAD 使用示例代码 WebRTC VAD (Voice Activity Detection) 是一种用于区分语音和非语音音频片段的技术。下面展示如何使用 C++ 和 Python 实现基于 WebRTC 的 VAD 功能。 #### C++ 示例代码 对于C++环境下的VAD应用,可以参考如下简化版的实现方式[^1]: ```cpp #include "webrtc/modules/audio_processing/include/audio_processing.h" #include "api/array_view.h" // 初始化AudioProcessing模块并设置参数 rtc::scoped_refptr<AudioProcessing> apm(AudioProcessing::Create()); apm->voice_detection()->Enable(true); apm->set_stream_delay_ms(0); // 假设有一个输入音频帧data_in, 需要进行VAD处理 std::vector<int16_t> data_in; bool is_speech; // 调用ProcessStream方法来获取当前音频帧是否为语音的结果 if (!apm->ProcessReverseStream(rtc::ArrayView<const int16_t>(data_in))) { // 处理错误情况... } is_speech = apm->voice_detection()->stream_has_voice(); ``` 此段代码展示了创建 `AudioProcessing` 对象以及配置其属性的过程,并通过调用 `ProcessReverseStream()` 方法完成实际的数据流分析工作。最后利用 `stream_has_voice()` 函数判断该数据包内是否存在有效的人声信号。 #### Python 示例代码 如果倾向于采用更便捷的语言如Python,则可借助第三方库py-webrtcvad快速搭建原型系统[^3]: ```python import webrtcvad import collections def read_wave(path): """读取wav文件""" import wave with wave.open(path,'rb') as wf: num_channels = wf.getnchannels() assert num_channels == 1 sample_width = wf.getsampwidth() assert sample_width == 2 sample_rate = wf.getframerate() frames = wf.readframes(wf.getnframes()) return frames,sample_rate def frame_generator(frame_duration_ms,audio,batch_size=8000): n = int(batch_size * (frame_duration_ms / 1000.0)) offset = 0 while offset + n < len(audio): yield audio[offset : offset+n] offset += n def vad_collector(sample_rate,frame_duration_ms,padding_duration_ms,vad,frames): num_padding_frames = int(padding_duration_ms/frame_duration_ms) ring_buffer = collections.deque(maxlen=num_padding_frames) triggered=False voiced_frames=[] for frame in frames: is_speech=vad.is_speech(frame,sample_rate) if not triggered: ring_buffer.append((frame,is_speech)) if sum([vf[1]for vf in list(ring_buffer)])>=ring_buffer.maxlen*0.9: triggered=True for f,_ in ring_buffer: voiced_frames.append(f) ring_buffer.clear() elif triggered: voiced_frames.append(frame) ring_buffer.append((frame,is_speech)) if sum([vf[1]for vf in list(ring_buffer)])<=ring_buffer.maxlen*0.1: triggered=False ring_buffer.clear() return b''.join(voiced_frames) # 创建一个新的VAD实例,默认模式为aggressive level 3 vad = webrtcvad.Vad(3) audio_data, sr=read_wave('test.wav') frames=list(frame_generator(30,audio_data)) # 将音频分割成每30ms一帧 voiced_audio=vad_collector(sr,30,300,vad,frames) # 获取仅含有人声部分的新音频序列 ``` 上述脚本实现了从WAV文件加载原始音频样本到执行VAD算法过滤静音区间的全过程。其中定义了一些辅助函数帮助解析波形文件结构、按固定时间间隔切分音频流以及累积连续多帧内的状态变化趋势以便做出更加精准的声音事件判定逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

等风来不如迎风去

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

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

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

打赏作者

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

抵扣说明:

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

余额充值