读者如果有想测试的项目,欢迎留言给我,多谢!
准备测试 RTPEngine 带内 DTMF转 RFC 2833 的功能,
FreeSWITCH 也可以做,但 FreeSWITCH 不会自动”吃掉”这部分音频,
看下 RTPEngine 是否有何不同,或许更神奇。
主叫 Kapanga,DTMF 设置为 Inband
被叫 Eyebeam
都注册到 kamailio
rtpengine flag 增加 always-transcode
改了下 route[NATMANAGE]
主要改了这里:
if(has_totag()) {
rtpengine_manage(“SIP-source-address replace-origin replace-session-connection”);
} else {
rtpengine_manage(“SIP-source-address replace-origin replace-session-connection codec-transcode-telephone-event always-transcode”);
}
从 Kapanga 收到 INVITE 时, body 为:
v=0
o=1000 1762483843 1762484950 IN IP4 192.168.43.68
s=Kapanga [1762483843]
c=IN IP4 192.168.43.68
t=0 0
m=audio 5136 RTP/AVP 8 0
a=rtpmap:8 pcma/8000
a=sendrecv
a=maxptime:20
a=ptime:20
a=rtpmap:0 pcmu/8000
发给 Eyebeam 的 body 为:
v=0
o=1000 1762483843 1762484950 IN IP4 192.168.43.62
s=Kapanga [1762483843]
t=0 0
m=audio 39856 RTP/AVP 8 0 96
c=IN IP4 192.168.43.62
a=rtpmap:8 pcma/8000
a=rtpmap:0 pcmu/8000
a=rtpmap:96 telephone-event/8000
a=fmtp:96 0-15
a=sendrecv
a=rtcp:39857
a=ptime:20
a=maxptime:20
te 为 96
回头查下文档,能不能改成 101
另外,Inband DTMF 转 RFC 2833 效果很好,但并没有”吃掉”DTMF 占用的这部分音频
这个功能英文就叫 dtmf transcoding
但 te96 转 te101,目前并没有这个功能,可以看这里
https://groups.google.com/g/rtpengine/c/jRtwyTb4_58
上面讨论的是 kapanga(inband dtmf) 呼叫 eyebeam(rfc2833)
但如果是 eyebeam(rfc2833) 呼叫 kapanga(inband dtmf),那应该怎样做呢?
下面是答案:
if(has_totag()) {
rtpengine_manage(“SIP-source-address replace-origin replace-session-connection”);
} else {
rtpengine_manage(“SIP-source-address replace-origin replace-session-connection codec-strip-telephone-event always-transcode”);
}
就是删除 telephone-event
关于转码, OpenSIPS 讲了下面几句话:
Goal: make A-side talk PCMA and B-side talk opus
* do not present PCMA to B-side: codec-mask-PCMA, but use it on A-side
* do not use opus for A-side: codec-strip-opus
* offer opus to B-side: transcode-opus
rtpengine_offer(“… codec-mask-PCMA codec-strip-opus transcode-opus …”);
deepseek 翻译为:
目标:使A侧使用PCMA编解码器,B侧使用opus编解码器
不向B侧提供PCMA:使用 codec-mask-PCMA,但仅在A侧使用
不在A侧使用opus:使用 codec-strip-opus
向B侧提供opus:使用 transcode-opus
rtpengine_offer(“… codec-mask-PCMA codec-strip-opus transcode-opus …”);
mask, trip, transcode 的含义要细想才能想明白
*** mask(掩码)
与 strip 类似,但此处列出的编解码器仍会被接受,并用于提供方(一般是主叫)的转码。仅在与 transcode 结合使用时有效。例如,如果某个提供方通告了 Opus,并且给定了选项 mask=opus、transcode=G723,那么重写后的发出提议将仅包含 G.723 作为提供的编解码器,并且将在 Opus 和 G.723 之间进行转码。相反,如果仅给定 transcode=G723,则重写后的发出提议将同时包含 Opus 和 G.723。另一方面,如果给定 strip=opus、transcode=G723,则 Opus 将不可用于转码。
与 strip 选项类似,可以使用特殊关键词 all 和 full 来掩码所有已提供的编解码器。
此选项仅在提议消息中处理,其他情况下将被忽略。
mask 可理解为遮蔽,就是让 B 看不到的意思
*** strip(剔除)
包含一个字符串列表。每个字符串是一个编解码器或 RTP 载荷类型的名称,应从 SDP 中移除。编解码器名称区分大小写,可以来自 SDP 通过 a=rtpmap 属性明确定义的编解码器列表,也可以来自 RFC 定义的编解码器列表。例如 PCMU、opus 或 telephone-event。使用此选项剔除的编解码器仅从重写后的发出 SDP 中移除,不会影响源 SDP 提供的编解码器列表。有关影响提供编解码器的类似机制,请参见上述 ignore 选项。
对于支持格式参数的编解码器,可以在编解码器名称旁边指定格式参数,格式与 SDP 中写入的格式相同。例如,opus/48000 表示指定采样率为 48 kHz、单声道(单通道)的 Opus,opus/48000/2 表示立体声 Opus。如果指定了任何格式参数,则仅当所有格式参数都匹配时,该编解码器才会被剔除,而相同编解码器但具有不同格式参数的其他实例将保持不变。
作为一个特殊关键词,all 可用于移除所有编解码器,除了应明确提供的编解码器(见下文)。注意,如果剔除所有编解码器且未留下任何可提供的编解码器,则会出现错误。在这种情况下,编解码器的原始列表将保持不变。
关键词 full 也可使用,其行为与 all 相同,但以下 transcode 部分列出的例外情况除外。
*** transcode(转码)
与 offer 类似,但允许将编解码器添加到提供的编解码器列表中,即使它们原本不在原始编解码器列表中。在这种情况下,将启用转码引擎。只有同时支持解码和编码的编解码器才能以这种方式添加。这还会自动从提供的编解码器列表中剔除所有不支持的编解码器,因为 rtpengine 必须预期接收甚至发送列表中存在的任何编解码器。
注意,使用此选项并不一定总是启用转码引擎。如果 transcode 列表中给出的所有编解码器都出现在原始提供的编解码器列表中,则不会进行转码。另外请注意,如果进行转码,则此媒体流的内核转发将被禁用,所有处理将在用户空间中进行。
如果未在此列表中指定编解码器格式参数(例如,仅指定 opus 而不是 opus/48000/2),则将为其选择默认值。
对于支持不同比特率的编解码器,可以通过附加另一个斜杠和以比特每秒为单位的比特率来指定,例如 opus/48000/2/32000。在这种情况下,还必须指定所有格式参数(时钟频率、通道数)。
可以使用附加斜杠附加到编解码器字符串的其他选项包括:ptime、fmtp 字符串以及其他编解码器特定选项。例如,iLBC/8000/1///mode=30 表示使用 mode=30 作为 fmtp 字符串。
对于 Opus,编解码器特定选项的字符串直接传递给 ffmpeg,因此可以设置所有 ffmpeg 编解码器选项。使用空格、冒号、分号或逗号分隔各个选项。例如,设置编码复杂度(ffmpeg 中也称为压缩级别):opus/48000/2////compression_level=2。
如果由于解析限制无法使用字面量 =(即被错误地解释为键值对),可以使用两个连字符进行转义,例如 iLBC/8000/1///mode–30。
作为一种特殊情况,如果使用了 strip=all 或 mask=all 选项,并且 transcode 选项用于原本在提议中存在的编解码器,则 rtpengine 将将此编解码器视为与使用 offer 选项时相同,即它将简单地从已剔除的编解码器列表中恢复该编解码器,而不会实际为此编解码器启用转码。另一方面,如果某个编解码器已使用 strip 或 mask 选项按名称显式剔除,然后又使用 transcode 选项,则该编解码器不会简单地从已剔除的编解码器列表中恢复,而是会在提议中插入一个新的转码实例的编解码器。(此特殊例外不适用于 mask=full 或 strip=full。)
te 为 96, 暂时改不了 101
本来想用 sdp-attr-add-audio- ,但仔细看了下资料,此路不通
决定在 github 上提 issue
在 githug 提过 issue, 回复是要把问题发讨论组
今天发到了讨论组,但暂无回复
链接为:
https://groups.google.com/g/rtpengine/c/Bk17qYeZRFw


