要在手机上进行多媒体文件的播放,需要用到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();
}
}
浙公网安备 33010602011771号