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

原创 2015年11月20日 17:21:08

初学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媒体播放器"); 


相关文章推荐

AVI编码方式及OpenCV读取AVI文件-解决opencv无法读AVI视频的问题

转帖地址:http://www.360doc.com/content/10/1228/10/2036337_81939525.shtml以AVI结尾的视频文件有以下几种:1、非压缩格式的AVI文件(或...

java可视化编程-eclipse安装windowbuilder插件

一直做在安卓用xml作界面,对于java的控件不熟悉,也不习惯用代码做UI尤其是布局。 找了一下发现可以安装windowbuilder来实现java的可视化编程,但是很多资料里的连接都失效了。 刚自己...

JMF播放视频的问题

最近在公司开发一个视频分析的项目时,由于用到的是Java继

解决Android7.0系统 调用系统相机、系统播放器播放视频、切图兼容问题,报异常android.os.FileUriExposedException

Android7.0以前获取本地文件uri用的Uri.fromFile(new File(filePath)); 后会得到一个file://,这种方式呢7.0及以后的系统版本就用不了,且会报一个异常:...

利用JMF播放视频 简单示例

本文主要使用JMF来实现在一个Applet中播放本地MPEG格式视频文件。并给出一个实例。 author: ZJ   06-11-15 Blog: [url]http://zhangjunhd.b...

使用JMF实现java写自己的视频播放器

JMF这个多媒体开发框架太牛了,简单的几句代码就能实现一个视频播放器的开发,厉害,就是支持的格式少了一些,没关系,这个视频播放器可以播放mpg,avi,fvl等等,想播放其他的请开发自己的插件,下面将...

C# 播放器 播放视频

  • 2015年01月18日 16:41
  • 485KB
  • 下载

解决webView无法播放视频的问题

在日常的android开发中,我们有时会用到 WebView去加载一个html文件,注意

【Android】播放视频的简易播放器源码

一,MainActivity.java源码 import android.app.Activity; import android.graphics.PixelFormat; import andr...

对Android基于vitamio框架调用第三方播放器播放视频的初步认识

认识Vitamio Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java jmf视频播放器无法播放视频问题
举报原因:
原因补充:

(最多只允许输入30个字)