尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

kamailio+rtpengine对sdp的处理

kamailio+rtpengine对sdp的处理
📅 发布时间:2026/6/20 21:40:41

头图-80

 

概述

使用kamailio+rtpengine的过程中,默认会使用rtpengine处理sdp信息,同时又需要对sdp信息定制,就需要对cfg配置流程中做特殊处理才能实现。

环境

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,媒体代理模式。

需求点

1,需要使用rtpengine修改sdp信息中的ip地址为代理ip

2,需要对sdp信息中的“s=CounterPath eyeBeam 1.5”替换为“s=gw001”

3,需要对sdp信息中的“a=alt:1 1 : IvxRyFPx cTd2qu0Q 10.9.0.30 23592”做删除操作

 

方案1,在rtpengine_manage之后对“$avp(sdp)”做处理。

$avp(sdp) = $(avp(sdp){re.subst,/^a=alt:1.*//});

$avp(sdp) = $(avp(sdp){re.subst,/^a=alt:1.*\r\n//});

$avp(sdp) = $(avp(sdp){re.subst,/^a=alt:1.*\r?\n?//});

测试结果,处理后的sdp中删除了“a=alt:1”行,但是对于行尾换行符的处理不够充分,\r\n对应的"0d 0a"会删除“0d”,保留“0a”,造成sngrep和wireshark的抓包信息展示不美观。

 

image

 

方案2,在rtpengine_manage之前对“原始sdp”做处理,并需要提交修改。

replace_body("^a=alt:1.*\r\n","");

msg_apply_changes();

测试结果,处理后的sdp正确删除了“a=alt:1”行,换行符的处理也符合预期。

配置

测试结果使用方案2更符合需求预期。

方案2的cfg配置更复杂,也更绕,主要是“replace_body”等函数对sdp的处理并不会直接生效,而是需要调用“msg_apply_changes”提交修改生效。

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

...
loadmodule "textops.so"
loadmodule "textopsx.so"
...
loadmodule "rtpengine.so"
loadmodule "sdpops.so"
...
# ----- rtpengine params -----
modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")
modparam("rtpengine", "read_sdp_pv", "$avp(sdp)")
modparam("rtpengine", "write_sdp_pv", "$avp(sdp)")
...if (is_method("INVITE|UPDATE|ACK")) {		# proxy media route(RTPENGINE);}
...
route[RTPENGINE] {xinfo("route[RTPENGINE]\n");# check if have sdpif (!has_body("application/sdp")){xinfo("!has_body(application/sdp)\n");return;}if(ds_is_from_list("3060") || ds_is_from_list("3061")){# xinfo("route[RTPENGINE1], sdp(body)=$sdp(body)\n");replace_body("^s=CounterPath.*","s=SBC-GW001");replace_body("^a=alt:1.*\r\n","");sdp_remove_codecs_by_id("18");msg_apply_changes();# xinfo("route[RTPENGINE2], sdp(body)=$sdp(body)\n");sdp_get("$avp(sdp)");# xinfo("route[RTPENGINE3], avp(sdp)=$avp(sdp)\n");xinfo("route[RTPENGINE], 3060|3061\n");# from pub, to privrtpengine_manage("replace-origin replace-session-connection direction=pub direction=priv ");# xinfo("route[RTPENGINE4], avp(sdp)=$avp(sdp)\n");set_body("$avp(sdp)", "application/sdp");}else if(ds_is_from_list("5060")){replace_body("^s=pjmedia.*","s=SBC-GW001");replace_body("^b=AS:84.*\r\n","");replace_body("^a=X-nat:0\r\n","");msg_apply_changes();sdp_get("$avp(sdp)");xinfo("route[RTPENGINE], 5060\n");# from priv, to pubrtpengine_manage("replace-origin replace-session-connection direction=priv direction=pub ");set_body("$avp(sdp)", "application/sdp");}return;
}

测试

重启kamailio,发起呼叫。

从信令中看到,经过kamailio处理的sdp信息符合预期。

image

 

总结

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

kamailio的cfg配置实例在网上较少,需要对照官方文档反复测试试验。

 

空空如常

求真得真

 

相关新闻

  • 软工团队项目第一次作业
  • 低代码权限管理常见场景解决方案:精准适配不同业务需求
  • 不适用模型的简易ai交互页面

最新新闻

  • IAM系统测试实战:从单元测试到压力测试的完整指南
  • SEGGER emWin下拉框与编辑框控件实战:从核心API到工业HMI应用
  • 鹤州豪庭/鹤州新村桶装水送水电话多少 - 资讯速览
  • 嵌入式GUI开发实战:emWin中MULTIEDIT与MULTIPAGE控件的深度解析与应用
  • 如何快速上手dhcp:5分钟构建你的第一个DHCP客户端
  • 利用Microchip PRG外设实现硬件级三角波生成与VCO控制

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号