Java Media Framework (JMF) 播放視訊的核心流程:建立 MediaLocator → Manager.createPlayer() → 註冊 ControllerListener → start() 播放 → 狀態達 Realized 時取得視覺/控制元件加入容器 → 停止/釋放/關閉資源。本文詳細說明各步驟並提供可直接執行的 Applet 完整代碼。
MediaLocator mrl = new MediaLocator("file:/path/video.mp4");Player player = Manager.createPlayer(mrl);player.addControllerListener(this); — 監聽 RealizeCompleteEvent 等事件。player.start();player.stop();player.deallocate(); — 釋放解碼器、音訊裝置等稀缺資源,避免衝突。player.close();controllerUpdate() 回調中處理 RealizeCompleteEvent,才能安全取得 getVisualComponent()、getControlPanelComponent() 加入 UI 容器。Unrealized → Realizing → Realized → Prefetching → Prefetched → Started。VisualComponent) 與控制面板 (ControlPanelComponent) 僅在 Realized 狀態後可用。import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Component;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.RealizeCompleteEvent;
public class PlayerApplet extends Applet implements ControllerListener {
private static final long serialVersionUID = 1L;
private Player player = null;
public void init() {
setLayout(new BorderLayout());
// 實際部署時請替換為有效媒體 URL
MediaLocator mrl = new MediaLocator("https://example.com/video.mp4");
try {
player = Manager.createPlayer(mrl);
player.addControllerListener(this);
} catch (Exception e) {
System.err.println("Got exception: " + e);
}
}
public void start() { if (player != null) player.start(); }
public void stop() { if (player != null) { player.stop(); player.deallocate(); } }
public void destroy() { if (player != null) player.close(); }
public synchronized void controllerUpdate(ControllerEvent event) {
if (event instanceof RealizeCompleteEvent) {
Component comp;
if ((comp = player.getVisualComponent()) != null) add("Center", comp);
if ((comp = player.getControlPanelComponent()) != null) add("South", comp);
validate();
}
}
}
file:、http:、rtsp: 等協議,確保格式為 JMF 支援編碼(MPEG-1, H.263, JPEG 等)。policy 檔案。jmf.jar 至擴充目錄或類別路徑。| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| 無畫面、無聲音 | 編碼格式不支援、缺少解碼器外掛 | 安裝 JMF 擴充包、轉碼為 MPEG-1/H.263 |
| RealizeCompleteEvent 未觸發 | 媒體 URL 錯誤、網路不通、格式無法解析 | 檢查 URL、網路、嘗試本地檔案測試 |
| 視覺元件為 null | 純音訊媒體、或 Realized 前嘗試取得 | 確認事件處理順序、僅在 RealizeCompleteEvent 取得 |
JMF 播放視訊核心在於 Player 狀態機管理與 ControllerListener 事件驅動 UI 組裝。掌握 Realized 狀態下取得視覺/控制元件的時機,即可構建穩定的播放器元件。現代專案建議改用 JavaFX MediaPlayer 或 VLCJ 等更活躍的多媒體框架。