站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题比较J2ME多媒体可选包

比较J2ME多媒体可选包

摘要: 比较J2ME多媒体可选包

作者:mydeman 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=783

在J2ME中,移动媒体API(MMAPI)是一个可选包,它提供了一个标准的API,可以用来表现和获得以时间为基础的媒体。例如声音轨道和视频片断。MMAPI在Java社区进程中以JSR-135开发,并且它被设计成灵活的和平台无关的,它没有对媒体格式、协议或者在未来不同设备支持的特征作任何假设。MMAPI已经在移动设备上使用,例如,Nokia3650就包含了一个实现。其它支持MMAPI的设备可以在“J2ME设备”中找到。

这篇文章将介绍MMAPI的最新发展:MMAPI1.1中提出的新的安全考虑、MMAPI和MIDP2.0 Media API之间的不同、J2ME无线工具箱(J2ME Wireless Toolkit)对MMAPI的支持和JSR-234,高级多媒体补充(Advance Multimedia Supplement)。如果你正在寻找一个MMAPI的指南和示例代码,例如为一个音频/视频播放器,请参见“J2ME移动媒体API”和“使用MMAPI拍摄照片”。

MMAPI组件总揽

MMAPI有四个主要的组成部分:

l Player用来播放内容。它提供了方法,用来管理播放器的生命周期,和不同的重放特征。

l Manager是媒体的总控制者,它创建播放器。

l DataSource代表一个协议的控制者,它对应用程序开发者通常是不可见的。这个协议管理者读出媒体并放到播放器中进行播放。

l Control控制Player和重放操作的不同特征。

MMAPI支持的控制操作

MMAPI在javax.microedition.control包中包含了12种控制操作:

l MetaDataControl用来从媒体数据中获得元数据信息。

l MIDIControl提供对播放器表现和传输设备的访问。

l GUIControl代表一个具有用户界面组件的控制操作。

l PitchControl升高或降低重放的位置而不改变重放的速度。

l RateControl控制重放的速率。

l TempoControl控制MIDI歌曲的节奏。

l VolumeControl控制音量。

l VideoControl控制可视内容的显示。

l FramePositioningControl可以对一个视频帧精确定位。

l RecordControl记录当前被Player播放的是什么内容。

l StopTimeControl使应用程序可以为一个Player预先指定一个停止时间。

l ToneControl是一个可以播放用户自定音调序列的接口。

必须明白,并不是所有的MMAPI实现都支持所有的控制操作类型。你可以通过调用System.getProperty(String key)得到一个设备所支持的控制类型。这个规范定义如下这些属性:

l microedition.media.version返回一个代表MMAPI实现版本的字符串。如果当前设备支持MMAPI,返回“1.0”或者“1.1”,反之,则返回“null”。

l supports.mixing如果支持混频则返回true,否则返回false。

l supports.audio.capture如果支持音频记录就返回true,否则返回false。

l supports.video.capture如果支持视频记录就返回true,否则返回false。

l supports.recording如果支持录制就返回true,否则返回false。

l audio.encodings返回一个代表所支持的音频格式的字符串,如果不支持音频内容则返回“null”。

l video.encodings返回一个代表所支持的视频格式的字符串,如果不支持视频内容则返回“null”。

l video.snapshot.encodings返回一个代表所支持的图像格式的字符串,如果不支持视频快照则返回“null”。

l streamable.contents返回一个代表所支持的流媒体内容类型的字符串,以MIME语法。

除了被System.getProperty()支持的属性外,Manager类还提供了几个有用的静态方法:

l String[] getSupportedContentTypes(String protocol)传入一个协议如“http”作为参数,返回这个协议所支持的内容类型。

l String[] getSupportedProtocols(String contentType)传入一个以MIME语法的内容类型如“video/mpeg”,返回可以用来传递这种类型的协议。

MMAPI1.1

MMAPI1.1是MMAPI1.0的延续和更新。它主要修改了文档问题,增加了一些新的定义,并且修订了和MIDP2.0安全框架相关联的文档。它没有对类、接口以及方法定义做任何修改。

MMAPI没有定义它自己的安全框架,但是MMAPI实现从属于潜在的Profile和Configuration所提供的安全框架。如果调用者缺乏合适的安全许可,一些MMAPI方法被定义抛出一个SecurityException。因此,一个MMAPI实现必须保证:

l 当调用者没有合适的权限而执行MMAPI实现中的方法时,要抛出SecurityException。

l 当被授予合适的权限后,其中的方法可能会用到。

MMAPI的安全问题涉及到录制、网络访问和本地数据存储访问。录制关系到用户的私有权;应用程序可能默默的访问录制功能,录制和分发私人会话。另外,安全实践必须可以在适当的位置访问远程和本地资源。为了获得访问录制功能、网络和本地数据存储的权限,一个MMAPI实现必须获得实现制定的合适的权限。

MMAPI和J2ME无线工具箱2.2

J2ME无线工具2.2版本实现JSR-135。随这个工具箱一起发布的有一个模拟器皮肤,MediaControlSkin,它主要用于在多媒体的播放和控制。这个模拟器的MMAPI实现支持一下媒体类型。

<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 77.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="181">

MIME类型

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="159">

描述

</td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="181">

audio/midi

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="159">

MIDI文件

</td></tr><tr style="mso-yfti-irow: 2"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="181">

audio/sp-midi

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="159">

可升级的多音MIDI

</td></tr><tr style="mso-yfti-irow: 3"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="181">

audio/x-tone-seq

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="159">

MIDP2.0音调序列

</td></tr><tr style="mso-yfti-irow: 4"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="181">

audio/x-wav

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="159">

WAV PCM取样音频

</td></tr><tr style="mso-yfti-irow: 5"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="181">

image/gif

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="159">

FIG89a(活动的GIF)

</td></tr><tr style="mso-yfti-irow: 6"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="181">

video/mpeg

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="159">

MPEG视频

</td></tr><tr style="mso-yfti-irow: 7; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 135.65pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="181">

video/vnd.sun.rgb565

</td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 119.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="159">

视频记录

</td></tr></table>

MMAPI MIDlets

随工具箱发布的还有一些MMAPI的demo。一个特别用户的demo是Pausing Audio Test,它是mmademo工程的一部分。它展示了一个良好开发的MMAPI MIDlet应该如何运转。例如,你必须清楚MIDlets可能会被一些事件中止,如一个来电,如图1所示。当你的MIDlets中止时,它们应该释放比较重要的设备资源,当MIDlet恢复时,再重新分配或启动那些资源。当一个MIDlet中止时,任何播放器都应该停止,如果William Tell Overture穿过一个重要的商务电话一直播放,你的用户并不会感谢你。

<formulas></formulas>

图1

MMAPI和MIDP2.0 Media API的比较

MIDP2.0媒体API是MMAPI一个直系的子集,打算提供给那些资源有限运行MIDP2.0的设备,尽管同样的子集可能被其他需要声音支持的J2ME Profile采用。这个API实现了MIDP专家组制定的要求,包括:

l 简易音频播放

l 不依赖于任何特定的协议和内容格式

l 支持自定音调

l 支持普通的媒体流控制,如开始、停止、查找等

l 支持媒体类型特定的控制,如声音

l 支持容量查询

因为这些要求,MIDP2.0 Media API和MMAPI有以下不同:

l 如果仅仅是视频,它不包含视频或图像特定的控制操作。

l 不支持多个播放器同时使用一个普通时间基同步播放。

l 不支持通过自定义DataSource的方式自定义协议,不包含javax.microedition.media.protocol包。

l 使用Manager的一个简化版本。

MMAPI和高级多媒体补充(Advanced Multimedia Supplements)的比较

JSR-135引入了音频和视频的基础的播放功能。JSR-234,高级多媒体补充,将会通过为高级多媒体功能定义一个可选包支持最近的硬件更新。在J2ME/CLDC环境中,新的API依赖和增加了MMAPI的特征。提供这个可选包的主要目的是为了更好的支持照相机和收音机,也为了高级音频处理。在规范中描述的一些能力有:

l 支持特定的照相机控制,如亮度对比、闪光、灯光模式和镜头变焦。

l 正确的访问收音机和其他基于频道和频率的媒体源,包括无线电数据系统。

l 高级的音频处理能力,如均衡器和音频效果。

l 媒体输出方式指定,用来选择音频是通过喇叭播放还是通过耳机播放。

总结

MMAPI可选包为运行在MIDP设备上的应用程序,提供了一些宜人的功能,在以前这些功能并不可用。它的可扩展架构为以后在移动设备上提供更多的功能创造了机会。这篇文章描述了MMAPI的主要组成部分,讨论了在1.1版本中的变化,并且解释了MMAPI、MIDP2.0 Media API和高级多媒体补充(Advanced Multimedia Supplements)之间的关系。如果你想将MMAPI运用在实际中,请下载J2ME无线工具箱2.2,然后研究mmademo和Audiodemo工程。
查看原文



↑返回目录
前一篇: JSR180, SIP API for J2ME
后一篇: J2ME移动2D图形快速入门