首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 多媒體播放聲音完整流程:MMAPI 從資源載入到播放控制

     編輯:J2ME

J2ME 播放聲音需使用 Mobile Media API (MMAPI),屬 MIDP 1.0 選擇性套件,MIDP 2.0 已內建。常見支援格式:WAV、MID、MP3(視裝置而定)。本文詳述從 JAR 資源載入到播放的標準流程與完整範例。

三步驟播放流程

1. 以 InputStream 讀取 JAR 內聲音資源


InputStream is = getClass().getResourceAsStream("/Autorun.wav");
// 位於 JAR 根目錄;若在子目錄如 /res/Autorun.wav 則加上路徑

2. 建立 Player 並指定 MIME 型別


Player player = Manager.createPlayer(is, "audio/x-wav");
// 參數一:輸入串流;參數二:內容型別(MIME)
// 常見型別:audio/x-wav, audio/midi, audio/mpeg, tone/sequence

3. 啟動播放


player.start();
// 可設定循環次數:player.setLoopCount(3); // 播放 3 次
// player.setLoopCount(-1); // 無限循環

完整 MIDlet 範例


package sound;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import java.io.*;

public class SoundMIDlet extends MIDlet {
    private Player player = null;

    public SoundMIDlet() {
        try {
            InputStream is = getClass().getResourceAsStream("/Autorun.wav");
            player = Manager.createPlayer(is, "audio/x-wav");
            player.realize();  // 預載資源,減少 start() 延遲(建議)
            player.prefetch(); // 進一步預取
        } catch (IOException e) {
            System.out.println("IO錯誤: " + e);
        } catch (MediaException e) {
            System.out.println("媒體錯誤: " + e);
        } catch (Exception e) {
            System.out.println("其他錯誤: " + e);
        }
    }

    public void startApp() {
        if (player != null) {
            try {
                player.start();
            } catch (MediaException e) {
                System.out.println("播放失敗: " + e);
            }
        }
    }

    public void pauseApp() {
        if (player != null) player.stop();  // 暫停時停止播放
    }

    public void destroyApp(boolean unconditional) {
        if (player != null) {
            player.close();  // 釋放資源
            player = null;
        }
    }
}

Player 生命週期狀態

狀態方法說明
UNREALIZED-初始狀態,未載入資源
REALIZEDrealize()資源定位完成,可取得控制項
PREFETCHEDprefetch()資料緩衝完成,可立即播放
STARTEDstart()正在播放
CLOSEDclose()資源釋放,不可再用

建議呼叫順序:realize() → prefetch() → start(),可大幅減少首次播放延遲。

進階控制

  • 音量控制:VolumeControl vc = (VolumeControl) player.getControl("VolumeControl"); vc.setLevel(50); (0-100)
  • 播放進度:TimeBase tb = player.getTimeBase(); long now = player.getMediaTime();
  • 音頻錄製:Manager.createPlayer("capture://audio?encoding=pcm")(需裝置支援)
  • MIDI 控制:ToneControl 程式化合成音樂、MidiControl 操作音軌

常見坑點

  1. 資源路徑:getResourceAsStream 路徑必須以 / 開頭,且區分大小寫
  2. MIME 型別錯誤:會拋出 MediaException,請確認裝置支援的格式
  3. 未釋放 Player:destroyApp 必須呼叫 player.close(),否則記憶體洩漏
  4. 模擬器 vs 真機:模擬器支援格式通常較多,真機測試不可省略

測試環境

代碼在 Nokia S60 模擬器驗證通過。實際專案建議將聲音檔置於 /res/audio/ 目錄,建立 SoundManager 統一管理載入/播放/釋放,避免重複建立 Player。

掌握 MMAPI 基礎流程,即可為 J2ME 應用加入豐富聽覺回饋,提升用戶體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved