1. 程式人生 > >使用JMF實現java寫自己的視訊播放器

使用JMF實現java寫自己的視訊播放器

    JMF這個多媒體開發框架太牛了,簡單的幾句程式碼就能實現一個視訊播放器的開發,厲害,就是支援的格式少了一些,沒關係,這個視訊播放器可以播放mpg,avi,fvl等等,想播放其他的請開發自己的外掛,下面將程式碼貼上去

package com.bird.jmf;

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 JMFSample implements ControllerListener {
    public static void main(String[] args) {
        JMFSample sp = new JMFSample();
        sp.play();
    }
   
    private Player mediaPlayer;
    private Frame f;
    private Player player;
    private Panel panel;
    private Component visual;
    private Component control = null;
   
    public void play(){
        f = new Frame("JMF Sample1");
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                if(player != null) {
                    player.close();
                }
                System.exit(0);
            }
        });
        f.setSize(500,400);

        f.setVisible(true);
        URL url = null;
        try {
            //準備一個要播放的視訊檔案的URL
            url = new URL("file:/d:/2.mpg");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }       
        try {
            //通過呼叫Manager的createPlayer方法來建立一個Player的物件
            //這個物件是媒體播放的核心控制物件
            player = Manager.createPlayer(url);
        } catch (NoPlayerException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } 

        //對player物件註冊監聽器,能噶偶在相關事件發生的時候執行相關的動作
        player.addControllerListener(this);
       
        //讓player物件進行相關的資源分配
        player.realize();
    }
   
    private int videoWidth = 0;
    private int videoHeight = 0;
    private int controlHeight = 30;
    private int insetWidth = 10;
    private int insetHeight = 30;
   
    //監聽player的相關事件
    public void controllerUpdate(ControllerEvent ce) {
        if (ce instanceof RealizeCompleteEvent) {
            //player例項化完成後進行player播放前預處理
            player.prefetch();
        } else if (ce instanceof PrefetchCompleteEvent) {
            if (visual != null)
                return;

            //取得player中的播放視訊的元件,並得到視訊視窗的大小
            //然後把視訊視窗的元件新增到Frame視窗中,
            if ((visual = player.getVisualComponent()) != null) {
                Dimension size = visual.getPreferredSize();
                videoWidth = size.width;
                videoHeight = size.height;
                f.add(visual);
            } else {
                videoWidth = 320;
            }
           
            //取得player中的視訊播放控制條元件,並把該元件新增到Frame視窗中
            if ((control = player.getControlPanelComponent()) != null) {
                controlHeight = control.getPreferredSize().height;
                f.add(control, BorderLayout.SOUTH);
            }
           
            //設定Frame視窗的大小,使得滿足視訊檔案的預設大小
            f.setSize(videoWidth + insetWidth, videoHeight + controlHeight + insetHeight);
            f.validate();
           
            //啟動視訊播放元件開始播放
            player.start();
            mediaPlayer.start();
        } else if (ce instanceof EndOfMediaEvent) {
            //當播放視訊完成後,把時間進度條恢復到開始,並再次重新開始播放
            player.setMediaTime(new Time(0));
            player.start();
        }
    }

}
效果圖如下