java jmf視頻播放器無法播放視頻問題

初學java,謝了一個參照網上代碼寫了個java jmf視頻播放器,運行調試代碼沒問題,可是被這個avi視頻格式糾結的要死,換了n多個avi格式視頻依然不行,經過查閱資料發現現在網上流行的avi格式並不是真正的avi格式,大都是其他格式轉化來的,所以jmf無法識別,必須使用真正的avi格式。在這裏附上源碼,測試通過的avi視頻。




import java.awt.BorderLayout;
import java.awt.Component; 
import java.awt.FileDialog; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.media.ControllerClosedEvent; 
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; 
import javax.swing.JCheckBoxMenuItem; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 


public class JMFMediaPlayer extends JFrame implements ActionListener, 
ControllerListener, ItemListener { 
// JMF的播放器 
Player player; 
// 播放器的視頻組件和控制組件 
Component vedioComponent; 
Component controlComponent; 
// 標示是否是第一次打開播放器 
boolean first = true; 
// 標示是否需要循環 
boolean loop = false; 
// 文件當前目錄 
String currentDirectory; 
// 構造方法 
public JMFMediaPlayer(String title) { 
super(title); 
addWindowListener(new WindowAdapter() { 
public void windowClosing(WindowEvent e){ 
// 用戶點擊窗口系統菜單的關閉按鈕 
// 調用dispose以執行windowClosed 
dispose(); 

public void windowClosed(WindowEvent e){ 
if (player != null){ 
// 關閉JMF播放器對象 
player.close(); 

System.exit(0); 

}); 
// 創建播放器的菜單 
JMenu fileMenu = new JMenu("文件"); 
JMenuItem openMemuItem = new JMenuItem("打開"); 
openMemuItem.addActionListener(this); 
fileMenu.add(openMemuItem); 
// 添加一個分割條 
fileMenu.addSeparator(); 
// 創建一個複選框菜單項 
JCheckBoxMenuItem loopMenuItem = new JCheckBoxMenuItem("循環", false); 
loopMenuItem.addItemListener(this); 
fileMenu.add(loopMenuItem); 
fileMenu.addSeparator(); 
JMenuItem exitMemuItem = new JMenuItem("退出"); 
exitMemuItem.addActionListener(this); 
fileMenu.add(exitMemuItem); 


JMenuBar menuBar = new JMenuBar(); 
menuBar.add(fileMenu); 
this.setJMenuBar(menuBar); 
this.setSize(200, 200); 


try { 
// 設置界面的外觀,爲系統外觀 
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
SwingUtilities.updateComponentTreeUI(this); 
} catch (Exception e) { 
e.printStackTrace(); 

this.setVisible(true); 

/** 
* 實現了ActionListener接口,處理組件的活動事件 
*/ 
public void actionPerformed(ActionEvent e) { 
if (e.getActionCommand().equals("退出")) { 
// 調用dispose以便執行windowClosed 
dispose(); 
return; 

FileDialog fileDialog = new FileDialog(this, "打開媒體文件", FileDialog.LOAD); 
fileDialog.setDirectory(currentDirectory); 
fileDialog.setVisible(true); 
// 如果用戶放棄選擇文件,則返回 
if (fileDialog.getFile() == null){ 
return; 

currentDirectory = fileDialog.getDirectory(); 
if (player != null){ 
// 關閉已經存在JMF播放器對象 
player.close(); 

try { 
// 創建一個打開選擇文件的播放器 
player = Manager.createPlayer(new MediaLocator("file:" 
+ fileDialog.getDirectory() + fileDialog.getFile())); 
} catch (java.io.IOException e2) { 
System.out.println(e2); 
return; 
} catch (NoPlayerException e2) { 
System.out.println("不能找到播放器."); 
return; 

if (player == null) { 
System.out.println("無法創建播放器."); 
return; 

first = false; 
this.setTitle(fileDialog.getFile()); 
// 播放器的控制事件處理 
player.addControllerListener(this); 
// 預讀文件內容 
player.prefetch(); 

/** 
* 實現ControllerListener接口的方法,處理播放器的控制事件 
*/ 
public void controllerUpdate(ControllerEvent e) { 
// 調用player.close()時ControllerClosedEvent事件出現。 
// 如果存在視覺部件,則該部件應該拆除(爲一致起見, 
// 我們對控制面板部件也執行同樣的操作) 
if (e instanceof ControllerClosedEvent) { 
if (vedioComponent != null) { 
this.getContentPane().remove(vedioComponent); 
this.vedioComponent = null; 

if (controlComponent != null) { 
this.getContentPane().remove(controlComponent); 
this.controlComponent = null; 

return; 

// 如果是媒體文件到達尾部事件 
if (e instanceof EndOfMediaEvent) { 
if (loop) { 
// 如果允許循環,則重新開始播放 
player.setMediaTime(new Time(0)); 
player.start(); 

return; 

// 如果是播放器預讀事件 
if (e instanceof PrefetchCompleteEvent) { 
// 啓動播放器 
player.start(); 
return; 

// 如果是文件打開完全事件,則顯示視頻組件和控制器組件 
if (e instanceof RealizeCompleteEvent) { 
vedioComponent = player.getVisualComponent(); 
if (vedioComponent != null){ 
this.getContentPane().add(vedioComponent); 

controlComponent = player.getControlPanelComponent(); 
if (controlComponent != null){ 
this.getContentPane().add(controlComponent, BorderLayout.SOUTH); 

this.pack(); 




// 處理“循環”複選框菜單項的點擊事件 
public void itemStateChanged(ItemEvent e) { 
loop = !loop; 

public static void main(String[] args){ 
new JMFMediaPlayer("JMF媒體播放器"); 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章