本帖最后由 qinghuait519 于 2011-04-27 11:36:35 编辑

解决方案 »

  1.   

    灭有 人完 JMF 吗?
      

  2.   

    楼主把整个代码贴一下吧,我想API调用没问题,关键是调用的前后时机有问题
      

  3.   


    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); // 显示提示信息 
    }
    }
      

  4.   

    我试了一下楼主的代码,没啥问题,我想无法播放avi文件主要的原因在于JMF无法解析播放你程序里面访问的avi文件,我自己下载了两三个avi格式文件,都无法正常解析,而另外一个mpg格式的文件则能够解析,也能够获取到可视化的组件。
    楼主可以换个mpg格式的文件试试
      

  5.   

    你好 最近我也在看jmf的东西 但是网上一直没有最新的api文档,不知道你那里有2.1的jmf api文档么 如果有的话 能否将其发至我邮箱呢 麻烦了  [email protected]