目前只是形成了一个大概的印象,还需要继续学习。
资料:
http://www.ietf.org/ietf/IPR/convadia-ipr-draft-saleem-msml.txt
http://www.ietf.org/rfc/rfc4240.txt
概述
https://www.docin.com/p-655138178.html
媒体服务器标记语言(Media Server Markup Language)。
基于SIP的媒体控制协议,它完全支持SIP协议,而不需要更改SIP协议,它将XML脚本加入到SIP INVITE and SIP INFO消息中。
MSML是在媒体服务器中工作的一种应用层语言,用于向MS进行业务请求和控制。他协助SIP协议工作,SIP建立媒体会话和提供媒体传输通道,MSML提供应用层控制。
MSML将媒体流和信令控制进行分类。
在媒体服务器中媒体对象是媒体流请求和终结的实体(对话dialogs,会议conference),媒体流是在两个媒体对象之间建立起来的媒体通道。
MSML提供如下工具:
- 创建,修改或者破坏一个媒体对象
- 建立或者删除媒体流
- 修改媒体流属性(例如:音量)
使用
-
通过SIP Request-RUI 在会话中标记MSML
1INVITE sip:[email protected] SIP/2.0 2INVITE sip:[email protected];play=cid:... SIP/2.0
-
MSML嵌套在SIP INFO消息体中
-
MSML识别目标 = RTP流
-
允许用户选择如何使用MSML
元素
-
<audiomix>
定义了音频混合属性
-
<videolayout>
定义了视频混合(布局)属性
-
n-loudest(e.g. <n-loudest n="3"/>)
音量
-
automatic speaker notification (e.g. <asn ri="2s"/>)
自动语言通知
-
<selector id="1" method="vas" speakersess="previout"/>
选择视频显示属性
-
<root size="CIF" cvd:codec="H263" cvd:bandwidth="512" cvd:mpi="1"/>
通用视频显示属性
-
<createconference>
初始创建会议
-
<modifyconference>
修改会议布局属性,或者向会议中增加成员。如
<asn ri="0"/>
禁止asn报告 -
<destroyconference>
删除一个会议,或者移除一个会议媒体布局(混合)。默认终结所有现存的sip对话
案例
1.创建一个音频或者视频会议:
1<msml version="1.1"> //msml版本
2 <createconference name="conf1" deletewhen="nocontrol"> //会议名称 会议结束标记
3 <audiomix id="1"> //音频混合方式
4 <n-loudest n="3"/>
5 </audiomix>
6 <videolayout id="1" type="text/msml-basic-layout"> //视频布局方式
7 <selector id="1" method="vas" si="1s">
8 <root size="CIF" cvd:codec="H263" cvd:bandtwidth="512" cvd:mpi="1" /> //视频尺寸 编码类型 带宽
9 </selector>
10 </videolayout>
11 </createconference>
12</msml>
2.将一个用户(媒体流)加入到会议中:
-
将一个媒体格式为只收(receive-only)方式的用户加入会议:
dir中都是to-id1
1<join id1:"conn:dh628z" id2="conf:abc">
2 <stream dir="to-id1" media="audio"/>
3 <stream dir="to-id1" media="video"/>
4</join>
- 将一个音频用户加入会议并设置音频属性:
1<join id1:"conn:dh628z" id2="conf:abc">
2 <stream dir="to-id1" media="audio">
3 <gain agc="true"/>
4 <clamp dtmf="true"/>
5 </stream>
6 <stream dir="to-id1" media="audio"/>
7</join>
3.修改会议中一个或多个用户(媒体流)的连接属性:
关闭先前会议的自动控制(AGC)功能,由于不包含clamp标记所以DTMF不受影响,会议的媒体流(从会议发向连接,即to)是不受影响的,因为它没有在modifyustream中。
1<modifystream id1="conn:dh628z" id2="conf:abc">
2 <stream dir="from-id1" media="audio">
3 <gain agc="false"/>
4 </stream>
5</modifystream>
4,从会议中删除一个用户(媒体流)的连接
在unjoin中不能修改媒体流属性。
1<unjoin id1="conn:dh629z" id2="conf:abc">
2 <stream dir="to-id1" media="audio"/>
3 <stream dir="to-id1" media="video"/>
4</unjoin>
并将该用户设为语音只读模式
1<join id1="conn:dh629z" id2="conf:abc">
2 <stream dir="from-id1" media="audio"/>
3</join>
5.开启ASN
ASN只能进行音频混合,audiomix的其他音频属性不变,<videolayout>
视频属性不变
1<msml version="1.1">
2 <modifyconference id="conf:conf1">
3 <audiomix id="1">
4 <asn r1="2s" cvd:asth="-96"/>
5 </audiomix>
6 </modifyconference>
7</msml>
6.修改为音频会议
修改后并不打断会议,只是将视频会议修改为音频会议
<videolayout>
用来判断视频混合是否被删除,但他不包含视频描述<selector>
,<root>
1<msml version="1.1">
2 <destroyconference id="conf:conf1">
3 <videolayout id="1" type="text.msml-basic-layout"/>
4 </destroyconference>
5</msml>
7.通过sip INFO消息将请求发给ms(媒体服务器)
1<msml version="1.1">
2 <dialogstart target="conn:178d9az" type="application/moml+xml" id="mydialogname">
3 <play cvd:barge="true" cvd:cleardb="true">
4 <audio uri="file://4"/>
5 </play>
6 <dtmf dft="3s" idt="5s" edt="2s">
7 <pattern digits="min=2;max=6;rtk=#" format="mom1+digits"/>
8 <noinput/>
9 <nomatch/>
10 </dtmf>
11 <exit namelist="dtmf.end dtmf.digits"/>
12 </dialogstart>
13</msml>
8.通过sip INFO消息的响应消息将MSML操作请求的结果带回
1<msml version="1.1">
2 <result response="200">
3 <dialogid>conn:178d9az;dialog:6td8</dialogid>
4 </result>
5</msml>
DTML收集完成后也是通过sip INFO消息体携带通知事件
1<msml version="1.1">
2 <event name="msm;.dialog.exit" id="conn:178d9az;dialog:6td8">
3 <name>dtmf.end</name>
4 <value>dtmf.match</value>
5 <name>dtmf.digits</name>
6 <value>12345#</value>
7 </event>
8</msml>
9.请求消息都是通过sip INFO消息体发送给ms的
相比7多了一个send
1<msml version="1.1">
2 <dialogstart target="conn:178d9az" type="application/moml+xml" id="mydialogname">
3 <play cvd:barge="true" cvd:cleardb="true">
4 <audio uri="file://4"/>
5 </play>
6 <send target="source" event="app.playcomplete" namelist="play.amt"/>
7 <dtmf dft="3s" idt="5s" edt="2s">
8 <pattern digits="min=2;max=6;rtk=#" format="mom1+digits"/>
9 <noinput/>
10 <nomatch/>
11 </dtmf>
12 <exit namelist="dtmf.end dtmf.digits"/>
13 </dialogstart>
14</msml>
10.结果通过INFO返回
1<msml version="1.1">
2 <result response="200">
3 <description MSML document execution completes />
4 </result>
5</msml>
11.放音和信号收集事件处理格式
1<msml version="1.1">
2 <event name="app.playcomplete" id="conn:178d9az/dialog:mydialogname">
3 <name>play.amt</name>
4 <value>4989ms</value>
5 </event>
6</msml>
7<msml version="1.1">
8 <event name="msml.dialog.exit" id="conn:178d9az/dialog:mydialogname">
9 <name>dtmf.end</name>
10 <value>dtmf.match</value>
11 <name>dtmf.digits</name>
12 <value>123456</value>
13 </event>
14</msml>