JMF是SUN推出的用来提供给Java开发者使用Java开发视频与音频播放程序的开发库,JMF的推出已经有几年的历史了,目前最新的版本为 2.1.1e,这里我们来讲述使用Java的AWT组件来开发一个视频播放器,采用JMF作为视频的播放库,希望能够抛砖引玉,使得更多的人能够对JMF 进行更加深入的研究,并贡献出自己的研究所得。
首先,您需要下载用于自身操作系统的JMF安装包,下载地址:http://java.sun.com/products/java-media/jmf /2.1.1/download.html,我们这里针对Windows操作系统进行JMF的开发。要注意的是,JMF针对不同平台的实现是有少许差别的,不同的平台对媒体文件格式的支持可能存在差异,具体的平台对媒体文件格式的支持细节,您可以直接查看:http://java.sun.com /products/java-media/jmf/2.1.1/formats.html。安装过程就不用多解释了,您可以直接运行安装文件,选择自己所希望的目录完成安装,我们这里不多做说明。
接下来,我们可以使用Eclipse新建一个普通的java应用程序,把JMF安装目录下的lib中的jmf.jar、mediaplayer.jar、 sound.jar三个jar文件加入到项目的classpath(如果您对classpath不了解,可以在我的博客中找到关于classpath的详细解释的文章)中,到这里,编译和运行项目的基本配置都准备好了,下面可以编写代码了。
在项目中添加一个类JMFSample,代码和具体的解释如下:
packagecom.jmfsample2;importjava.awt.BorderLayout;importjava.awt.Component;importjava.awt.Dimension;importjava.awt.Frame;importjava.awt.Panel;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.IOException;importjava.net.MalformedURLException;importjava.net.URL;importjavax.media.ControllerEvent;importjavax.media.ControllerListener;importjavax.media.EndOfMediaEvent;importjavax.media.Manager;importjavax.media.MediaLocator;importjavax.media.NoPlayerException;importjavax.media.Player;importjavax.media.PrefetchCompleteEvent;importjavax.media.RealizeCompleteEvent;importjavax.media.Time;publicclassJMFSampleimplementsControllerListener {publicstaticvoidmain(String[] args) {
JMFSample sp=newJMFSample();
sp.play();
}privateFrame f;privatePlayer player;privatePanel panel;privateComponent visual;privateComponent control=null;publicvoidplay(){
f=newFrame("JMF Sample1");
f.addWindowListener(newWindowAdapter() {publicvoidwindowClosing(WindowEvent we) {if(player!=null) {
player.close();
}
System.exit(0);
}
});
f.setSize(500,400);
f.setVisible(true);
URL url=null;try{//准备一个要播放的视频文件的URLurl=newURL("file:/E:/c-d.avi");
}catch(MalformedURLException e) {
e.printStackTrace();
}try{//通过调用Manager的createPlayer方法来创建一个Player的对象//这个对象是媒体播放的核心控制对象player=Manager.createPlayer(url);
}catch(NoPlayerException e1) {
e1.printStackTrace();
}catch(IOException e1) {
e1.printStackTrace();
}//对player对象注册监听器,能噶偶在相关事件发生的时候执行相关的动作player.addControllerListener(this);//让player对象进行相关的资源分配player.realize();
}privateintvideoWidth=0;privateintvideoHeight=0;privateintcontrolHeight=30;privateintinsetWidth=10;privateintinsetHeight=30;//监听player的相关事件publicvoidcontrollerUpdate(ControllerEvent ce) {if(ceinstanceofRealizeCompleteEvent) {//player实例化完成后进行player播放前预处理player.prefetch();
}elseif(ceinstanceofPrefetchCompleteEvent) {if(visual!=null)return;//取得player中的播放视频的组件,并得到视频窗口的大小//然后把视频窗口的组件添加到Frame窗口中,if((visual=player.getVisualComponent())!=null) {
Dimension size=visual.getPreferredSize();
videoWidth=size.width;
videoHeight=size.height;
f.add(visual);
}else{
videoWidth=320;
}//取得player中的视频播放控制条组件,并把该组件添加到Frame窗口中if((control=player.getControlPanelComponent())!=null) {
controlHeight=control.getPreferredSize().height;
f.add(control, BorderLayout.SOUTH);
}//设定Frame窗口的大小,使得满足视频文件的默认大小f.setSize(videoWidth+insetWidth, videoHeight+controlHeight+insetHeight);
f.validate();//启动视频播放组件开始播放player.start();
}elseif(ceinstanceofEndOfMediaEvent) {//当播放视频完成后,把时间进度条恢复到开始,并再次重新开始播放player.setMediaTime(newTime(0));
player.start();
}
}
}
完成上述代码,直接编译运行就可以了,是不是您的视频播放器开始工作了?恭喜你,成功了!