java jmf视频播放器无法播放视频问题

初学java,谢了一个参照网上代码写了个java jmf视频播放器,运行调试代码没问题,可是被这个avi视频格式纠结的要死,换了n多个avi格式视频依然不行,经过查阅资料发现现在网上流行的avi格式并不是真正的avi格式,大都是其他格式转化来的,所以jmf无法识别,必须使用真正的avi格式。在这里附上源码,测试通过的avi视频。




import java.awt.BorderLayout;
import java.awt.Component; 
import java.awt.FileDialog; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.media.ControllerClosedEvent; 
import javax.media.ControllerEvent; 
import javax.media.ControllerListener; 
import javax.media.EndOfMediaEvent; 
import javax.media.Manager; 
import javax.media.MediaLocator; 
import javax.media.NoPlayerException; 
import javax.media.Player; 
import javax.media.PrefetchCompleteEvent; 
import javax.media.RealizeCompleteEvent; 
import javax.media.Time; 
import javax.swing.JCheckBoxMenuItem; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 


public class JMFMediaPlayer extends JFrame implements ActionListener, 
ControllerListener, ItemListener { 
// JMF的播放器 
Player player; 
// 播放器的视频组件和控制组件 
Component vedioComponent; 
Component controlComponent; 
// 标示是否是第一次打开播放器 
boolean first = true; 
// 标示是否需要循环 
boolean loop = false; 
// 文件当前目录 
String currentDirectory; 
// 构造方法 
public JMFMediaPlayer(String title) { 
super(title); 
addWindowListener(new WindowAdapter() { 
public void windowClosing(WindowEvent e){ 
// 用户点击窗口系统菜单的关闭按钮 
// 调用dispose以执行windowClosed 
dispose(); 

public void windowClosed(WindowEvent e){ 
if (player != null){ 
// 关闭JMF播放器对象 
player.close(); 

System.exit(0); 

}); 
// 创建播放器的菜单 
JMenu fileMenu = new JMenu("文件"); 
JMenuItem openMemuItem = new JMenuItem("打开"); 
openMemuItem.addActionListener(this); 
fileMenu.add(openMemuItem); 
// 添加一个分割条 
fileMenu.addSeparator(); 
// 创建一个复选框菜单项 
JCheckBoxMenuItem loopMenuItem = new JCheckBoxMenuItem("循环", false); 
loopMenuItem.addItemListener(this); 
fileMenu.add(loopMenuItem); 
fileMenu.addSeparator(); 
JMenuItem exitMemuItem = new JMenuItem("退出"); 
exitMemuItem.addActionListener(this); 
fileMenu.add(exitMemuItem); 


JMenuBar menuBar = new JMenuBar(); 
menuBar.add(fileMenu); 
this.setJMenuBar(menuBar); 
this.setSize(200, 200); 


try { 
// 设置界面的外观,为系统外观 
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
SwingUtilities.updateComponentTreeUI(this); 
} catch (Exception e) { 
e.printStackTrace(); 

this.setVisible(true); 

/** 
* 实现了ActionListener接口,处理组件的活动事件 
*/ 
public void actionPerformed(ActionEvent e) { 
if (e.getActionCommand().equals("退出")) { 
// 调用dispose以便执行windowClosed 
dispose(); 
return; 

FileDialog fileDialog = new FileDialog(this, "打开媒体文件", FileDialog.LOAD); 
fileDialog.setDirectory(currentDirectory); 
fileDialog.setVisible(true); 
// 如果用户放弃选择文件,则返回 
if (fileDialog.getFile() == null){ 
return; 

currentDirectory = fileDialog.getDirectory(); 
if (player != null){ 
// 关闭已经存在JMF播放器对象 
player.close(); 

try { 
// 创建一个打开选择文件的播放器 
player = Manager.createPlayer(new MediaLocator("file:" 
+ fileDialog.getDirectory() + fileDialog.getFile())); 
} catch (java.io.IOException e2) { 
System.out.println(e2); 
return; 
} catch (NoPlayerException e2) { 
System.out.println("不能找到播放器."); 
return; 

if (player == null) { 
System.out.println("无法创建播放器."); 
return; 

first = false; 
this.setTitle(fileDialog.getFile()); 
// 播放器的控制事件处理 
player.addControllerListener(this); 
// 预读文件内容 
player.prefetch(); 

/** 
* 实现ControllerListener接口的方法,处理播放器的控制事件 
*/ 
public void controllerUpdate(ControllerEvent e) { 
// 调用player.close()时ControllerClosedEvent事件出现。 
// 如果存在视觉部件,则该部件应该拆除(为一致起见, 
// 我们对控制面板部件也执行同样的操作) 
if (e instanceof ControllerClosedEvent) { 
if (vedioComponent != null) { 
this.getContentPane().remove(vedioComponent); 
this.vedioComponent = null; 

if (controlComponent != null) { 
this.getContentPane().remove(controlComponent); 
this.controlComponent = null; 

return; 

// 如果是媒体文件到达尾部事件 
if (e instanceof EndOfMediaEvent) { 
if (loop) { 
// 如果允许循环,则重新开始播放 
player.setMediaTime(new Time(0)); 
player.start(); 

return; 

// 如果是播放器预读事件 
if (e instanceof PrefetchCompleteEvent) { 
// 启动播放器 
player.start(); 
return; 

// 如果是文件打开完全事件,则显示视频组件和控制器组件 
if (e instanceof RealizeCompleteEvent) { 
vedioComponent = player.getVisualComponent(); 
if (vedioComponent != null){ 
this.getContentPane().add(vedioComponent); 

controlComponent = player.getControlPanelComponent(); 
if (controlComponent != null){ 
this.getContentPane().add(controlComponent, BorderLayout.SOUTH); 

this.pack(); 




// 处理“循环”复选框菜单项的点击事件 
public void itemStateChanged(ItemEvent e) { 
loop = !loop; 

public static void main(String[] args){ 
new JMFMediaPlayer("JMF媒体播放器"); 


你可能感兴趣的:(java,视频,JMF,avi)