如何用JMF編寫視頻播放器3 ——Video視頻播放器文件工程的創建和源代碼

如何用JMF編寫視頻播放器3

——Video視頻播放器文件工程的創建和源代碼 php

在如何用JMF編寫MP3音樂播放器2裏面咱們編寫了一個音樂播放器,既然JMF聲稱是JAVA多媒體的插件,他支持音頻,視頻,圖片等,那咱們就編寫一個視頻播放器試試。 java

 

視頻播放器沒有音樂播放器那麼負責,它能夠自動導入它須要的包import javax.media.Player; 編程

具體問題和疑問見我代碼中的註釋便可。 框架

 

 

 

源代碼: ide

package shexiang; 佈局

 

import java.awt.BorderLayout; 字體

import java.awt.Component; fetch

import java.awt.Dimension; ui

import java.awt.Frame; this

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); //經過調用ManagercreatePlayer方法來建立一個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) {  /*instanceofJavaphp的一個二元操做符(運算符),和==><是同一類東西。因爲它是由字母組成的,因此也是Java的保留關鍵字。

                                                                                                             它的做用是判斷其左邊對象是否爲其右邊類的實例,返回boolean類型的數據。*/

          

            player.setMediaTime(new Time(0));  //當播放視頻完成後,把時間進度條恢復到開始,

            player.start(); //再次從新開始播放

        }

    }

   

   

    public static void main(String[] args) {

        cuiViedo sp = new cuiViedo();

        sp.play();

    }

   

   

   

   

   

   

 

}

 

相關文章
相關標籤/搜索