J2me通過Mobile Media API 支援手機音頻,這是在特定類型的裝置上支援不同程度的多媒體的類和介面的一個集合。更具體地說,Mobile Media API劃分為兩個不同的API集合:
一個是Mobile Media API,主要針對進階聲音和多媒體能力;另一個是MIDP2.0 Media API,主要針對支援唯一音訊受限制的裝置。很明顯,我們主要是討論後一部分。
MIDP2.0 Media API 圍繞著2個主要的部分進行設計:管理器,播放器,和控制器。MIDP2.0 Media API都位於javax.microedition.media 和javax.microedition.media.control包中。其中管理器Manager位於media包中,它通過為各種媒體類型建立播放器,從而使我們能夠查詢一個手機的媒體能力。播放器Player介面位於同一個包中,提供了一組通用的方法來控制音訊回放。控制器Control介面位於media.control包中,用來進行特定類型的媒體控制,例如,VolumeControl用來控制音量,ToneControl用來控制樂音。
如果要想知道我們的手機對語音支援的能力,我們可以使用下面的代碼(只提供Canvas類):
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
public class SCCanvas extends Canvas {
private Display display;
public SCCanvas(Display d) {
super();
display = d;
}
void start() {
display.setCurrent(this);
repaint();
}
public void paint(Graphics g) {
// 清除畫布
g.setColor(0, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 255, 255);
// 得到手機支援的聲音的類型
String[] contentTypes = Manager.getSupportedContentTypes(null);
// 顯示所支援的聲音的類型
int y = 0;
for (int i = 0; i < contentTypes.length; i++) {
// 顯示類型
g.drawString(contentTypes[i], 0, y, Graphics.TOP | Graphics.LEFT);
y += Font.getDefaultFont().getHeight();
// 如果支援樂音產生器,播放樂音
if (contentTypes[i] == "audio/x-tone-seq") {
try {
Manager.playTone(ToneControl.C4, 2000, 100);
}
catch(MediaException me) {
}
}
}
}
}
下面是MIDP2.0手機所支援的常見的音頻MIME類型:
audio/x-tone-seq 表示樂音和樂音序列;audio/x-wav表示聲波聲音;audio/midi表示midi音樂;audio/mpeg表示MP3音頻。
使用MIDP2.0 Media API的步驟:
(1) 使用Manager類獲得一個針對特定媒體類型的播放器。
(2) 使用Player介面在特定的播放器上播放媒體。
(3) 如果需要的話,使用Control介面來改變媒體的回放。
下面是一個播放樂音的例子:
byte tempo=50; // 設定聲音播放速度
byte d=8; // 音調值
byte C4=ToneControl.C4; //基準音調
byte D4=(byte)(C4+2); //音調值
byte E4=(byte)(C4+4);
byte G4=(byte)(C4+7);
byte rest=ToneControl.SILENCE; //無聲
byte[] mySequence=
{
ToneControl.VERSION,1, //設定版本號碼,當前必須設為1
ToneControl.TEMPO,tempo, //設定聲音播放速度,值越大,播放越快
ToneControl.SET_VOLUME,100, //設定音量,值越大,音量越大
ToneControl.BLOCK_START,0, //預定義播放塊,當前塊號為0
E4,d,D4,d,C4,d,E4,d,
E4,d,E4,d,E4,d,rest,d, //塊的內容
ToneControl.BLOCK_END,0, //塊定義結束符
ToneControl.PLAY_BLOCK,0, //播放當前塊號為0的塊,塊號必須提前定義
D4,d,D4,d,D4,d,rest,d, //不使用塊號方式播放的內容,必須位於塊定義後面
};
//建立播放器
Player p=Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
//準備播放資訊
p.realize();
//擷取音調控制
ToneControl c=(ToneControl)p.getControl("ToneControl");
//設定音調序列
c.setSequence(mySequence);
//設定播放資源,擷取裝置
p.prefetch();
//開始播放
p.start();
}
catch(Exception e)
{
}
下面是一個播放音樂檔案的例子:
try
{
//從資源中擷取聲音
InputStream is=getClass().getResourceAsStream("/"+"Testsound.mid");
//建立播放MIDI聲音的播放器
Player player=Manager.createPlayer(is,"audio/midi");
//擷取播放資訊
player.realize();
//擷取裝置
player.prefetch();
//開始播放聲音
player.start();
VolumeControl control=(VolumeControl)player.getControl("VolumeControl"); //獲得控制介面,此介面的獲得必須在擷取播放資訊或者擷取播放裝置後面,如果在它們前面,將會出現無法播放聲音的情況
if(control!=null) //必須檢查是否為null,因為有些聲音格式可能不支援音量控制
{
control.setLevel(5); //設定音量層級為50
//control.setMute(true); //設定靜音
}