news 2026/6/23 8:08:00

rtpengine作为媒体代理的一个问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
rtpengine作为媒体代理的一个问题

主要原因是AB路的rfc2833的payload有差异造成的,可以通过kamailio的配置逻辑来修复。

环境

CentOS 7.9

kamailio:5.8.3-bullseye docker

rtpengine:mr13.1.1.6-4 docker

问题

kamailio 5.8.3 + rtpengine 13.1.1.6,媒体代理模式。

A路invite的sdp中dtmf参数如下。

m=audio 45540 RTP/AVP 8 18 97

a=rtpmap:97 telephone-event/8000

a=fmtp:97 0-15

经过kamailio转发后的invite的sdp。

m=audio 33088 RTP/AVP 8 18 97

a=rtpmap:97 telephone-event/8000

a=fmtp:97 0-15

B路响应的200OK的sdp中dtmf参数如下。

m=audio 16394 RTP/AVP 8 101

a=rtpmap:101 telephone-event/8000

a=fmtp:101 0-16

经过kamailio转发后的200OK。

m=audio 31724 RTP/AVP 8

A路sdp中dtmf的payload为97,kaimailio正常透传,B路响应sdp中dtmf的payload为101,经过kamailio+rtpengine处理后,sdp中的dtmf编码被删除了。

通话接通后,A路按键发送DTMF码,采用inband波形模式,B路无法正常识别。

修复

问题的本质是B路响应的sdp中dtmf的payload被删除了,但是媒体通道并没有受影响,媒体转发也没有任何问题,所以最直接的办法就是在kamailio的cfg配置中再把payload加回去。

修改kamailio.cfg文件,主要修改如下。

...

modparam("rtpengine", "write_sdp_pv", "$avp(sdp)")

...

route[RESET_DTMF]{

xinfo("route[RESET_DTMF]\n");

# reset DTMF payload

if(search_body("telephone-event/8000") && !search_str($avp(sdp), "telephone-event/8000"))

{

xinfo("Added DTMF 101 payload to SDP\n");

$avp(sdp) = $(avp(sdp){re.subst,/^(m=audio.* 8)/\1 101/});

$avp(sdp) = $(avp(sdp){re.subst,/^(a=rtpmap:8 PCMA.*)$/\1\na=rtpmap:101 telephone-event\/8000\na=fmtp:101 0-15/});

set_body("$avp(sdp)", "application/sdp");

}

else {

xinfo("DTMF 101 payload already exists in SDP\n");

set_body("$avp(sdp)", "application/sdp");

}

return;

}

route[RTPENGINE] {

xinfo("route[RTPENGINE]\n");

# check if have sdp

if (!has_body("application/sdp"))

{

xinfo("!has_body(application/sdp)\n");

return;

}

if(ds_is_from_list("3060") || ds_is_from_list("3061"))

{

xinfo("route[RTPENGINE], 3060|3061\n");

# from pub, to priv

rtpengine_manage("replace-origin replace-session-connection direction=pub direction=priv ");

set_body("$avp(sdp)", "application/sdp");

}

else if(ds_is_from_list("5060"))

{

xinfo("route[RTPENGINE], 5060\n");

# from priv, to pub

rtpengine_manage("replace-origin replace-session-connection direction=priv direction=pub ");

route(RESET_DTMF);

}

return;

}

思路就是针对AB路会有不同payload的场景,调用route(RESET_DTMF),在PCMA编码的后面加上payload=101的编码。

测试

重启kamailio,发起呼叫。

从信令中看到,经过kamailio处理后的200OK的sdp中增加了payload=101的dtmf编码。

A路按键测试,可以看到rtpengine正常转发了dtmf码。

image

总结

kamailio+rtpengine作为媒体代理的方式简单易用,转发效率高,不会修改媒体包的内容,rtp和rtcp都可以正常透传转发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:50:48

Caesium图像压缩器高级配置与定制化指南

Caesium图像压缩器高级配置与定制化指南 【免费下载链接】caesium-image-compressor Caesium is an image compression software that helps you store, send and share digital pictures, supporting JPG, PNG and WebP formats. You can quickly reduce the file size (and r…

作者头像 李华
网站建设 2026/6/23 14:01:26

Graphiti时序知识图谱:5大革新策略重塑动态知识管理

在当今数据瞬息万变的时代,传统知识图谱的静态特性已成为制约AI应用发展的关键瓶颈。当业务逻辑频繁迭代、实体关系动态演变时,全量重建图谱不仅造成资源浪费,更可能导致服务中断。Graphiti框架通过时序感知架构,为知识图谱注入动…

作者头像 李华
网站建设 2026/6/23 19:48:26

CMATH:如何5分钟掌握小学数学计算能力评估

CMATH:如何5分钟掌握小学数学计算能力评估 【免费下载链接】cmath CMATH: Can your language model pass Chinese elementary school math test? 项目地址: https://gitcode.com/gh_mirrors/cm/cmath CMATH是一个专门用于评估语言模型在小学数学计算任务中表…

作者头像 李华
网站建设 2026/6/23 19:48:45

使用RNNoise进行音频降噪

1、编译及文件说明编译步骤如下:./autogen.sh./configuremake其中,执行 ./autogen.sh 时,会下载models文件(RNNoise 项目预训练的模型数据文件,如果下载过慢,可从文末提供的渠道获取)&#xff1…

作者头像 李华
网站建设 2026/6/23 19:48:27

风储模型中的功率分配模型

风储模型中,功率分配模型风电场的功率波动像个情绪不稳定的摇滚主唱——前一秒还激情四射,下一秒就突然断电。储能系统这时候就像个靠谱的调音师,得在后台疯狂调参数。今天咱们用Python撸个功率分配模型,看看怎么让这俩搭档别在电…

作者头像 李华
网站建设 2026/6/23 19:48:29

眼见非实(Bugku杂项入门)

解压文件后发现是个docx文档。 尝试打开发现无法正常打开,可见这个文件并非docx文件,需要改后缀进行解决,这里把它放进winhex进行分析。 通过第一行,我们可以发现它的前缀是504B0304,这是压缩包文件的固定格式。 ##不…

作者头像 李华