主要是用到jmf(Java媒体框架),百度下载安装jmf(具体的自己百度教程,安装在Java主目录下),先测验是否安装成功,随便百度一个可运行的代码,看看能否播放mpeg或者mpg
的视频文件,如果播放没有声音或者没有图像,那么是安装失败(一般要把jmf的jar包复制到jdk的lib下或者jre的lib下,我的是这些包被放在jre\lib\ext下并设置相应的环境变量),重新安装几遍吧。
Player的状态变化图
Jmf播放视频的过程是这样的,媒体定位器根据文件定位媒体,管理器根据媒体定位创建播放器,播放器添加媒体控制器后,开始监听媒体状态,然后根据不同的状态事件进行操作。
示例程序:
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.Time;
import javax.swing.JFrame;
public class Test extends JFrame {
public Container videoContainer = new Container();
public GridBagLayout layout = new GridBagLayout();// 可变布局
public GridBagConstraints constraints = new GridBagConstraints();// 布局设置
public VideoPlayer videoPlayer=new VideoPlayer();
public Test(){
videoPlayer.play("file:/C:/Users/xxb/Desktop/cat.mpeg");
videoContainer.setLayout(layout);
constraints.fill = GridBagConstraints.BOTH;// 组件随显示变化的选项
constraints.weightx = 1;// 水平扩展,即显示变化时,长度变化
constraints.weighty = 1;// 垂直扩展,即高度变化
while(videoPlayer.getMediaShow()==null||videoPlayer.getMediaControl()==null){}
addComponent(videoPlayer.getMediaShow(),layout,constraints, 0, 0, 4, 1, videoContainer);
addComponent(videoPlayer.getMediaControl(),layout,constraints, 0, 1, 1, 1, videoContainer);
this.add(videoContainer);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation(350, 120);
this.setSize(750, 560);
this.setVisible(true);
}
public void addComponent(Component component,GridBagLayout layout,GridBagConstraints constraints, int x, int y, int width,
int height, Container container) {
constraints.gridx = x;
constraints.gridy = y;
constraints.gridwidth = width;
constraints.gridheight = height;
layout.setConstraints(component, constraints);
container.add(component);
}
public static void main(String[] args) {
new Test();
}
}
单独的VideoPlayer类
public class VideoPlayer {
private Player player; // 播放器对象
private Component mediaShow; // 视频显示组件
private Component mediaControl; // 视频播放控制组件
public VideoPlayer() {}
public Component getMediaShow() {return mediaShow;}
public void setMediaShow(Component mediaShow) {this.mediaShow = mediaShow;}
public Component getMediaControl() {return mediaControl;}
public void setMediaControl(Component mediaControl) {
this.mediaControl = mediaControl;}
public void play(String fileUrl) {
if (player != null){player.close();}
MediaLocator mediaLocator = new MediaLocator(fileUrl); // 媒体定位器
try {
player = Manager.createPlayer(mediaLocator); // 得到播放器实例
player.addControllerListener(new PlayerHandler()); // 增加播放控制器
player.realize();// 播放器进行实例化,获取除互斥资源外的绘制资源
} catch (Exception ex) {ex.printStackTrace();}}
public void getMediaComponents() {
mediaShow = player.getVisualComponent(); // 取得视频显示组件
mediaControl = player.getControlPanelComponent(); // 取得播放控制组件
} // 播放器事件处理
private class PlayerHandler implements ControllerListener {
public void controllerUpdate(ControllerEvent event) {
if (event instanceof RealizeCompleteEvent) {
player.prefetch();// 播放器预取,获取包括互斥资源在内的所有资源
} else if (event instanceof PrefetchCompleteEvent) {
getMediaComponents();
player.start(); // 开始播放媒体
} else if (event instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0)); // 重新设置媒体时间
player.stop(); // 停止媒体播放
}
}
}
}