如何用JMF编写视频播放器3

——Video视频播放器文件工程的建立和源代码

在如何用JMF编写MP3音乐播放器2里面我们编写了一个音乐播放器,既然JMF声称是JAVA多媒体的插件,他支持音频,视频,图片等,那我们就编写一个视频播放器试试。

 

视频播放器没有音乐播放器那么负责,它可以自动导入它需要的包import javax.media.Player;

具体问题和疑问见我代码中的注释即可。

 

 

 

源代码:

package shexiang; 
   
 import java.awt.BorderLayout; 
 import java.awt.Component; 
 import java.awt.Dimension; 
 import java.awt.Frame; 
 import java.awt.Panel; 
 import java.awt.event.WindowAdapter; 
 import java.awt.event.WindowEvent; 
 import java.io.IOException; 
 import java.net.MalformedURLException; 
 import java.net.URL; 
   
 import javax.media.CannotRealizeException; 
 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; 
   
 @SuppressWarnings({ "restriction", "unused" }) 
 public class cuiViedo implements ControllerListener {   //ControllerListener状态控制接口 
    
     /**  Component代表Swing对应用程序提供了如下几类编程接口: 
      * 用户界面的组件树的创建和修改的方法。这包括组件的添加和删除等操作。 
      * 组件属性访问的方法,比如组件位置、组件前后背景色、组件字体等等。 
      * 组件状态及生命周期的管理的方法,比如隐藏和显示、创建和销毁等等。 
      * 组件位置、大小的管理,包括通过布局管理器的方法。 
      * 组件事件处理接口的管理,包括添加、删除等操作。*/ 
     
     
     private Frame frameVedio;   //建立一个顶层容器 
     private Player player;      // 
     private Panel panel;        //建立一个面板 
     private Component visual;        //视频接口  
     private Component control = null;   //定义一个控制接口,用于接受视频的时间轴控制器和音量控制等等 
     private int insetWidth = 600;   //设置播放器视频画面中间面板的大小,它会强制将视频的原大小修改为你定义的大小 
     private int insetHeight =400;   
     
     public void play(){ 
         frameVedio = new Frame("我的视频播放器"); 
         frameVedio.addWindowListener(new WindowAdapter() { 
             public void windowClosing(WindowEvent we) { 
                 if(player != null) { 
                     player.close(); 
                 } 
                 System.exit(0); 
             } 
         }); 
         frameVedio.setBounds(400, 100, 800, 600);   //定义播放器容器的位置和大小 
   
         frameVedio.setVisible(true); 
         
         
         URL url = null;    //要播放的视频文件的URL 
         try {            
             url = new URL("file:/d:/北京东路的日子.mpg"); 
         } catch (MalformedURLException e) { 
             e.printStackTrace(); 
         }        
         try { 
             player = Manager.createPlayer(url); //通过调用Manager的createPlayer方法来创建一个Player的对象  
                                                //这个对象是媒体播放的核心控制对象  
         } catch (NoPlayerException e1) { 
             e1.printStackTrace(); 
         } catch (IOException e1) { 
             e1.printStackTrace(); 
         }  
   
         
         player.addControllerListener(this); //对player对象注册监听器,能够在相关事件发生的时候执行响应的动作  
                                             //如果不进行监听,那么它就无法获取你是否有视频的输入 
         player.realize();  //对播放前进行预处理状态,就是缓冲资源  ,让player对象进行相关的资源分配  
     } 
     
     
     public void controllerUpdate(ControllerEvent ce) { //监听player的相关事件  
         if (ce instanceof RealizeCompleteEvent) { 
             
             player.prefetch(); //player实例化完成后进行player播放前预处理  
         } else if (ce instanceof PrefetchCompleteEvent) {   //PrefetchCompleteEvent对视频进行判断是否已经预处理完毕 
             if (visual != null)    //视频接口可以获取视频 
                 return; 
            
             if ((visual = player.getVisualComponent()) != null) {  //取得player中的播放视频的组件 
                 Dimension size = visual.getPreferredSize();  //获取视频组件的大小尺寸 
                 /*getPreferedSize方法是获取组的首选大小,因为布局管理器会根据组件自动调整框架窗口的大小, 
                  * 可以通过这个方法来获取自动调整后的组件大小,没有自动调用只是能获取大小而已*/ 
              
                 frameVedio.add(visual); //将视频接口添加至顶层容器中 
             } 
             
            
             if ((control = player.getControlPanelComponent()) != null) {  //取得player中的视频播放控制条组件 
                                                                              //并把该组件添加到控制接口中 
                    
               
                 frameVedio.add(control, BorderLayout.SOUTH);   //将控制接口添加到Frame窗口中  
             } 
             
            
             frameVedio.setSize( insetWidth,  insetHeight);  //设定Frame窗口的大小,让他满足我们设置的视频大小  
             frameVedio.validate(); //frame.validate()是验证frame中的所有组件,并不会调整frame的大小. 
                                     //Frame.pack()这个方法的作用就是根据窗口里面的布局及组件的preferedSize来确定frame的最佳大小。 
             
             //启动视频播放组件开始播放  
             player.start(); 
             //mediaPlayer.start(); 
         } else if (ce instanceof EndOfMediaEvent) {  /*instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。 
                                                                                                              它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。*/ 
            
             player.setMediaTime(new Time(0));  //当播放视频完成后,把时间进度条恢复到开始, 
             player.start(); //再次重新开始播放  
         } 
     } 
     
     
     public static void main(String[] args) { 
         cuiViedo sp = new cuiViedo(); 
         sp.play(); 
     } 
     
     
     
     
     
     
   
 }

 

java_ffmpeg视频播放器 java编写视频播放器_java_ffmpeg视频播放器