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

2023-11-11

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java jmf视频播放器无法播放视频问题 的相关文章

随机推荐

  • url地址输入到页面的经过

    简单理解如下 1 域名解析 2 缓存检查 强缓存跟协商缓存 强缓存 协商缓存 DNS 解析 解析有两种 递归查询跟迭代查询 先走递归 看本地 3 1递归查询 没有再去服务器上面去看 3 2 迭代查询 4 三次握手 这个是建立好TCP通道了
  • stl中set的并、交、差集

    set的键是自动排序的 对应的求并集差集交集都可以用到这个有序的特性 时间复杂度都为O m n m n分别为两个容器的大小 1 set union可以用来求两个集合的并集 它是一种稳定的操作 因为元素间的相对位置不会改变 源码如下 temp
  • Unity动画系统(Animation与Animator的区别)

    老版本Unity使用的是Legacy动画系统 在Unity4 0后引入了一套全新的动画系统 即为Mecanim动画系统 Legacy动画系统使用的是Animation组件 直接对动画片段进行操作 而Mecanim动画系统使用的是Animat
  • 常用的DML语句

    DML 数据操纵语言 Data Manipulation Language DML 是用于数据库操作 对数据库其中的对象和数据运行访问工作的编程语句 通常是数据库专用编程语言之中的一个子集 例如在信息软件产业通行标准的SQL语言中 以INS
  • jenkins学习笔记第十二篇 解决邮件报告中错误接口信息

    修改jmeter results detail report 21 xs样式 只展示统计运行的案例数 和出错的接口信息
  • 【教程】 .Net环境和开发工具Visual Studio的安装

    文章目录 前言 1 NET环境的安装 2 Visual Studio工具的安装 总结 前言 NET 是一个免费的跨平台开放源代码开发人员平台 用于生成多种类型的应用程序 NET 基于许多大规模应用在生产中使用的高性能运行时构建而来 Visu
  • springboot连接mysql8.0问题解决

    原配置如下 spring datasource url jdbc mysql 47 112 103 249 3306 management useSSL true allowMultiQueries true
  • idea 案例:学生信息查询系统学生信息查询系统

    实现功能 1 多条件查询 当用户输入的学生姓名不为空时 则只根据学生姓名进行学生信息的查询 当用户输入的学生姓名为空而学生专业不为空时 则只根据学生专业进行学生信息的查询 当用户输入的学生姓名和专业都为空 则要求查询出所有学号不为空的学生信
  • 华硕电脑bios设置虚拟机_【雷电说明书】华硕电脑与华硕笔记本开VT的BIOS设置方法...

    本文主要讲的是华硕电脑与华硕笔记本开VT的BIOS设置方法 按照大体市面上常用的电脑型号分类 大致分为三个步骤 开VT的用处 或者说开VT的好处就是安卓模拟器能够得到更多的资源来运行游戏 为了游戏玩的爽 可以认为安卓模拟器是必须开VT的 这
  • 猿如意中的【Wireshark】网络包分析工具详情介绍

    一 工具名称 Wireshark win64 3 6 5 二 下载安装渠道 Wireshark win64 3 6 5 通过CSDN官方开发的 猿如意 客户端进行下载安装 对 你没有看错 就是来自CSDN官方 这次 CSDN果然没有辜负广大
  • SpringCloud-学习笔记(四)nacos基本使用

    什么是nacos Nacos n k s 是 Dynamic Naming and Configuration Service的首字母简称 一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 使用java语言进行开发 Nacos
  • 通过修改kong属性解决不能获取外网域名的问题

    作者 朱金灿 来源 https blog csdn net clever101 kong就是对nginx进行再一次封装而做成的企业级api网关 kong dashboard是kong进行设置的一个可视化界面 目前公司的服务集群都采用kong
  • 开发中 @/方式引入的文件,通过ctrl + 点击可直接指向

    问题描述 实际开发项目中 例如VUE 或者 React 开发中 我们经常会通过 的方式进行文件引入 但是这种方式会导致不能直接点击进入指定的文件 解决方案 根目录创建jsconfig json文件 文件内容如下 exclude node m
  • Vue实现搜索关键词高亮显示

    最近写移动端项目的时候 遇到搜索关键词高亮的需求 写篇文章纪录一下 先看效果 以上为实现效果展示 整体思路 对后台返回的数据进行操作 我这里是模拟数据 使用正则去匹配搜索关键词后 使用replace进行字符串的替换 渲染数据部分使用v ht
  • CentOS-6.6-x86_64-minimal.iso镜像下载

    CentOS6 6的64位镜像文件iso 迅雷种子 centos是基于linux的内核开发的操作系统 是企业服务器广泛使用的操作系统 链接 https pan baidu com s 1tSpIdAxTnScqXQotVCg2gg http
  • ARM Cortex-A7时钟树综合实战分析

    ARM Cortex A7时钟树综合实战分析 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 吾爱 IC 高端技术交流社区 知识星球目前已经拥有1040 位星球成员 目前数字 IC 领域最大的高端技
  • 判断玩家是否在敌人的可视范围的方法Physics.OverlapSphere

    Physics OverlapSphere Vector 3 position float radius 该方法判断以一个点为中心 半径为radius的球中的碰撞体集合 所以返回值可以用 var 如var colliders Physics
  • spring mvc 控制器返回 HTML 页面

    之前的页面都是 jsp的 后面需要改为html 如下代码 之前的Log 是 jsp 后面改为 html Log html 页面单独运行正常 但是在控制器跳转是出错 如下 RequestMapping value login out publ
  • HCIPR&S222-V2.5一些总结

    1 IP Precedence取值中 代表immediate的是2 2 VRRP中路由器已经为Master设备 不会被更高优先级的Backup设备抢占 如果出现故障的情况会被Backup设备抢占 故障恢复后重新抢占为Master设备 默认为
  • java jmf视频播放器无法播放视频问题

    初学java 谢了一个参照网上代码写了个java jmf视频播放器 运行调试代码没问题 可是被这个avi视频格式纠结的要死 换了n多个avi格式视频依然不行 经过查阅资料发现现在网上流行的avi格式并不是真正的avi格式 大都是其他格式转化