MSML语言学习

目前只是形成了一个大概的印象,还需要继续学习。

资料:

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>