Asterisk ARI发起本地端点通话:能否省略拨号与接听操作?
可以省去拨号和接听步骤!
绝对能跳过手动拨号和接听这两步,我之前在做内部IP电话互通的场景时就这么实现过,核心是让信道自动进入Up状态并直接接入混音桥,不用走常规的呼叫流程。具体操作分两种场景:
场景1:创建信道时直接自动接听并接入桥
如果是从头创建信道,在调用ARI的Channel.create接口时,直接添加两个关键参数:
auto_answer=yes:让信道创建完成后自动接听,跳过手动接听步骤- 提前创建好
mixing类型的桥,在stasisStart事件触发时,立刻将信道加入桥
示例伪代码(用ARI的Python客户端举例):
# 先创建混音桥 bridge = ari.bridges.create(type='mixing', name='my_bridge') # 创建第一个信道,自动接听 channel1 = ari.channels.create( endpoint='PJSIP/100', app='my_stasis_app', app_args='bridge_id=' + bridge.id, auto_answer='yes' ) # 创建第二个信道,自动接听 channel2 = ari.channels.create( endpoint='PJSIP/102', app='my_stasis_app', app_args='bridge_id=' + bridge.id, auto_answer='yes' ) # 在stasisStart事件回调里加入桥 def on_stasis_start(channel_obj, ev): bridge_id = ev['args'][0] ari.channels.bridge(channel=channel_obj.id, bridge=bridge_id)
场景2:已有Down状态的信道,手动触发接听并接入桥
如果已经创建了状态为Down的信道,不需要重新创建,直接在stasisStart事件里先调用Channel.answer()接口让信道进入Up状态,再加入桥即可:
def on_stasis_start(channel_obj, ev): # 先接听信道 ari.channels.answer(channel=channel_obj.id) # 加入指定桥 ari.channels.bridge(channel=channel_obj.id, bridge='my_bridge_id')
关键原理说明
你之前的信道处于Down状态,是因为它们只被创建但没有发起媒体协商——常规呼叫流程里的拨号是发起呼叫请求,接听是确认媒体连接,而通过auto_answer或Channel.answer(),直接跳过了人工交互环节,让Asterisk自动完成媒体协商,把信道状态切换为Up,此时加入混音桥就能直接实现音频互通了。
注意事项
- 确保你的PJSIP端点配置里没有禁用自动接听的参数(比如
direct_media设置正确,没有强制要求手动确认) - 桥的类型必须是
mixing,holding或dtmf_events类型的桥无法实现双向音频互通
内容的提问来源于stack exchange,提问作者user3640553
相关产品推荐
相关产品推荐

