一、概述
MMS彩信大家都看到过,或者都编辑过。在这里,利用一系列的文章来说明彩信的编辑、发送和接收的过程。首先这里,简单描述一下彩信的编辑过程。这是彩信的第一步。
二、MMS的表述(presentation)语言——SMIL概述
MMS由一系列类似于“power point style”类型的slide组成,由这些slide来组织各种格式的文本、音频、视频信息。这些我们在发送或者接受彩信的时候都有切身的体会,就不说了。
为了把这些多媒体信息组织到一起,通过网络发送,并且这些信息在接收者那里能够保证按照发送者的样式进行播放。这里就需要采用一种技术,用于描述彩信的组织和播放方法。这种方法就是利用SMIL语言。看过这个语言的规范之后,我想大部分熟悉HTML和XML的人都会会心的笑了,的确,这就是SMIL语言。
MMS使用SMIL(Synchronized Multimedia Integration Language)的子集作为表述语言,SMIL是由W3C(world wide web consortium)制定的基于XML的表述语言标准(可以参见附录中之处的RFC文档)。相当于HTML之于web。SMIL语言可以控制多媒体对象的layout和timing(播放时间)。
在初期,MMS只使用了SMIL的简单基础子集,称作“MMS SMIL”。每个MMS信息都是由SMIL表述语言文件组成。在这个文件中所有的slide有相同的layout。每个slide至少包含两个region,一个包含文本,一个包含图像。事实上,每个slide都是一个frame,每个frame包含layout和指向内容(text、images、audio、video)的索引。每个slide的播放周期以秒计算,在每个slide的内部,文本和图像的播放时间可以单独设定。
由于每个移动设备的尺寸不尽相同,所以SMIL被设计成可以根据终端的不同表现形式作以重新安排。简单说来,SMIL具有下列特点:
§来自于W3C的规范定义
§ SMIL只是简单地限定了各种message元素在何时、在什么地方显式
§ SMIL文件以<smil>标记开始,接下来是head和body标记,最后以</smil>结束
§ Head标记元素限定了
§Body标记元素限定了被插入内容的参考索引(references),并且限定了何时、何地播放以及每个元素播放的时间。
下面一段文字来自于IBM,说明了在MMS之外SMIL的广泛用途。
SMIL 2.0 是同步多媒体集成语言(Synchronized Multimedia Integration Language),它已开始成为将多媒体集成到 Web 内容的重要新方法。SMIL 提供基于 XML 的方法来控制多媒体元素的定时和表示,它已开始获得众多大的软件供应商和工具制作商的支持,这使得开发人员使用它变得越来越容易。 SMIL 支持已开始成为 Adobe、Microsoft 以及(也许是最重要的)媒体传递领先者 Real Networks 支持的技术之一。众多较小的供应商已开始提供 SMIL 创作工具和播放器。 在不久的将来,随着对当前 2.0 规范支持的增长,对于任何在工作中需要某种形式的多媒体资产控制的开发人员,使用 SMIL 将成为他们的标准策略。如果把正在增长的工具创建者的名单作为某种指示,那么用 SMIL 构建表示也会变得更简单。 |
正如前面 提到的那样,最广泛的 SMIL 2.0 实现可能来自 Real Networks。RealOne Player 支持 SMIL 2.0 语言概要文件(SMIL 2.0 Language Profile),它结合了 SMIL 支持的大多数(尽管不是全部)模块。除了支持大多数标准 SMIL 模块以外,RealNetworks 还开发了自己的几个 SMIL 扩展。要使用这些扩展,开发人员必须遵守标准 XML 声明. 通过使用少量的 一系列基于 SMIL 的 XML 元素和属性,Microsoft 的 HTML+TIME 给 HTML 页面添加了定时和多媒体支持。为了给 HTML 文档添加定时,开发人员要向现有的 HTML 元素添加新属性。创建新元素是为了使向 HTML 页面添加媒体变得简单。 为了使用任何 HTML+TIME 元素,开发人员必须在 HTML 标记中声明 XML 名称空间 t:
不同于上述这两个供应商,大多数创作工具和播放器开发人员主要分为两种, § 一种是只关注 SMIL 的完整台式机部署 § 另一种至少要关心一下用于占用资源较小的移动设备的基本 SMIL 2.0 子集。 此外,随着无线网络的发展,关注 MMS 部署的 SMIL 播放器应该对 SMIL 创作有新的考虑。
|
三、 SMIL简单示例
下面给出了一个MMS消息的SMIL示例:
<smil> <head> <meta name="title" content="vacation photos" /> <meta name="author" content="Danny Wyatt" /> <layout> <root-layout width="160" height="120"/> <region id="Image" width="100%" height="80" left="0" top="0" /> <region id="Text" width="100%" height="40" left="0" top="80" /> </layout> </head> <body> <par dur="8s"> <img src="FirstImage.jpg" region="Image" /> <text src="FirstText.txt" region="Text" /> <audio src="FirstSound.amr"/> </par> <par dur="7s"> <img src="SecondImage.jpg" region="Image" /> <text src="SecondText.txt" region="Text" /> <audio src="SecondSound.amr" /> </par> </body> </smil> |
具体的SMIL描述语言的解释可以参见附录的参考文档,那里给出了每种标记的解释说明。
至于在手机软件上实现,也不是很困难的事情。想想看。
利用结构数组,把所有的MMS中的slide存储到其中,最后,结合SMIL语言的规范,把彩信
打包成上述文件的格式,注意,这里,并不需要把具体的多媒体文件内容添加到smil文件中,只需要加在smil文件中,作为附件就可以了。具体的数据的加载,请看下一篇——MMS的打包部分吧!
参考资料:
Nokia:
[N1] How_To_Create_MMS_Services.pdf http://www.forum.nokia.com
[N2] MMSCenterAppDevGuide.pdf http://www.forum.nokia.com
OMA:
[O1] WAP-205-MMSArchOverview-20010425-a.pdf一、MMS的封装(Encapsulation)——MIME
对于使用SMIL语言描述的MMS,在通过无线网络发送的时候,我们必须通过某种方式把SMIL和附属的内容包装在一起,一边能够以一个unit(整体)的形式发送出去,以便SMIL文件各个部分内容的reference变得有效。
这个解决的办法就是MIME(Multipart Internet Mail Extensions)规范,这个规范的最初作用是在email的plain text的主体中加入不同的内容。比如说,发送带有附件的email,这个时候你就使用了MIME的规范。MIME负责把所有的独立的文本、图像、声音、视频内容以及SMIL文件本身捆绑在一起,这个规范称为MIME Encapsulation Aggregate Documents,用于告诉接受的终端这个MMS的内容是相互相关(related to one another)并且相互参考的(referenced to one another)。
1. MIME封装示例
下面是根据RFC文档给出的MIME的封装示例:
Content-Type: multipart/related; boundary="boundary-example"; type="text/html"
--boundary-example
Content-Type: text/html; charset="US-ASCII"
... ... <IMG SRC="fiction1/fiction2"> ... ... ... ... <IMG SRC="cid:[email protected]"> ... ...
--boundary-example
Content-Type: image/gif Content-ID: <[email protected]> Content-Location: fiction1/fiction2 --boundary-example Content-Type: image/gif Content-ID: <[email protected]> Content-Location: fiction1/fiction3
--boundary-example-- |
§ Content-type
位于信息头部的content-type用于通知接收的终端消息的各个不同部分的内容是相互关联的、并且可能是相互索引的(refer to one another)。
§Boundary
Boundary用于分割各个不同的消息part。第一个部分是一个html类型的消息,这里只是取得了相关的部分。第二和第三部分省略了实际的images图像的实体。
§Location and ID
在HTML文本部分我们可以看到,我们可以利用两种方式来索引消息内容的不同部分。这两种不同的方式是 content-ID 和 content – Location。
如果一部分的消息体想通过content-ID指向(refer to)另外一部分的消息体,可以使用“CID”.
关于MIME的部分的信息可以参考附录中列出的RFC文档(RFC2387和RFC2357)。
2. 利用MIME封装MMS的示例
下面给出一个利用MIME封装MMS的示例:
Content-Type: multipart/related; Type="application/smil"; Start="<AAAA>";boundary="----=_Part_24362_271418.1110357304160"
------=_Part_24362_271418.1110357304160 content-type: text/x-vCalendar;Charset=UTF-8;Name="slide1.vcs" content-id: <slide1.vcs> content-location: slide1.vcs Content-Transfer-Encoding: base64
QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjEuMA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMDUw MzA4VDA5MDAwMFoNCkRURU5EOjIwMDUwMzA4VDEwMDAwMFoNClNVTU1BUlk7Q0hBUlNFVD1VVEYt ODtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOuaYr+WQpg0KQ0FURUdPUklFUztDSEFSU0VUPVVU Ri04O0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6QVBQT0lOVE1FTlRTDQpFTkQ6VkVWRU5UDQpF TkQ6VkNBTEVOREFSDQo=
------=_Part_24362_271418.1110357304160 content-type: application/smil;Charset=UTF-8;Name="20050309163706.smil" content-id: <AAAA> Content-Transfer-Encoding: base64
PHNtaWw+PGhlYWQ+PGxheW91dD48cm9vdC1sYXlvdXQgd2lkdGg9IjE3NiIgaGVpZ2h0PSIxNzQi Lz48cmVnaW9uIGlkPSJmdWxsIiB3aWR0aD0iMTc2IiBoZWlnaHQ9IjE3NCIgbGVmdD0iMCIgdG9w PSIwIiAvPjwvbGF5b3V0PjwvaGVhZD48Ym9keT48cGFyIGR1cj0iNXMiPjx0ZXh0IHNyYz0ic2xp ZGUxLnZjcyIgcmVnaW9uPSJmdWxsIiAvPjwvcGFyPjwvYm9keT48L3NtaWw+
------=_Part_24362_271418.1110357304160-- |
下图给出的图示说明各个部分之间的关系:
3. 一个完整的MIME封装MMS示例
下表给出了一个完整的MIME封装MMS的示例:
MIME Object |
|
Date: Fri, 14 Dec 2001 15:13:21 -0500 (EST) X-Mms-Expiry: Thu, 20 Dec 2001 21:52:25 -0500 (EST) X-Mms-Delivery-Time: Wed, 19 Dec 2001 21:52:25 -0800 (PST) X-Mms-Priority: Normal X-Mms-Sender-visibility: Show X-Mms-Message-Class: Personal X-Mms-Delivery-report: yes X-Mms-3GPP-MM3-Version: 4.3.0 From: [email protected] Subject: Sample SMIL Mime-Version: 1.0 Content-Type: multipart/related; boundary="---- =_MIME_Boundary_MMS_Reference_Sample_001" |
MIME Headers |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME Start boundary |
Content-ID: <index.smil> Content-Type: application/smil; charset="US-ASCII"; name=index.smil <smil> <head> <layout><root-layout/> <region id="region1_2" top="0" left="0" height="100%" width="100%"/> <region id="region1_1" top="0" left="0" height="100%" width="100%"/> </layout> </head> <body> <par dur="2000ms"> <text src="Cid:image" region="region1_2"/> </par> <par dur="2000ms"> <img src="Cid:txt" region="region1_1" fit="fill"/> </par> </body> </smil> |
SMIL document |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME boundary |
Content-Type: text/plain; name=mms.txt Content-Transfer-Encoding: 7bit Content-ID: <txt> Content-Disposition: attachment; filename=mms.txt This is a sample MMS message, for use as a reference. |
Text Document |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME boundary |
Content-Type: image/gif; name=sample.gif Content-Transfer-Encoding: base64 Content-ID: <image> Content-Disposition: attachment; filename=sample.gif
R0lGODlhZQBQAPcAAOYeAClUpyAtb/XNjlo8RqoUFHSa2ZCKjHiCWrzf/2iQ1J m66Yeq4cXm/6ys
<entire encoded image not shown for the sake of brevity> kBiJkjiJlFiJlniJmJiJmriJnNiJnviJoBiKogh5AQEAOw== |
Image |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME boundary |
二、MMS的MIME结构
综述来说,每个MMS信息按照MIME规范的基本结构如下图所示:
从图示看出,每个MMS都是由MMS Header和MMS Body组成,MMS Header根据WAP-209协议和RFC2387的规定,由一系列的域组成,下表列出了部分的域(给出的示范的内容表示),其中有些是强制必须实现的(用黑体表示)。
X-Mms-Message-Type |
m-send-req |
X-Mms-Transaction-ID |
1234 |
X-Mms-MMS-Version |
1.0 |
Date |
星期五, 18 三月 2005 06:43:40 GMT |
From |
mms-editor@toolkit |
To |
33333333333333 |
Cc |
33333333333333 |
Bcc |
|
Subject |
test |
X-Mms-Message-Class |
Personal |
X-Mms-Expiry |
星期六, 19 三月 2005 06:43:40 GMT |
X-Mms-Delivery-Time |
星期五, 18 三月 2005 06:43:40 GMT |
X-Mms-Priority |
low |
X-Mms-Sender-Visibility |
Show |
X-Mms-Delivery-Report |
No |
X-Mms-Read-Reply |
No |
Content-Type |
application/vnd.wap.multipart.related; start="<presentation-part>" type="application/smil" |
1. MMS承载的内容elements
MMS只是用于发送消息的载体,根据规范,我们可以发送各种不同类型的内容元素。这些内容元素组成MMS中各个不同的部分。根据元素类型的不容,每个part Header部分的content-type也不尽相同。下面给以示例:
文本:文本包含很多类型,普通文本的类型可以表示为——text/plain,而vcard类型的文本表示为text/x-vCard。
静态图像:静态图像存在各种不同的类型,根据不同的编码方式由不同的后缀名表示。如image/gif 和image/jpeg。
音效是什么呢?没有介绍,应该是audio/mid 吧..
OldKitty(老猫)关于mms的一个回复也把它贴在这里:
MMS 概括来说包括两大部分的内容:内容和传输.其中内容包括上面各位说的文字/图象/声音等等,而且有多种不同的格式(content type and content format),而这些内容可以通过SMIL组合起来,控制显示/播放的顺序和位置等.
传输则是我上面所说的 那些,理论上讲可以采用多种方式,因为3gpp只是定义了需要用到的各个源语及其功能和可包含的域,但并未定义具体的格式,因此wapforum就制定了 在wap的基础上如何实现MMS的规范,其中具体定义了各个源语的格式.所以目前来说,见到的手机上的MMS实现应该都是基于wap的.当然了,由于 wsp与http有着密切的联系和基本的对应关系,因此利用http也可以获取和发送mms,在wap2.0中其实就直接可以使用针对无线修改过的 http(如果我没有记错的话),而wsp/wtp/wtls/wdp等协议已经退居二线了
Teky说:
网上的开发mms彩信发送/接受的资料还是比较少的,也不全面,据说相关技术被几家大公司垄断,和和,不知真假,反正要真正写出实现代码还是有很大困难的。
在这里佩服下老兄James lee ,能在这么短时间内写出来,还真是强悍。
不过目前少了mms中的音效部分,不知道在多媒体包头中音效的包头要如何来打包,继续研究...