要在手机上进行多媒体文件的播放,需要用到J2ME提供的MMAPI(Moblile Media API),它为各种不同格式的多媒体文件提供了一套规范的播放和录制音频/视频文件的统一接口。

使用MMAPI进行多媒体播放的基本流程是:首先从数据源上读取多媒体数据内容(这些数据内容的格式可能各不相同),然后将这些多媒体数据内容传输给 DataSource类进行处理,DataSource类读取并将它们转换为统一的格式,最后由Player类负责播放这些数据。这对于手机音频开发和手机视频开发都是适用的。

基本的开发过程可以分成下面的几个步骤来进行:

首先,MMAPI使用了Manager类来创建一个Player对象,然后由Player对象读取视频数据,视频数据既可以是本地视频文件的数据,也可以是网络视频文件的数据。

如果读取的是本地视频文件的数据,方法如下:

InputStream ins = getClass().getResourceAsStream("/test1.mpg"); // 创建本地视频数据的输入流

Player player = Manager.createPlayer(ins, "video/mpeg"); // 创建读取本地视频数据的Player对象


如果读取的是网络视频文件中的数据,则在createPlayer()方法中直接指定网络视频文件的URL即可:

Player player = Manager.createPlayer("http://127.0.0.1/test2.mpg"); // 创建读取网络视频数据的Player对象

创建了Player对象之后,通过Player对象的getControl()方法创建一个VideoControl对象来对需要播放的数据进行控制。VideoControl是一个用来播放视频的控件接口,视频的播放必须通过这个接口才能正常播放。

VideoControl vc = (VideoControl) player.getControl("VideoControl");

创建了VideoControl对象之后,就必须把VideoControl对象播放的视频图像显示到手机屏幕上。

将VideoControl对象播放的视频图像显示到手机屏幕上的方法有两种,一种是通过一个Canvas类来实现,一种是作为一个Item控件添加到Form类手机屏幕上。

 

本地视频的播放

void areaplay(String url) {
   try {
      InputStream ins = getClass().getResourceAsStream("/" + url);
      player = Manager.createPlayer(ins, "video/mpeg");
      player.realize(); // 准备播放
      vc2 = (VideoControl) player.getControl("VideoControl");
      if (vc2 != null) {
         vc2.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
         // 获取视频的原始大小
         int frameW = vc2.getSourceWidth();
         int frameH = vc2.getSourceHeight();
         // 计算视频屏幕在手机屏幕上的坐标
         if (frameW > videoW) {
            frameW = videoW;
         }
         if (frameH > videoH) {
            frameH = videoH;
         }
         int frameX = (videoW - frameW) / 2 + VB_W;
         int frameY = (videoH - frameH) / 2 + VB_H;
         // 设置视频屏幕坐标,使视频在手机屏幕的中间显示
         vc2.setDisplayLocation(frameX, frameY);
         // 设置视频屏幕大小
         vc2.setDisplaySize(frameW, frameH);
         vc2.setVisible(true);
         this.addCommand(AStopCmd);
         this.addCommand(AExitCmd);
         this.setCommandListener(this);
      }
      player.start(); // 播放视频
   }
   catch (Exception err10) {
      display.setCurrent(areaform);
      areaform.append("打开视频时可能出错..请重试!");
      reset();
   }
}

 

网络视频的播放

void netplay(String url) {
   try {
      player = Manager.createPlayer(url);
      player.realize(); // 准备播放
      vc = (VideoControl) player.getControl("VideoControl");
      if (vc != null) {
         Item video;
         video = (Item) vc.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null);
         v.deleteAll();
         v.append(video);
         v.addCommand(VStopCmd);
         v.addCommand(VExitCmd);
         v.setCommandListener(this);
         display.setCurrent(v);
      }
      player.start(); // 播放视频
   }
   catch (Throwable err11) {
      urlform.append("连接超时或服务器地址不正确");
      reset();
   }
}

 

posted on 2013-03-06 14:25  爱哎唉  阅读(207)  评论(0)    收藏  举报