——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); //經過調用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();
}
}