news 2026/4/23 9:44:05

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/4/18 9:16:15

Milkdown编辑器终极指南:如何选择最适合你的Markdown解决方案

Milkdown编辑器终极指南:如何选择最适合你的Markdown解决方案 【免费下载链接】milkdown 🍼 Plugin driven WYSIWYG markdown editor framework. 项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown 项目亮点速览 ✨ Milkdown是一款革命…

作者头像 李华
网站建设 2026/4/17 16:33:16

Gaea Editor 问题解决指南:从零开始掌握网页设计工具

Gaea Editor 是一款智能的网页设计工具,让开发者能够在浏览器中直观地设计网站。对于初次接触的新手来说,掌握这款网页设计工具可能会遇到一些常见问题,本指南将为您提供实用的问题解决方案。 【免费下载链接】gaea-editor Design websites i…

作者头像 李华
网站建设 2026/4/18 3:14:43

机场安检危险物品检测与分类_VFNet模型实现与性能优化

本数据集为机场安检X光图像数据集,旨在通过计算机视觉技术实现机场安检过程中危险物品的自动检测与分类。该数据集包含200张X光安检图像,采用YOLOv8格式标注,涵盖了四种主要类别:电池(battary)、液体(liquide)、机器(machine)以及…

作者头像 李华
网站建设 2026/4/23 7:40:49

ANSYS Fluent用户自定义函数开发指南(2020R2版)技术文档解析

ANSYS Fluent用户自定义函数开发指南(2020R2版)技术文档解析 【免费下载链接】ANSYSFluentUDFManual2020R2官方手册资源下载 本开源项目提供了ANSYS Fluent UDF Manual (2020R2) 的官方PDF文件下载,专为希望在Fluent中进行自定义编程的用户设…

作者头像 李华
网站建设 2026/4/15 14:55:55

探索NEMA_p GPU:Verilog/SystemVerilog实现之路

NEMA_p GPU NEMA | dc 2022 verilog/systemverilog实现最近在硬件设计的世界里遨游,碰到了NEMAp GPU这个挺有意思的玩意儿。NEMAp GPU听起来就感觉很有科技感,它在图形处理方面应该有着独特的优势。今天就来和大家唠唠怎么用Verilog/SystemVerilog来实现…

作者头像 李华
网站建设 2026/4/21 10:18:01

禅城种植牙哪家强?靠谱机构这样选

禅城种植牙哪家强?靠谱机构这样选随着口腔健康意识的提升,种植牙因其媲美真牙的稳固性和舒适度,已成为众多缺牙市民的首选修复方案。然而,面对禅城区内众多的口腔医疗机构,如何甄别技术实力、选择一家真正靠谱的种植牙…

作者头像 李华