MOS协议基础






4.52/5 (13投票s)
MOS协议从介绍到实现
目录
介绍
我写这篇文章的灵感来自于我的经验。 当我开始研究MOS协议时,我在网络上找不到任何相关资料。 只有一个网站www.mosprotocol.com(MOS协议的官方网站,也许是唯一的)。 我当时决定,一旦我实现了它,我就会分享我的经验和想法。
MOS基础
什么是MOS
MOS是一种能够存储媒体对象的设备。 媒体对象指的是字符发生器对象:CGs,静态存储,音频和视频。
什么是MOS协议
MOS协议是一种基于XML的协议,用于在NCS(新闻编辑室计算机系统)和MOS设备之间进行通信。
MOS协议的必要性
新闻编辑室计算机系统实现了新闻编辑室操作的自动化,包括从脚本编写/编辑到广播内容。 这个过程涉及许多设备,并且每个设备供应商都有自己的协议来与NCS通信。
媒体行业的巨大发展促使广播行业引入了一种标准协议,用于NRCS和MOS设备之间的通信。
NCS和MOS设备之间的数据交换
MOS协议允许新闻编辑室计算机系统(NCS)和媒体对象服务器(MOS)使用标准协议交换信息。 此协议支持以下类型的消息交换
1. 媒体对象的描述性数据
当MOS创建、修改或删除对象时,MOS“推送”描述性信息和指向NCS的指针。 这使得NCS能够“了解”MOS的内容,并使NCS能够对MOS发送的数据执行搜索和操作。
2. 播放列表交换
NCS可以构建并将播放列表信息传输到MOS。 这使得NCS能够控制MOS播放或呈现媒体对象的顺序。
3. 状态交换
MOS可以通知NCS特定剪辑的状态或整个MOS系统的状态。 NCS可以通知MOS特定播放列表项或运行顺序的状态。
MOS工作流程
让我分享一下NCS和MOS设备之间信息交换的基本工作流程。 NCS以Rundown对象(有时也称为Runorder)的形式包含数据。 一个Rundown可以包含多个故事,而一个故事可以有多个项目。 每个项目对应于媒体对象,例如CGs,视频文件,音频文件或静态图形。

NCS将元数据与这些项目相关联。 元数据信息包括类型、路径、播放时间和时长等。
示例:视频项目元数据
FileName: inauguration.mpeg
StartTime: 12:30:35 10-02-2009
Duration:00:10:30
Video Serve: MOSDEVICE
NCS将此元数据转换为MOS兼容的XML,并使用TCP连接将其发送到MOS设备。 作为回报,MOS设备将MOS XML响应发送到NCS。
上面元数据的示例MOS XML消息。
<mos>
<mosID>MOSDEVICE</mosID>
<ncsID>NCS</ncsID>
<messageID>507891</messageID>
<roStorySend>
<roID>96857485</roID>
<storyID>5983A501:0049B924:8390EF1F</storyID>
<storySlug>Show Open</storySlug>
<storyNum>C8</storyNum>
<storyBody>
<storyItem>
<itemID>1</itemID>
<itemSlug>Hotel Fire vo</itemSlug>
<objID> inauguration</objID>
<mosID>testmos</mosID>
<itemEdStart>12:30:35 10-02-2009</itemEdStart>
<itemEdDur>00:10:30</itemEdDur>
</roStorySend>
</mos>
MOS实现
由于MOS协议是一种基于XML的协议,因此它的实现方式与XML数据交换的标准方式相同。
基本策略
有许多MOS XML消息,例如<heartbeat>
, <roCreate>
, <roStorySend>
, <roStoryMove>
等,对于每条消息,我们使用以下策略
- 创建一个确认MOS XML消息之一的类
- 创建该类的对象并设置其属性
- 序列化该对象以获取MOS XML消息
- 将MOS XML消息转换为流
- 使用TCP连接将流发送到MOS设备
使用C# .NET 2.0的示例
我们将创建<heartbeat>
消息并将其发送到MOS设备。 <heartbeat>
消息用于验证网络和应用程序的连续性。
- 创建 MOS 和
heartbeat
类,该类确认MOS XML消息之一//<mos> message using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.Xml.Serialization; namespace mosprotocol { [XmlRoot("mos")] public class cMOS { string _mosID, _ncsID; long _messageID; cHeartBeat _heartbeat; public string mosID { get {return _mosID; } set { _mosID = value; } } public string ncsID { get { return _ncsID; } set { _ncsID = value; } } public long messageID { get { return _messageID; } set { _messageID = value; } } public cHeartBeat heartbeat { get { return _heartbeat; } set { _heartbeat = value; } } } }
//heartbeat message using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.Xml.Serialization; namespace mosprotocol { [XmlRoot("heartbeat")] public class cHeartBeat { DateTime _time; public DateTime time { get { return _time; } set { _time = value; } } } }
- 创建
mos
对象并设置其属性HeartBeat heartbeat = new cHeartBeat(); heartbeat.time = DateTime.Now; //create MOS message and set its heartbeat property cMOS mos = new cMOS(); mos.messageID = 333; mos.mosID = "MOSDEVICEID"; mos.ncsID = "NCSID"; mos.heartbeat = heartbeat;
- 将对象序列化为内存流
//serialize MOS object MemoryStream ms = new MemoryStream(); XmlSerializer xml = new XmlSerializer(typeof(cMOS)); xml.Serialize(ms, mos);
- 通过TCP连接将流发送到MOS设备
//create TCP connection with MOS device TcpClient mosClient = new TcpClient("10.1.0.94", 10641); //write MOS object stream to MOS device mosClient.GetStream().Write(ms.GetBuffer(),0,ms.GetBuffer().Length);