You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多音频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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:52:35