试了试,貌似这样就可以:
<action application="log" data="DEBUG ${uuid_debug_media(${uuid} both on)}"/>
<action application="set" data="buuid=${create_uuid()}"/>
<action application="log" data="DEBUG buuid=${buuid}"/>
<action application="bridge" data="[absolute_codec_string=PCMA][origination_uuid=${buuid}][api_on_answer='uuid_debug_media ${buuid} both on']sofia/internal/1234@192.168.1.222:5062"/>
在跟踪一个rtp方面的bug
目前跟踪到的是这样的:
switch_rtp.c 里面有一个这样的函数:
static int rtp_common_write(switch_rtp_t *rtp_session,
rtp_msg_t *send_msg, void *data, uint32_t datalen, switch_payload_t payload, uint32_t timestamp, switch_frame_flag_t *flags)
如果是单腿,那么 send_msg 为空,将调用 get_next_write_ts 函数
如果已经 bridged, 那么 send_msg 不为空,将不会调用 get_next_write_ts
然后我们看下面这段代码:
if (!switch_rtp_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO)) {
if ((rtp_session->rtp_bugs & RTP_BUG_NEVER_SEND_MARKER)) {
m = 0;
} else {
int delta = rtp_session->ts - rtp_session->last_write_ts;
if (!rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] &&
((!rtp_session->flags[SWITCH_RTP_FLAG_RESET] && (abs(delta) > rtp_session->samples_per_interval * 10))
|| rtp_session->ts == rtp_session->samples_per_interval)) {
m++;
}
个人觉得,某些情况下可能会有问题(目前还不十分确定)
不去做这个检查 `!rtp_session->flags[SWITCH_RTP_FLAG_RESET]`, 似乎更好一些