jmf 为什么getVisualComponent会得不到可视组件 本帖最后由 qinghuait519 于 2011-04-27 11:36:35 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 灭有 人完 JMF 吗? 楼主把整个代码贴一下吧,我想API调用没问题,关键是调用的前后时机有问题 package src;import java.awt.BorderLayout;import java.awt.Component;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.io.File;import java.net.MalformedURLException;import java.net.URL; import javax.media.ControllerAdapter;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.JEditorPane;import javax.swing.JDialog;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.JTabbedPane; import javax.swing.SwingUtilities;import javax.swing.event.HyperlinkEvent;import javax.swing.event.HyperlinkListener; import util.ResUrlFactory; /** * 这是多功能视频播放器入口 */public class VideoPlayerFrame extends javax.swing.JFrame { static{ JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); } /** * */ private static final long serialVersionUID = 1L; private JSplitPane jSplitPane1; private JPanel jPanel1; private JPanel jPanel4; private JEditorPane jEditorPane2; private JEditorPane jEditorPane1; private JEditorPane jEditorPane3; private JScrollPane jScrollPane4; private JScrollPane jScrollPane1; private JTabbedPane jTabbedPane2; private JPanel jPanel3; private JScrollPane jScrollPane3; private JScrollPane jScrollPane2; private JTabbedPane jTabbedPane1; private Player player; // 播放器对象 private Component visualMedia; // 视频显示组件 private Component mediaControl; // 视频播放控制组件 /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { VideoPlayerFrame inst = new VideoPlayerFrame(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public VideoPlayerFrame() { super(); initGUI(); } private void initGUI() { try { setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); setTitle("GuoGuo Video Live"); { jSplitPane1 = new JSplitPane(); jSplitPane1.resetToPreferredSizes(); getContentPane().add(jSplitPane1, BorderLayout.CENTER); jSplitPane1.setResizeWeight(1.0); jSplitPane1.setOneTouchExpandable(true); jSplitPane1.setDividerSize(10); { jTabbedPane1 = new JTabbedPane(); jSplitPane1.add(jTabbedPane1, JSplitPane.LEFT); jTabbedPane1.setPreferredSize(new java.awt.Dimension(700, 564)); jTabbedPane1.setMinimumSize(new java.awt.Dimension(700, 5)); //点击加载本地视频 // jTabbedPane1.addMouseListener(new MouseAdapter(){// @Override// public void mouseClicked(MouseEvent e) {// if(jTabbedPane1.getSelectedComponent().equals( jScrollPane3))// {// JFileChooser chooser=new JFileChooser();// int a= chooser.showOpenDialog(VideoPlayerFrame.this);// if(a==JFileChooser.APPROVE_OPTION)// {// //showMessage(chooser.getSelectedFile().getName());// jTabbedPane1.setSelectedComponent(jPanel1);// try {// startPlayer(chooser.getSelectedFile().toURL().toString());// } catch (MalformedURLException e1) {// // TODO Auto-generated catch block// e1.printStackTrace();// }// // }// }// }// // }); { jScrollPane2 = new JScrollPane(); jTabbedPane1.addTab(" 在线视频库 ", null, jScrollPane2, null); { jPanel3 = new JPanel(); BorderLayout jPanel3Layout = new BorderLayout(); jPanel3.setLayout(jPanel3Layout); jScrollPane2.setViewportView(jPanel3); { jEditorPane2 = new JEditorPane(); jPanel3.add(jEditorPane2, BorderLayout.CENTER); jEditorPane2.setText("jEditorPane2"); jEditorPane2.setEditable(false); //默认加载视频库主页 String index_url=ResUrlFactory.getIndexURL(); jEditorPane2.setContentType("text/html"); jEditorPane2.setPage( new URL ( index_url)); // 注册链接监听 jEditorPane2.addHyperlinkListener(new HyperlinkListener(){ //当链接的状态改变时触发事件 public void hyperlinkUpdate(HyperlinkEvent e) { //监视链接的激活 if( e.getEventType()== HyperlinkEvent.EventType.ACTIVATED ) { URL url= e.getURL() ; System.out.println("url:"+url.toString()); if( url!=null &&url.getFile().endsWith(".avi")) { jTabbedPane1.setSelectedComponent(jPanel1); //播放选择媒体 startPlayer(url.toString() ); } } } } ); } } jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); } { jScrollPane3 = new JScrollPane(); jTabbedPane1.addTab(" 本地视频 ", null, jScrollPane3, null); jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); { jPanel4 = new JPanel(); jScrollPane3.setViewportView(jPanel4); } } { // ??????????????????????????????????????????? jPanel1 = new JPanel(); BorderLayout jPanel1Layout = new BorderLayout(); jPanel1.setLayout(jPanel1Layout); jTabbedPane1.addTab(" 播放器 ", null, jPanel1, null); // jPanel1.setBackground(new java.awt.Color(0,0,0)); } } { jTabbedPane2 = new JTabbedPane(); jSplitPane1.add(jTabbedPane2, JSplitPane.RIGHT); jTabbedPane2.setMinimumSize(new java.awt.Dimension(230, 5)); jTabbedPane2.setPreferredSize(new java.awt.Dimension(200, 5)); { jScrollPane1 = new JScrollPane(); jTabbedPane2.addTab("播放列表", null, jScrollPane1, null); jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); { jEditorPane1 = new JEditorPane(); jScrollPane1.setViewportView(jEditorPane1); jEditorPane1.setText("jEditorPane3"); jEditorPane1.setEditable(false); } } { jScrollPane4 = new JScrollPane(); jTabbedPane2.addTab("历史记录", null, jScrollPane4, null); jScrollPane4.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); { jEditorPane3 = new JEditorPane(); jScrollPane4.setViewportView(jEditorPane3); jEditorPane3.setText("jEditorPane1"); jEditorPane3.setEditable(false); } } } } Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, Boolean.TRUE); pack(); this.setSize(950, 650); } catch (Exception e) { e.printStackTrace(); System.out.println("=================="); } } //清除界面 public void clearMedia( ) { if (player != null){ // 如果播放器非空则移去先前的播放器组件 if (visualMedia != null) jPanel1.remove(visualMedia); // 如果对象visualMedia非空则移去 if (mediaControl != null) jPanel1.remove(mediaControl); // 如果对象mediaControl非空则移去 player.close(); // 关闭播放器 } }// 初始化播放器 public void startPlayer(String mediaLocation) { clearMedia( ); MediaLocator mediaLocator = new MediaLocator(mediaLocation); // 媒体定位器 if (mediaLocator == null) { showMessage("获得媒体定位器失败"); // 显示错误信息 return; } try { player = Manager.createRealizedPlayer(mediaLocator); // 得到播放器实例 player.addControllerListener(new PlayerEventHandler()); // 增加播放控制器 player.realize(); } catch (Exception ex) { ex.printStackTrace(); showMessage("打开的文件格式错误,播放失败"); // 显示错误信息 } } // 播放器事件处理 private class PlayerEventHandler extends ControllerAdapter { public void realizeComplete(RealizeCompleteEvent realizeDoneEvent) { player.prefetch(); // 预取媒体数据 } // 完成预取媒体数据后,开始播放媒体 public void prefetchComplete(PrefetchCompleteEvent prefetchDoneEvent) { getMediaComponents(); validate(); player.start(); // 开始播放媒体 } // 如果媒体播放完毕,重新设置媒体时间并停止媒体播放器 public void endOfMedia(EndOfMediaEvent mediaEndEvent) { player.setMediaTime(new Time(0)); // 重新设置媒体时间 player.stop(); // 停止媒体播放 } }// 取得媒体组件 public void getMediaComponents() { visualMedia = player.getVisualComponent(); // 取得视频显示组件 // ?????????就是这里总是取不到 // 如果对象visualMedia非空则加入到窗口内容窗格 if (visualMedia != null) { jPanel1.add(visualMedia, BorderLayout.CENTER); //pack(); }else { System.out.println("visualMedia is null"); } mediaControl = player.getControlPanelComponent(); // 取得播放控制组件 // 如果对象visualMedia非空则加入到窗口内容窗格 if (mediaControl != null) jPanel1.add(mediaControl, BorderLayout.SOUTH); else System.out.println("mediaControl is null"); } public void showMessage(String s) { JOptionPane.showMessageDialog(this, s); // 显示提示信息 }} 我试了一下楼主的代码,没啥问题,我想无法播放avi文件主要的原因在于JMF无法解析播放你程序里面访问的avi文件,我自己下载了两三个avi格式文件,都无法正常解析,而另外一个mpg格式的文件则能够解析,也能够获取到可视化的组件。楼主可以换个mpg格式的文件试试 你好 最近我也在看jmf的东西 但是网上一直没有最新的api文档,不知道你那里有2.1的jmf api文档么 如果有的话 能否将其发至我邮箱呢 麻烦了 [email protected] 关于 start() 和 润() 子类转换父类的问题 自动提示功能 实现 请教一个classload 的问题。。 看过《 thinking in java》的进来一下 这本书得到如此广泛的好评 你觉得好在哪里? 简单问题,为什么会出错? java配置ODBC 麻烦哪位兄弟帮我一下 请教ArrayList和Vertor在使用上的区别! JAVA求字符串的子串,谢谢! 为什么java -version可用 而javac还是提示是外部命令呢? 请教一个jar的问题!!!!!!!!!!!!!!!
package src;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import javax.media.ControllerAdapter;
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.JEditorPane;import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import util.ResUrlFactory;
/**
* 这是多功能视频播放器入口
*/
public class VideoPlayerFrame extends javax.swing.JFrame {
static{
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
}
/**
*
*/
private static final long serialVersionUID = 1L;
private JSplitPane jSplitPane1;
private JPanel jPanel1;
private JPanel jPanel4;
private JEditorPane jEditorPane2;
private JEditorPane jEditorPane1;
private JEditorPane jEditorPane3;
private JScrollPane jScrollPane4;
private JScrollPane jScrollPane1;
private JTabbedPane jTabbedPane2;
private JPanel jPanel3;
private JScrollPane jScrollPane3;
private JScrollPane jScrollPane2;
private JTabbedPane jTabbedPane1;
private Player player; // 播放器对象
private Component visualMedia; // 视频显示组件
private Component mediaControl; // 视频播放控制组件
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
VideoPlayerFrame inst = new VideoPlayerFrame();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public VideoPlayerFrame() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);
setTitle("GuoGuo Video Live");
{
jSplitPane1 = new JSplitPane();
jSplitPane1.resetToPreferredSizes();
getContentPane().add(jSplitPane1, BorderLayout.CENTER);
jSplitPane1.setResizeWeight(1.0);
jSplitPane1.setOneTouchExpandable(true);
jSplitPane1.setDividerSize(10);
{
jTabbedPane1 = new JTabbedPane();
jSplitPane1.add(jTabbedPane1, JSplitPane.LEFT);
jTabbedPane1.setPreferredSize(new java.awt.Dimension(700, 564));
jTabbedPane1.setMinimumSize(new java.awt.Dimension(700, 5)); //点击加载本地视频
// jTabbedPane1.addMouseListener(new MouseAdapter(){
// @Override
// public void mouseClicked(MouseEvent e) {
// if(jTabbedPane1.getSelectedComponent().equals( jScrollPane3))
// {
// JFileChooser chooser=new JFileChooser();
// int a= chooser.showOpenDialog(VideoPlayerFrame.this);
// if(a==JFileChooser.APPROVE_OPTION)
// {
// //showMessage(chooser.getSelectedFile().getName());
// jTabbedPane1.setSelectedComponent(jPanel1);
// try {
// startPlayer(chooser.getSelectedFile().toURL().toString());
// } catch (MalformedURLException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
//
// }
// }
// }
//
// });
{
jScrollPane2 = new JScrollPane();
jTabbedPane1.addTab(" 在线视频库 ", null, jScrollPane2, null);
{
jPanel3 = new JPanel();
BorderLayout jPanel3Layout = new BorderLayout();
jPanel3.setLayout(jPanel3Layout);
jScrollPane2.setViewportView(jPanel3);
{
jEditorPane2 = new JEditorPane();
jPanel3.add(jEditorPane2, BorderLayout.CENTER);
jEditorPane2.setText("jEditorPane2");
jEditorPane2.setEditable(false);
//默认加载视频库主页
String index_url=ResUrlFactory.getIndexURL();
jEditorPane2.setContentType("text/html");
jEditorPane2.setPage( new URL ( index_url));
// 注册链接监听
jEditorPane2.addHyperlinkListener(new HyperlinkListener(){
//当链接的状态改变时触发事件
public void hyperlinkUpdate(HyperlinkEvent e) {
//监视链接的激活
if( e.getEventType()== HyperlinkEvent.EventType.ACTIVATED )
{
URL url= e.getURL() ;
System.out.println("url:"+url.toString());
if( url!=null &&url.getFile().endsWith(".avi"))
{
jTabbedPane1.setSelectedComponent(jPanel1);
//播放选择媒体
startPlayer(url.toString() );
}
}
}
} );
}
}
jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
}
{
jScrollPane3 = new JScrollPane();
jTabbedPane1.addTab(" 本地视频 ", null, jScrollPane3, null);
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
{
jPanel4 = new JPanel();
jScrollPane3.setViewportView(jPanel4);
} }
{
// ???????????????????????????????????????????
jPanel1 = new JPanel();
BorderLayout jPanel1Layout = new BorderLayout();
jPanel1.setLayout(jPanel1Layout);
jTabbedPane1.addTab(" 播放器 ", null, jPanel1, null);
// jPanel1.setBackground(new java.awt.Color(0,0,0)); }
}
{
jTabbedPane2 = new JTabbedPane();
jSplitPane1.add(jTabbedPane2, JSplitPane.RIGHT);
jTabbedPane2.setMinimumSize(new java.awt.Dimension(230, 5));
jTabbedPane2.setPreferredSize(new java.awt.Dimension(200, 5));
{
jScrollPane1 = new JScrollPane();
jTabbedPane2.addTab("播放列表", null, jScrollPane1, null);
jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
{
jEditorPane1 = new JEditorPane();
jScrollPane1.setViewportView(jEditorPane1);
jEditorPane1.setText("jEditorPane3");
jEditorPane1.setEditable(false);
}
}
{
jScrollPane4 = new JScrollPane();
jTabbedPane2.addTab("历史记录", null, jScrollPane4, null);
jScrollPane4.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
{
jEditorPane3 = new JEditorPane();
jScrollPane4.setViewportView(jEditorPane3);
jEditorPane3.setText("jEditorPane1");
jEditorPane3.setEditable(false);
}
}
}
}
Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, Boolean.TRUE);
pack();
this.setSize(950, 650);
} catch (Exception e) {
e.printStackTrace();
System.out.println("==================");
}
} //清除界面
public void clearMedia( )
{
if (player != null){
// 如果播放器非空则移去先前的播放器组件
if (visualMedia != null)
jPanel1.remove(visualMedia); // 如果对象visualMedia非空则移去
if (mediaControl != null)
jPanel1.remove(mediaControl); // 如果对象mediaControl非空则移去
player.close(); // 关闭播放器
}
}
// 初始化播放器
public void startPlayer(String mediaLocation) {
clearMedia( );
MediaLocator mediaLocator = new MediaLocator(mediaLocation); // 媒体定位器
if (mediaLocator == null) {
showMessage("获得媒体定位器失败"); // 显示错误信息
return;
}
try {
player = Manager.createRealizedPlayer(mediaLocator); // 得到播放器实例
player.addControllerListener(new PlayerEventHandler()); // 增加播放控制器
player.realize();
} catch (Exception ex) {
ex.printStackTrace();
showMessage("打开的文件格式错误,播放失败"); // 显示错误信息
} }
// 播放器事件处理
private class PlayerEventHandler extends ControllerAdapter { public void realizeComplete(RealizeCompleteEvent realizeDoneEvent) {
player.prefetch(); // 预取媒体数据
} // 完成预取媒体数据后,开始播放媒体
public void prefetchComplete(PrefetchCompleteEvent prefetchDoneEvent) {
getMediaComponents();
validate();
player.start(); // 开始播放媒体
} // 如果媒体播放完毕,重新设置媒体时间并停止媒体播放器
public void endOfMedia(EndOfMediaEvent mediaEndEvent) {
player.setMediaTime(new Time(0)); // 重新设置媒体时间
player.stop(); // 停止媒体播放
}
}// 取得媒体组件
public void getMediaComponents() {
visualMedia = player.getVisualComponent();
// 取得视频显示组件
// ?????????就是这里总是取不到
// 如果对象visualMedia非空则加入到窗口内容窗格
if (visualMedia != null) {
jPanel1.add(visualMedia, BorderLayout.CENTER);
//pack();
}else {
System.out.println("visualMedia is null");
} mediaControl = player.getControlPanelComponent(); // 取得播放控制组件
// 如果对象visualMedia非空则加入到窗口内容窗格
if (mediaControl != null)
jPanel1.add(mediaControl, BorderLayout.SOUTH);
else
System.out.println("mediaControl is null");
}
public void showMessage(String s) {
JOptionPane.showMessageDialog(this, s); // 显示提示信息
}
}
楼主可以换个mpg格式的文件试试