背景
在上一章中,我们介绍了dtmf按键功能,可以看到rtpengine能够把收到的rfc2833和inbound类型的dtmf透传到uas。
在实际项目中, 我们可能还需要对dtmf做按键类型转换, 在rtpengine的官方文档transcoding中,我们找到这样一段话:
Rtpengine supports transcoding between RFC 2833/4733 DTMF event packets (telephone-event payloads) and in-band DTMF audio tones. When enabled, rtpengine translates DTMF event packets to in-band DTMF audio by generating DTMF tones and injecting them into the audio stream, and translates in-band DTMF tones by running the audio stream through a DSP, and generating DTMF event packets when a DTMF tone is detected.
所以可以得知rfc2833/4733和inbound类型可以互相转换。
本次测试的rtpengine版本:
Version: 13.1.0.0+0~mr13.1.0.0 git-heads/mr13.0.1.2-3ac08574
rfc2833 转inbound
- 在
opensips在转发invite时,rtpengine_manager里,参数设置如下:
always-transcode codec-mask-all codec-transcode-telephone-event codec-strip-telephone-event
通过抓包得到的结果如下:

opensips转发给uas的RTP按键内容为:

所以可以确定rfc2833转inbound成功。
另外uac发送的invite的SDP信息为:

opensips转发给uas的invite的sdp信息:

可能有点问题的是: 这个转发的invite居然把media相关的信息都去掉了。
- 20250623 修正
opensips转发invite时,rtpengine_manager参数设置为:
always-transcode codec-strip-telephone-event DTLS=off SDES-off ICE=remove RTP/AVP
从uac发送过来的invitesip信令图为:

opensips转发给uas的invite信令图为:

可以看到转发的invite只是去掉了telephone-event
opensips收到183ring或者200OK时的rtpengine_manager参数为:
DTLS=off SDES-off ICE=remove RTP/AVP
从uas返回的183ring或者200OK的sip信令图为:

从opensips返回给软电话的183ring或者200OK的sip信令图为:

可以看到返回的183ring或者200OK的sip信令,新增了telephone-event
整体信令图:

可以看到rfc2833被转成了inbound, 这种方式比方案1更好。
inbound 转rfc2833
目前没有成功,我用了always-transcode detect-DTMF codec-transcode-telephone-event codec-strip=telephone-event
和always-transcode inject-DTMF codec-transcode-telephone-event codec-strip=telephone-event,都没转成功。
在rtpengine的group发的帖子,一直自动删除. 后面如果有成功的,会在这里补充。
INFO 转 rfc2833
按键INFO的sip信令如下:

可以看到按键的INFO的sip头里的content-type为application/dtmf-relay,
BODY里的Signal即为按键内容。
在opensips的配置中,设置如下:
|
|
能接收的按键为:(0-9)和(*,#,A,B,C,D)。
另外还要在转发的invite,生成SDP信息时,rtpengine_manager的参数添加如下:
always-transcode inject-DTMF codec-mask-all
实际抓包的sip信令如下:

确实可以看到INFO转成了rfc2833类型的按键。
uac发送的invite的SDP信息为:

opensips转发给uas的invite的sdp信息:

INFO 转 inbound
暂未成功。
总结
rtpengine的按键转换功能, 目前验证成功是rfc2833转inbound和INFO转rfc2833。inbound转rfc2833和INFO转inbound暂未成功。rfc2833或者inbound应该不能转成INFO类型。