提到Java Media Framework (JMF),許多開發者的第一反應是「功能有限、格式支援少」,畢竟作為客戶端播放器,它遠不如Windows Media Player或QuickTime來得強大。但若從內容提供者的角度切入,JMF卻藏著一項殺手級特性:唯有J2SE執行環境即可部署多媒體內容,無需客戶端額外安裝解碼器。
利用JAR檔案格式的特性,我們可以將自訂解碼器、播放邏輯與媒體檔案打包成單一可執行JAR,用戶雙擊即播,宛如WinZip的自解壓縮檔。實作分三階段:
jmfcustomizer裁剪出輕量級播放引擎JARJMF的Manager類依賴URL協議與副檔名尋找Player,原生不支援jar:file:...協議。解決之道在於實作PullDataSource介面,讓Manager能識別JAR內部媒體流。核心在於getContentType()根據副檔名回傳MIME類型(如.mov對應video.quicktime),以及實作Seekable介面支援隨機存取——必要時重新開啟流定位。
public long seek(long position) {
try {
if (position > tellPoint) {
thoroughSkip(position - tellPoint);
} else {
close(); open();
thoroughSkip(position);
}
return tellPoint;
} catch (IOException ioe) { return 0; }
}
透過jmfcustomizer僅保留「媒體檔案→播放」、「file協議」、「QuickTime/AVI格式」、「H.263/IMA4解碼器」、「JavaSound/AWT渲染器」,將原始1.9MB的JMF壓縮至700KB。隨後加入自訂播放類別、授權文件,並撰寫Manifest指定Main-Class與Class-Path: .,形成spmovie-engine.jar。
受限於JMF解碼器,視訊建議採H.263,音訊用IMA 4:1。將媒體置於JAR內movie/themovie.mov路徑,以jar u0f指令(0表不壓縮)加入媒體,完成spmovie.jar。這不只是播放器,更是「一次編寫、到處播放」的Java精神具體實踐。