专注于VoIP,Opensips,Kamailio等技术,QQ群:QQ群:293697898
再次声明,本人英文水平很渣,翻译只是为了学习的同时,给社区做些贡献,所以有翻译错的,比较读的不通顺的,欢迎指正,但请不要乱喷。QQ: 1354608370
This page was saved using WebZIP 7.0.3.1030 offline browser (Unregistered) on 10/03/15 23:42:10.
Address: http://kamailio.org/docs/modules/stable/modules/rtpengine.html
Title: rtpengine Module • Size: 79094 • Last Modified: Mon, 10 Aug 2015 15:19:42 GMT
rtpengine Module
Maxim Sobolev
Sippy Software, Inc.
Juha Heinanen
TuTPro, Inc.
Edited by
Maxim Sobolev
Edited by
Bogdan-Andrei Iancu
Edited by
Juha Heinanen
Edited by
Sas Ovidiu
Edited by
Carsten Bock
ng-voice GmbH
Edited by
Richard Fuchs
Sipwise GmbH
翻译
李 浩
<1354608370@qq.com>
Copyright © 2003-2008 Sippy Software, Inc.
Copyright © 2005 Voice Sistem SRL
Copyright © 2009-2014 TuTPro Inc.
Copyright © 2010 VoIPEmbedded Inc.
Copyright © 2013-2014 Sipwise GmbH
Copyright © 2015 上海宁卫 李浩
目录
1. 用户指南
1. 概述
2. Multiple RTP proxy usage
3. 依赖模块
3.1. Kamailio 模块
3.2. 外部库和应用程序
4. 参数表
4.1. rtpengine_sock (string)
4.2. rtpengine_disable_tout (integer)
4.3. rtpengine_tout_ms (integer)
4.4. queried_nodes_limit (integer)
4.5. rtpengine_retr (integer)
4.6. extra_id_pv (string)
4.7. setid_avp (string)
4.8. force_send_interface (string)
4.9. write_sdp_pv (string)
4.10. rtp_inst_pvar (string)
5. 函数表
5.1. set_rtpengine_set(setid[, setid])
5.2. rtpengine_offer([flags])
5.3. rtpengine_answer([flags])
5.4. rtpengine_delete([flags])
5.5. rtpengine_manage([flags])
5.6. start_recording()
6. 伪变量导出
6.1. $rtpstat
7. MI Commands
7.1. nh_enable_rtpp
7.2. nh_show_rtpp
2. Frequently Asked Questions
示例
1.1. Set rtpengine_sock parameter
1.2. Set rtpengine_disable_tout parameter
1.3. Set rtpengine_tout_ms parameter
1.4. Set queried_nodes_limit parameter
1.5. Set rtpengine_retr parameter
1.6. Set extra_id_pv parameter
1.7. Set setid_avp parameter
1.8. Set force_send_interface parameter
1.9. Set write_sdp_pv parameter
1.10. Set rtp_inst_pvar parameter
1.11. set_rtpengine_set usage
1.12. rtpengine_offer usage
1.13. rtpengine_answer usage
1.14. rtpengine_delete usage
1.15. rtpengine_manage usage
1.16. start_recording usage
1.17. $rtpstat Usage
1.18. nh_enable_rtpp usage
1.19. nh_show_rtpp usage
Chapter 1. 用户指南
目录
1. 概述
2. Multiple RTP proxy usage
3. 依赖模块
3.1. Kamailio 模块
3.2. 外部库和应用程序
4. 参数表
4.1. rtpengine_sock (string)
4.2. rtpengine_disable_tout (integer)
4.3. rtpengine_tout_ms (integer)
4.4. queried_nodes_limit (integer)
4.5. rtpengine_retr (integer)
4.6. extra_id_pv (string)
4.7. setid_avp (string)
4.8. force_send_interface (string)
4.9. write_sdp_pv (string)
4.10. rtp_inst_pvar (string)
5. 函数表
5.1. set_rtpengine_set(setid[, setid])
5.2. rtpengine_offer([flags])
5.3. rtpengine_answer([flags])
5.4. rtpengine_delete([flags])
5.5. rtpengine_manage([flags])
5.6. start_recording()
6. 伪变量导出
6.1. $rtpstat
7. MI Commands
7.1. nh_enable_rtpp
7.2. nh_show_rtpp
1.概述
This is a module that enables media streams to be proxied via an RTP proxy. The only RTP proxy currently known to work with this module is the Sipwise rtpengine https://github.com/sipwise/rtpengine. The rtpengine module is a modified version of the original rtpproxy module using a new control protocol. The module is designed to be a drop-in replacement for the old module from a configuration file point of view, however due to the incompatible control protocol, it only works with RTP proxies which specifically support it.
这个模块允许媒体流通过一个 RTP 代理服务器代理。现在已知的仅仅只有 Sipsise rtpengine可用于这个模块 https://github.com/sipwise/rtpengine。 rtpengine模块是源于rtpproxy模块使用 一个新的控制协议的修改版本。这个查块被设计成一个替换旧模块从配置文件的切入点。但是由于不兼容的控制协议,如果指定支持它, 它仅能工作于 rtp 代理。
2. Multiple RTP proxy usage
The rtpengine module can support multiple RTP proxies for balancing/distribution and control/selection purposes.
rtpengine模块可以支持多个RTP代理用于均衡/分配和控制/选择。
The module allows definition of several sets of rtpproxies. Load-balancing will be performed over a set and the admin has the ability to choose what set should be used. The set is selected via its id - the id being defined with the set. Refer to the “rtpengine_sock” module parameter definition for syntax description.
这个模块允许定义几个rtp代理的集合。负载均衡将在一个集合上执行且管理员有权力选择应该使用的。集合选择via its id - id 被定义于集群。 指的是 “rtpengine_sock” 模块参 数定义的语法描述。
The balancing inside a set is done automatically by the module based on the weight of each RTP proxy from the set.
一个集合的均衡是按每个集合中的RTP 代理的权重自动完成的。
The selection of the set is done from script prior using rtpengine_delete(), rtpengine_offer() or rtpengine_answer() functions - see the set_rtpengine_set() function.
一个集合的选择完成是脚本优先使用rtpengine_delete(), rtpengine_offer() or rtpengine_answer() 等函数。看set_rtpengine_set()等数。
Another way to select the set is to define setid_avp module parameter and assign setid to the defined avp before calling rtpengine_offer() or rtpengine_manage() function. If forwarding of the requests fails and there is another branch to try, remember to unset the avp after calling rtpengine_delete() function.
另一种方式去选择集合是去定义setid_avp模块参数且使用setid分配定义过的AVP, 在调用rtpengine_offer() 或 rtpengine_manage()函数之前。 如果转发的请求失败且有别一个分支在尝试,请记得在调用rtpengine_delete()函数后复原avp.
For backward compatibility reasons, a set with no id take by default the id 0. Also if no set is explicitly set before rtpengine_delete(), rtpengine_offer() or rtpengine_answer() the 0 id set will be used.
为了向后兼容的原因,一个集合如果没有id那么将默认为0.如果在使用函数rtpengine_delete(), rtpengine_offer() or rtpengine_answer()前, 没有明确的集合,id为0的集合会被使用。
IMPORTANT: if you use multiple sets, take care and use the same set for both rtpengine_offer()/rtpengine_answer() and rtpengine_delete()!! If the set was selected using setid_avp, the avp needs to be set only once before rtpengine_offer() or rtpengine_manage() call. 注意:如果你使用多个集合,rtpengine_offer()/rtpengine_answer() and rtpengine_delete()都维护和使用相同的集合。 如果选择使用setid_avp,avp需要先设置,在调用 rtpengine_offer() or rtpengine_manage()之前。
3.依赖模块
3.1. Kamailio 模块
The following modules must be loaded before this module:
依赖模块必须先于本模块加载
tm module - (optional) if you want to have rtpengine_manage() fully functional
3.2. 外部库和应用程序
The following libraries or applications must be installed before running Kamailio with this module loaded:
依赖的外部库和应用程序必须在本模块加载前已安装。
None.
4.参数表
4.1. rtpengine_sock (string)
Definition of socket(s) used to connect to (a set) RTP proxy. It may specify a UNIX socket or an IPv4/IPv6 UDP socket.
定义用于RTP proxy连接的socket.它可以指定为一个unix socket或一个ipv4/ipv6的udp socket.
Default value is “NONE” (disabled).
Example 1.1. Set rtpengine_sock parameter
...
# single rtproxy
modparam("rtpengine", "rtpengine_sock", "udp:localhost:12221")
# multiple rtproxies for LB with weights (missing weight defaults to 1)
modparam("rtpengine", "rtpengine_sock",
"udp:localhost:12221=2 udp:localhost:12222=1")
# multiple sets of multiple rtproxies
modparam("rtpengine", "rtpengine_sock",
"1 == udp:localhost:12221 udp:localhost:12222")
modparam("rtpengine", "rtpengine_sock",
"2 == udp:localhost:12225")
...
4.2. rtpengine_disable_tout (integer)
Once an RTP proxy was found unreachable and marked as disabled, the rtpengine module will not attempt to establish communication to that RTP proxy for rtpengine_disable_tout seconds.
一旦一个RTP代理发现不可达,则标记为禁止,rtpengine 模块将不再去和它建立通信,这个是rtp proxy的 rtpengine_disable_tout时长(秒级)
Default value is “60”.
Example 1.2. Set rtpengine_disable_tout parameter
...
modparam("rtpengine", "rtpengine_disable_tout", 20)
...
4.3. rtpengine_tout_ms (integer)
Timeout value expressed in milliseconds in waiting for reply from RTP proxy.
以毫秒为单位的超时值,从RTP proxy等待回应的超时值。
Default value is “1000”.
Example 1.3. Set rtpengine_tout_ms parameter
...
modparam("rtpengine", "rtpengine_tout_ms", 2000)
...
4.4. queried_nodes_limit (integer)
The total number of nodes inside a set (sets are configurable via rtpengine_sock function) to be queried before giving up establishing a session. This brings more flexibility in case checking all rtpengines would take too long. Max limit is 50.
在放弃建立一个会话前,可被查询到的(配置在rtpengine_sock函数中的集合)节点总数。这带来了更多的灵活性 去检查所有的rtpengine,但花费了更多时间。最大限制为50.
By default all nodes in a set are tried before giving up communicating with the rtpengines.
默认情况下,所有节点都会尝试,在放弃与rtpengine通信前。
Example 1.4. Set queried_nodes_limit parameter
...
modparam("rtpengine", "queried_nodes_limit", 5)
...
4.5. rtpengine_retr (integer)
How many times the module should retry to send and receive after timeout was generated.
模块重试发送和接收的次数,在这之后产生超时。
Default value is “5”.
Example 1.5. Set rtpengine_retr parameter
...
modparam("rtpengine", "rtpengine_retr", 2)
...
4.6. extra_id_pv (string)
The parameter sets the PV defination to use when the “b” parameter is used on rtpengine_delete(), rtpengine_offer(), rtpengine_answer() or rtpengine_manage() command.
PV定义的参数集用于当"b"参数在rtpengine_delete(), rtpengine_offer(), rtpengine_answer() or rtpengine_manage() 等命令使用.
Default is empty, the “b” parameter may not be used then.
默认为空,"b"参数可能不被使用。
Example 1.6. Set extra_id_pv parameter
...
modparam("rtpengine", "extra_id_pv", "$avp(extra_id)")
...
4.7. setid_avp (string)
The parameter defines an AVP that, if set, determines which RTP proxy set rtpengine_offer(), rtpengine_answer(), rtpengine_delete(), and rtpengine_manage() functions use.
参数定义一个AVP,如果设置,确定哪一个RTP proxy 用于 rtpengine_offer(), rtpengine_answer(), rtpengine_delete(), and rtpengine_manage()等函数。
There is no default value.
Example 1.7. Set setid_avp parameter
...
modparam("rtpengine", "setid_avp", "$avp(setid)")
...
4.8. force_send_interface (string)
Forces all control messages between the SIP proxy and the RTP proxy to be sent from the specified local interface. Both IPv4 and IPv6 addresses are supported. If not specified, the default interface selected by the operating system will be used. Note: when rtpengine_sock is a IPv6 link-local address, one _must_ set this parameter in order to successfully connect to RTP engine. This is necessarely because OS needs additional scope_id hint to communicate over IPv6 link locals. The scope_id is resolved based on the given IPv6.
强制所有走SIP proxy and the RTP proxy 的控制消息由指定的本地接口发送。 支持ipv4和ipv6.如果没有指定,将使用操作系统选择的接口。
注意:当rtpengine_sock是ipv6链路的本地地址,_must_ 设置这个参数为成功连接到了rtp engine. 这是因为操作系统需要额外的scope_id 暗示使用ipv6链路。scope_id是基于给定的ipv6的解决。
There is no default value.没有默认值
Example 1.8. Set force_send_interface parameter
...
modparam("rtpengine", "force_send_interface", "10.3.7.123")
modparam("rtpengine", "force_send_interface", "2001:8d8:1ff:10c0:9a90:96ff:fea8:fd99")
...
4.9. write_sdp_pv (string)
If this parameter is set to a valid AVP or script var specifier, the SDP returned by rtpengine in the offer/answer operations is returned in the specified variable instead of the message body.
如果这个参数设定为一个有效的avp或脚本里定义了变量。由rtpengine在offer/answer操作在指定的 消息体中的变量后返回SDP
There is no default value.
Example 1.9. Set write_sdp_pv parameter
...
modparam("rtpengine", "write_sdp_pv", "$avp(sdp)")
... or
modparam("rtpengine", "write_sdp_pv", "$pv(sdp)")
...
4.10. rtp_inst_pvar (string)
A pseudo variable to store the chosen RTP Engine IP address. If this parameter is set, the IP address and port of the instance chosen will be stored in the given variable.
一个保存选择的rtp engine ip地址的伪变量。如果这个参数被设置,选定实例ip地址和端口将被保存到给定的变量中。
By default, this parameter is not set.
Example 1.10. Set rtp_inst_pvar parameter
...
modparam("rtpproxy", "rtp_inst_pvar", "$avp(RTP_INSTANCE)")
...
5.函数表
5.1. set_rtpengine_set(setid[, setid])
Sets the ID of the RTP proxy set to be used for the next rtpengine_delete(), rtpengine_offer(), rtpengine_answer() or rtpengine_manage() command. The parameter can be an integer or a config variable holding an integer.
设置用于下一个rtpengine_delete(), rtpengine_offer(), rtpengine_answer() or rtpengine_manage() 命令的 RTP PROXY代理的id,变量为整型或整型变量。
A second set ID can be specified to daisy-chain two RTP proxies. The two set IDs must be distinct from each other and there must not be any overlap in the proxies present in both sets. In this use case, the request (offer, answer, etc) is first sent to an RTP proxy from the first set, which rewrites the SDP body and sends it back to the module. The rewritten SDP body is then used to make another request to an RTP proxy from the second set, which rewrites the SDP body another time and sends it back to the module to be placed back into the SIP message. This is useful if you have a set of RTP proxies that the caller must use, and another distinct set of RTP proxies that the callee must use. This is supported by all rtpengine commands except rtpengine_manage().
第二组指定的id在两个RTP代理间组成菊花链。两组的id必须是不同的,在这两个集合中代理不存在重叠。 在这个用例中,(offer,answer,etc)请求首先被发送到第一个集合的RTP proxy,从而改写sdp 消息并发送回模块。改写SDP消息用另一个请求 到第二个集合中的rtp proxy,并再一次重写SDP消息然后发回到模块写入到sip消息。这是非常有用的,如果你有一个rtp代理集合是主叫使用的, 被叫使用另一组不同的Rtp 代理。
这个函数可被用于 REQUEST_ROUTE, ONREPLY_ROUTE, BRANCH_ROUTE.
Example 1.11. set_rtpengine_set usage
...
set_rtpengine_set("2");
rtpengine_offer();
...
5.2. rtpengine_offer([flags])
Rewrites SDP body to ensure that media is passed through an RTP proxy. To be invoked on INVITE for the cases the SDP bodies are in INVITE and 200 OK and on 200 OK when SDP bodies are in 200 OK and ACK.
重写SDP消息以确保媒体会通过RTP proxy转发。某些情况下,INVITE和200OK会包含SDP,还有当200 OK协商过程程中,200OK 和ACK包含SDP。
Meaning of the parameters is as follows: 参数如下:
flags - flags to turn on some features. flags用于开启某些功能。
The “flags” string is a list of space-separated items. Each item is either an individual token, or a token in “key=value” format. The possible tokens are described below.
flags 字符串是一个空号分隔的选项。每个选项都是一个有效的token或者一个"key=value"格式的标记。下面描述了可能的标记。
via-branch=... - Include the “branch” value of one of the “Via” headers in the request to the RTP proxy. Possible values are: “1” - use the first “Via” header; “2” - use the second “Via” header; “auto” - use the first “Via” header if this is a request, or the second one if this is a reply; “extra” - don't take the value from a header, but instead use the value of the “extra_id_pv” variable. This can be used to create one media session per branch on the RTP proxy. When sending a subsequent “delete” command to the RTP proxy, you can then stop just the session for a specific branch when passing the flag '1' or '2' in the “rtpengine_delete”, or stop all sessions for a call when not passing one of those two flags there. This is especially useful if you have serially forked call scenarios where the RTP proxy gets an “offer” command for a new branch, and then a “delete” command for the previous branch, which would otherwise delete the full call, breaking the subsequent “answer” for the new branch. This flag is only supported by the Sipwise rtpengine RTP proxy at the moment!
via-branch=... - 包含"branch"的值,即RTP代理请求头中的"Via" header的 branch的值。可能是值是:
“1” - 使用第一个Via头;
“2” - 使用第二个Via头;
“auto” - 如果是请求则使用第一个via头,如果是回应则使用第二个via头;
“extra” - 不使用从头里带来的值, 而是使用“extra_id_pv”的值这个可以用于创建RTP代理每个分支的一个媒体会话。 当发送一个后续的"delete"命令给RTP proxy时,在"rtpengine_delete",通过标记"1"或"2",你可以停止一个指定分支的会话,或停止所有不经过 那一个或两个参数的会话。如果你有连续分叉呼叫的情况,RTP proxy获得一个"offer"命令到一个新的分支,并且"delete"命令删除以前的分支, 否则将全部删除全部的呼叫 ,中止新的分支的"answer",是有用的。这个标志仅由sipwise rtpengine RTP Proxy支持。
asymmetric - flags that UA from which message is received doesn't support symmetric RTP. Disables learning of endpoint addresses in the Sipwise rtpengine proxy.
asymmetric - 标记UA 来自于哪一个不支持对称RTP的 收到的消息 。禁止在sipwise rtpengine 代理端点地址学习。
force-answer - force “answer”, that is, only rewrite SDP when corresponding session already exists in the RTP proxy. By default is on when the session is to be completed.
force-answer - 强制 “answer”,即,仅重写 SDP当对应的会话已存在于RTP proxy中。默认是在会话结束时。
direction=... - this option specifies a logical network interface and should be given exactly twice. It enables RTP bridging between different addresses or networks of the same family (e.g. IPv4 to IPv4). The first instance of the option specifies the interface that the originator of this message should be using, while the second instance specifies the interface that the target should be using. For example, if the SIP message was sent by an endpoint on a private network and will be sent to an endpoint on the public internet, you would use “direction=priv direction=pub” if those two logical network interfaces were called “priv” and “pub” in your RTP proxy's configuration respectively. The direction must only be specified in for initial SDP offer; answers or subsequent offers can omit this option.
direction=... - 这个选项指定了一个本地网络连接并发? 两次。它使用RTP 在同一个网络模式(Ipv4和Ipv4) 间不同的地址间进行桥接。选项的第一个实例指定了这个消息将要使用的源网络接口。例如,如果SIP消息是由一个私网端点发送,发送到一个公网的端点 ,你将使用“direction=priv direction=pub”,如果两个逻辑网络接口在你的RTP proxy的配置 文件中分别 被配置 为“priv” and “pub”.direction必须 由初始的SDP提供,answer或后续的信令可以省略此选项。
internal, external - shorthand for “direction=internal” and “direction=external” respectively. Useful for brevity or as legacy option if the RTP proxy only supports two network interfaces instead of multiple, arbitrarily named ones.
internal, external - 为“direction=internal” and “direction=external” 的短语。如果RTP代理只支持两个网络接口,而不是多个,以及任意命名的,这是有用的简写或作为保留选项
auto-bridge - this flag an alternative to the “internal” and “external” flags in order to do automatic bridging between IPv4 on the "internal network" and IPv6 on the "external network". Instead of explicitly instructing the RTP proxy to select a particular address family, the distinction is done by the given IP in the SDP body by the RTP proxy itself. Not supported by Sipwise rtpengine.
auto-bridge - 这个标记 是替代 “internal” and “external” 间 自动桥接IPv4和IPV6.而不是明确的指定RTP proxy使用一个特定的协议族,不同的是给定的RTP SDP body 中的IP是RTP proxy本身的IP地址。 sipwise/rtpengine 不支持。
address-family=... - instructs the RTP proxy that the recipient of this SDP body expects to see addresses of a particular family. Possible values are “IP4” and “IP6”. For example, if the SDP body contains IPv4 addresses but the recipient only speaks IPv6, you would use “address-family=IP6” to bridge between the two address families.
简单的说,就是在sdp body中 指定协议族。
Sipwise rtpengine remembers the address family preference of each party after it has seen an SDP body from them. This means that normally it is only necessary to explicitly specify the address family in the “offer”, but not in the “answer”.
Note: Please note, that this will only work properly with non-dual-stack user-agents or with dual-stack clients according to RFC6157 (which suggest ICE for Dual-Stack implementations). This short-cut will not work properly with RFC4091 (ANAT) compatible clients, which suggests having different m-lines with different IP-protocols grouped together.
force - instructs the RTP proxy to ignore marks inserted by another RTP proxy in transit to indicate that the session is already goes through another proxy. Allows creating a chain of proxies. Not supported and ignored by Sipwise rtpengine.
通知rtp proxy忽略由其它rtp proxy 插入的通过其它代理创建的会话。允许创建一个链的代理。rtpwise rtpengine不支持。
trust-address - flags that IP address in SDP should be trusted. Without this flag, the RTP proxy ignores address in the SDP and uses source address of the SIP message as media address which is passed to the RTP proxy.
trust-address - 标记SDP里的IP 地址是可信的。如果没有这个椟记,RTP proxy忽略SDP里的IP 地址 且使用sip 消息的源地址作为媒体地址。
replace-origin - flags that IP from the origin description (o=) should be also changed.
replace-origin - 标记从源描述中(o=)的IP地址应改变。
replace-session-connection - flags to change the session-level SDP connection (c=) IP if media description also includes connection information.
replace-session-connection 标记改变会话级别的SDP 连接(c=) 如果媒体描述符还包括连接信息。
symmetric - flags that for the UA from which message is received, support symmetric RTP must be forced. Does nothing with the Sipwise rtpengine proxy as it is the default.
symmetric标记收到消息来源的UA,支持对称RTP的话,必须被强制,这个是默认的。
repacketize=NN - requests the RTP proxy to perform re-packetization of RTP traffic coming from the UA which has sent the current message to increase or decrease payload size per each RTP packet forwarded if possible. The NN is the target payload size in ms, for the most codecs its value should be in 10ms increments, however for some codecs the increment could differ (e.g. 30ms for GSM or 20ms for G.723). The RTP proxy would select the closest value supported by the codec. This feature could be used for significantly reducing bandwith overhead for low bitrate codecs, for example with G.729 going from 10ms to 100ms saves two thirds of the network bandwith. Not supported by Sipwise rtpengine.
简单的说,就是在 要求rtp proxy重新分包。 sipwise/rtpengine 不支持。
ICE=... - controls the RTP proxy's behaviour regarding ICE attributes within the SDP body. Possible values are: “force” - discard any ICE attributes already present in the SDP body and then generate and insert new ICE data, leaving itself as the only ICE candidates; “force-relay” - discard any “relay” type ICE attributes already present in the SDP body and then generate and insert itself as the only ICE “relay” candidates; “remove” instructs the RTP proxy to discard any ICE attributes and not insert any new ones into the SDP. The default (if no “ICE=...” is given at all), new ICE data will only be generated if no ICE was present in the SDP originally; otherwise the RTP proxy will only insert itself as additional ICE candidate. Other SDP substitutions (c=, m=, etc) are unaffected by this flag.
控制RTP proxy的关于ice属性的行为在SDP消息体中。可能的值是:"force"- 丢弃当前SDP消息体中的任一ICE属性并且生成和插入新的ice数据, 把新数据作为唯一的ice 侯选;
RTP, SRTP, AVP, AVPF - These flags control the RTP transport protocol that should be used towards the recipient of the SDP. If none of them are specified, the protocol given in the SDP is left untouched. Otherwise, the “SRTP” flag indicates that SRTP should be used, while “RTP” indicates that SRTP should not be used. “AVPF” indicates that the advanced RTCP profile with feedback messages should be used, and “AVP” indicates that the regular RTCP profile should be used. See also the next set of flags below.
RTP, SRTP, AVP, AVPF - 这些标记用于控制rtp 应该使用的传输协议。
RTP/AVP, RTP/SAVP, RTP/AVPF, RTP/SAVPF - these serve as an alternative, more explicit way to select between the different RTP protocols and profiles supported by the RTP proxy. For example, giving the flag “RTP/SAVPF” has the same effect as giving the two flags “SRTP AVPF”.
RTP/AVP, RTP/SAVP, RTP/AVPF, RTP/SAVPF - 这些作为一个替代,更明确的方式去选择不同的 RPT协议 和RTP proxy profiles支持
to-tag - force inclusion of the “To” tag. Normally, the “To” tag is always included when present, except for “delete” messages. Including the “To” tag in a “delete” messages allows you to be more selective about which dialogues within a call are being torn down.
to-tag - 强制包含 "to"标签。通常, "to"标签除了"delete",常常被包含在消息中。"to"标签包含 在"delete"消息中允许你有更多选择,当一个对话拆线。
rtcp-mux-demux - if rtcp-mux (RFC 5761) was offered, make the RTP proxy accept the offer, but not offer it to the recipient of this message.
rtcp-mux-demux - 如果rtcp-mux (RFC 5761)是offered,RTP 代理接受要约,但是不会要约于这个消息的接收者。
rtcp-mux-reject - if rtcp-mux was offered, make the RTP proxy reject the offer, but still offer it to the recipient. Can be combined with “rtcp-mux-offer” to always offer it.
rtcp-mux-reject - 如果rtcp-mux (RFC 5761)是offered,将使rtp代理 拒绝要约,但是仍提供给 消息接收者,可与 “rtcp-mux-offer”结合起来。
rtcp-mux-offer - make the RTP proxy offer rtcp-mux to the recipient of this message, regardless of whether it was offered originally or not.
rtcp-mux-offer - 使RTP proxy提供rtcp-mux给消息接收方,无论最初是什么情况。
rtcp-mux-accept - if rtcp-mux was offered, make the RTP proxy accept the offer and also offer it to the recipient of this message. Can be combined with “rtcp-mux-offer” to always offer it.
如果rtcp-mux 是 offered,使RTP 代理接受要约且也提供给消息接收方。可与“rtcp-mux-offer” 结合起来。
media-address=... - force a particular media address to be used in the SDP body. Address family is detected automatically.
media-address=... - 强制一个特定的媒体地址在sdp 消息体中去使用。自动检测协议族。
TOS=... - change the IP TOS value for all outgoing RTP packets within the entire call in both directions. Only honoured in an “offer”, ignored for an “answer”. Valid values are 0 through 255, given in decimal. If this option is not specified, the TOS value will revert to the default TOS (normally 184). A value of -1 may be used to leave the currently used TOS unchanged.
TOS=... - 调整所有的呼入呼出中的出局的rtp 包的IP TOS值。 仅需要在意"offer",忽略掉"answer",有效值为:0-255. 如果未指定这一项,TOS值使用默认值(184).值-1可用于保证当前使用的TOS值 不变。
This function can be used from ANY_ROUTE.
Example 1.12. rtpengine_offer usage
route {
...
if (is_method("INVITE")) {
if (has_body("application/sdp")) {
if (rtpengine_offer())
t_on_reply("1");
} else {
t_on_reply("2");
}
}
if (is_method("ACK") && has_body("application/sdp"))
rtpengine_answer();
...
}
onreply_route[1]
{
...
if (has_body("application/sdp"))
rtpengine_answer();
...
}
onreply_route[2]
{
...
if (has_body("application/sdp"))
rtpengine_offer();
...
}
5.3. rtpengine_answer([flags])
Rewrites SDP body to ensure that media is passed through an RTP proxy. To be invoked on 200 OK for the cases the SDP bodies are in INVITE and 200 OK and on ACK when SDP bodies are in 200 OK and ACK.
重写SDP 消息体以确保媒体通过RTP proxy.
See rtpengine_offer() function description above for the meaning of the parameters.
参考rtpengine_offer()函数上相关的参数说明。
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
Example 1.13. rtpengine_answer usage
See rtpengine_offer() function example above for example.
5.4. rtpengine_delete([flags])
Tears down the RTPProxy session for the current call.
从当前呼叫中关掉rtpproxy会话
See rtpengine_offer() function description above for the meaning of the parameters. Note that not all flags make sense for a “delete”.
参数同上。
This function can be used from ANY_ROUTE.
Example 1.14. rtpengine_delete usage
...
rtpengine_delete();
...
5.5. rtpengine_manage([flags])
Manage the RTPProxy session - it combines the functionality of rtpengine_offer(), rtpengine_answer() and rtpengine_delete(), detecting internally based on message type and method which one to execute.
管理rtpproxy会话- 它结合rtpengine_offer(), rtpengine_answer() and rtpengine_delete(), 检测内部消息和方法要执行。
It can take the same parameters as rtpengine_offer(). The flags parameter to rtpengine_manage() can be a configuration variable containing the flags as a string.
Functionality:
If INVITE with SDP, then do rtpengine_offer()
If INVITE with SDP, when the tm module is loaded, mark transaction with internal flag FL_SDP_BODY to know that the 1xx and 2xx are for rtpengine_answer()
If ACK with SDP, then do rtpengine_answer()
If BYE or CANCEL, or called within a FAILURE_ROUTE[], then do rtpengine_delete()
If reply to INVITE with code >= 300 do rtpengine_delete()
If reply with SDP to INVITE having code 1xx and 2xx, then do rtpengine_answer() if the request had SDP or tm is not loaded, otherwise do rtpengine_offer()
This function can be used from ANY_ROUTE.
Example 1.15. rtpengine_manage usage
...
rtpengine_manage();
...
5.6. start_recording()
This function will send a signal to the RTP proxy to record the RTP stream on the RTP proxy. This function is not supported by Sipwise rtpengine at the moment!
这个函数会发一个信号给rtp proxy用于去记录rtp代理的媒体流。这个功能还不被支持。
This function can be used from REQUEST_ROUTE and ONREPLY_ROUTE.
Example 1.16. start_recording usage
...
start_recording();
...
6. Exported Pseudo Variables
导出伪变量
6.1. $rtpstat
Returns the RTP statistics from the RTP proxy. The RTP statistics from the RTP proxy are provided as a string and it does contain several packet counters. The statistics must be retrieved before the session is deleted (before rtpengine_delete()).
返回经过RTP proxy的RTP统计。RTP 统计是一个RTP proxy提供的字符串,它包含几个数据包的计数器。统计前必须删除会话(rtpengine_delete())
Example 1.17. $rtpstat Usage
...
append_hf("X-RTP-Statistics: $rtpstat\r\n");
...
7. MI Commands
7.1. nh_enable_rtpp
Enables a RTP proxy if parameter value is greater than 0. Disables it if a zero value is given.
The first parameter is the RTP proxy url (exactly as defined in the config file).
The second parameter value must be a number in decimal.
NOTE: if a RTP proxy is defined multiple times (in the same or diferente sete), all of its instances will be enables/disabled.
Example 1.18. nh_enable_rtpp usage
...
$ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
...
7.2. nh_show_rtpp
Displays all the RTP proxies and their information: set and status (disabled or not, weight and recheck_ticks). If a RTP proxy has been disabled by a mi command a "(permanent)" quote will appear when printing the disabled status. This is to differentiate from a temporary disable due to the proxy being not found responsive by kamailio.
No parameter.
Example 1.19. nh_show_rtpp usage
...
$ kamctl fifo nh_show_rtpp
...
Chapter 2. Frequently Asked Questions
2.1. How do I migrate from “rtpproxy” or “rtpproxy-ng” to “rtpengine”?
2.2. Where can I find more about Kamailio?
2.3. Where can I post a question about this module?
2.4. How can I report a bug?
2.1.
How do I migrate from “rtpproxy” or “rtpproxy-ng” to “rtpengine”?
For the most part, only the names of the functions have changed, with “rtpproxy” in each name replaced with “rtpengine”. For example, “rtpproxy_manage()” has become “rtpengine_manage()”. A few name duplications have also been resolved, for example there is now a single “rtpengine_delete()” instead of “unforce_rtp_proxy()” and the identical “rtpproxy_destroy()”.
The largest difference to the old module is how flags are passed to “rtpengine_offer()”, “rtpengine_answer()”, “rtpengine_manage()” and “rtpengine_delete()”. Instead of having a string of single-letter flags, they now take a string of space-separated items, with each item being either a single token (word) or a “key=value” pair.
For example, if you had a call “rtpproxy_offer("FRWOC+PS");”, this would then become:
rtpengine_offer("force trust-address symmetric replace-origin replace-session-connection ICE=force RTP/SAVPF");
Finally, if you were using the second paramater (explicit media address) to any of these functions, this has been replaced by the “media-address=...” option within the first string of flags.
2.2.
Where can I find more about Kamailio?
Take a look at http://www.kamailio.org/.
2.3.
Where can I post a question about this module?
First at all check if your question was already answered on one of our mailing lists:
User Mailing List - http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
Developer Mailing List - http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
E-mails regarding any stable Kamailio release should be sent to <sr-users@lists.sip-router.org> and e-mails regarding development versions should be sent to <sr-dev@lists.sip-router.org>.
If you want to keep the mail private, send it to <sr-users@lists.sip-router.org>.
2.4.
How can I report a bug?
Please follow the guidelines provided at: http://sip-router.org/tracker.