多音频Deck进程同步咨询:确保每轮运行时长精准为125ms
音频多进程Deck的125ms精确同步方案问题
我开发了一个包含多个音频Deck(deck 1、deck 2、music_clip_deck、speackers_deck、ip_call_1、ip_call_2、ip_call_3)的程序,每个Deck运行在独立进程中。程序以125ms为块时长完成以下操作:裁剪MP3文件、转发流、处理麦克风语音及aiortc-pyav语音数据,之后将数据填充至对应进程的队列,最终队列会被发送至统一线程进行音频预处理,用于播放及传输给客户端。
核心需求:实现所有进程的同步,确保每个进程的每轮运行时长恰好为125ms。
辅助说明
- 基础数据流示意图:展示各Deck进程的数据源处理、队列传输及最终预处理的整体流向
- 详细链路流程图:更完整呈现多Deck进程同步、数据缓冲及预处理的全流程
已验证无效的方案
以下基于事后时间补偿的sleep方案无法实现精确同步:
class Deck_1_Proc(Process): ... def run(self): while(True): t1 = time.time() # 业务逻辑处理 ... t2 = time.time() if t2 - t1 < 0.125: time.sleep(0.125 - (t2 - t1))
该方案的缺陷在于time.sleep()的精度受系统调度延迟影响,且不同进程的时间偏移会随运行逐渐累积,无法维持全局的125ms周期同步。
类setInterval的定时候选方案
可采用基于线程事件的定时循环机制,模拟JavaScript中setInterval的固定间隔触发逻辑:
from threading import Event, Thread def call_repeatedly(interval, func, *args): stopped = Event() def loop(): # 首次调用等待interval时长,之后每隔interval触发一次目标函数 while not stopped.wait(interval): func(*args) Thread(target=loop).start() return stopped.set # 启动定时任务 cancel_future_calls = call_repeatedly(0.125, run) # 程序终止时取消定时 cancel_future_calls()
后续优化疑问
当前所有进程已投入运行,若采用针对20ms同步设计的Ahmed AEK方案,需要额外缓冲下采样音频数据才能完成绘图。请问针对125ms同步场景,有哪些更适配的替代方案?
内容的提问来源于stack exchange,提问作者Chris P
相关产品推荐
相关产品推荐

