移动多媒体学习之一

    好多项目要开工了。以后会忙个像头牛,在这里学习,交流真是爽。趁着现在有那么点点时间,把今天的学习经验交流下。我想没有比开发多媒体软件更令人兴奋 了。特别是手机多媒体,以前也常常想,该怎么样来查看gif图片了。怎么样看那些mpeg的视频片段了。好了。我开始学习mma了,我想把我学习的经验与 大家交流下。
    这篇文章我只是拿个简单的官方的例子来看写,让我们大家对这个mma有个初步的了解。
 

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

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

MMAPI组件总揽<o:p></o:p>

MMAPI有四个主要的组成部分:<o:p></o:p>

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

l         Manager是媒体的总控制者,它创建播放器。<o:p></o:p>

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

l         Control控制Player和重放操作的不同特征。<o:p></o:p>

MMAPI支持的控制操作<o:p></o:p>

MMAPIjavax.microedition.control包中包含了12种控制操作:<o:p></o:p>

l         MetaDataControl用来从媒体数据中获得元数据信息。<o:p></o:p>

l         MIDIControl提供对播放器表现和传输设备的访问。<o:p></o:p>

l         GUIControl代表一个具有用户界面组件的控制操作。<o:p></o:p>

l         PitchControl升高或降低重放的位置而不改变重放的速度。<o:p></o:p>

l         RateControl控制重放的速率。<o:p></o:p>

l         TempoControl控制MIDI歌曲的节奏。<o:p></o:p>

l         VolumeControl控制音量。<o:p></o:p>

l         VideoControl控制可视内容的显示。<o:p></o:p>

l         FramePositioningControl可以对一个视频帧精确定位。<o:p></o:p>

l         RecordControl记录当前被Player播放的是什么内容。<o:p></o:p>

l         StopTimeControl使应用程序可以为一个Player预先指定一个停止时间。<o:p></o:p>

l         ToneControl是一个可以播放用户自定音调序列的接口。<o:p></o:p>

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

l         microedition.media.version返回一个代表MMAPI实现版本的字符串。如果当前设备支持MMAPI,返回“<st1:chmetcnv unitname="”" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1.0</st1:chmetcnv>或者“<st1:chmetcnv unitname="”" sourcevalue="1.1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1.1</st1:chmetcnv>,反之,则返回“null”。<o:p></o:p>

l         supports.mixing如果支持混频则返回true,否则返回false<o:p></o:p>

l         supports.audio.capture如果支持音频记录就返回true,否则返回false<o:p></o:p>

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<o:p></o:p>

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

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

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

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

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

MMAPIJ2ME无线工具箱2.2<o:p></o:p>

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

MIME类型

描述

audio/midi

MIDI文件

audio/sp-midi

可升级的多音MIDI

audio/x-tone-seq

MIDP2.0音调序列

audio/x-wav

WAV PCM取样音频

image/gif

FIG<st1:chmetcnv unitname="a" sourcevalue="89" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">89a</st1:chmetcnv>(活动的GIF

video/mpeg

MPEG视频

video/vnd.sun.rgb565

视频记录

MMAPI MIDlets<o:p></o:p>

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

<v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" id="_x0000_t75"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><o:p></o:p>

1<o:p></o:p>

MMAPIMIDP2.0 Media API的比较<o:p></o:p>

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

l         简易音频播放

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

l         支持自定音调

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

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

l         支持容量查询

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

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

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

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

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

MMAPI和高级多媒体补充(Advanced Multimedia Supplements)的比较<o:p></o:p>

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

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

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

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

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

总结<o:p></o:p>

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

上面的这个文章是j2medev里面的一个高手翻译的。看了基本上是有个了解了。

下面也让我们看下一个例子代码,也是出自j2medev。
java 代码
  1. public class GifPlayer extends MIDlet {  
  2.      
  3.     private Display display = null;  
  4.     private Player player = null;  
  5.      
  6.     public void startApp() {  
  7.         if(display == null)  
  8.             display = Display.getDisplay(this);  
  9.         Form form = new Form("gif player");  
  10.         InputStream is = getClass().getResourceAsStream("/a.gif");  
  11.         createPlayer(is);  
  12.         if(player == null){  
  13.             form.append("can not play image/gif");  
  14.         }else{  
  15.             VideoControl vc = (VideoControl)player.getControl("VideoControl");  
  16.             if(vc != null){  
  17.                // form.append((Item)vc.initDisplayMode(
  18. VideoControl.USE_GUI_PRIMITIVE,null));  
  19.             }  
  20.         }  
  21.         display.setCurrent(form);  
  22.         try {  
  23.             form.append(Image.createImage("/a.gif"));  
  24.         } catch (IOException e) {  
  25.             // TODO 自动生成 catch 块  
  26.             e.printStackTrace();  
  27.         }  
  28.         try {       player.realize();
    &

你可能感兴趣的:(框架,网络协议,F#,网络应用,vc++)