在MIDP應(yīng)用程序中播放聲音
■前言
本文引用地址:http://m.butianyuan.cn/article/149129.htm在上一講中我們講述的是如何制作JAVA手機(jī)多媒體功能中的動(dòng)畫,本講中我們將介紹如何制作JAVA手機(jī)的另一個(gè)多媒體功能——聲音,即N800的音樂播放功能。若是在動(dòng)畫上再配以音樂播放功能,就能制作出具有豐富表現(xiàn)力的應(yīng)用程序了。
■音樂播放
現(xiàn)在我們利用MIDP應(yīng)用程序播放音樂。但是,MIDP標(biāo)準(zhǔn)API不支持聲音播放功能。機(jī)種不同,則聲音播放方法也不同,所以每個(gè)廠商都會(huì)使用他們各自擴(kuò)展的API。N800使用NEC擴(kuò)展的API,所以能用MIDP應(yīng)用程序播放聲音。
■N800的音樂播放功能
N800只能播放SMF(format0)格式的音樂數(shù)據(jù),最大文件尺寸為10Kbyte。SMF格式即StandardMIDIFile的縮略語,就是為了能實(shí)現(xiàn)互換性而設(shè)定的文件形式,互換性是指在不同的應(yīng)用程序中也具有能處理數(shù)據(jù)的特性。SMF分為format0和format1兩種格式。N800所采用的是format0格式。這兩種格式具有以下不同特點(diǎn)。(表1)
表1
■播放音樂
接下來我們實(shí)際操作讀取文件播放音樂的功能。
●音樂數(shù)據(jù)的讀取
利用擴(kuò)展API上的Media類的static方法讀取音樂數(shù)據(jù)。自變量中記述了音樂數(shù)據(jù)文件的通過。AudioClipaudio=Media.getAudioClip(“/test.mid”);
另外,能夠從web上獲得音樂數(shù),并且能夠從RMS中得到音樂數(shù)據(jù)。但,由于形式相同,這里就不特別講述了。詳細(xì)情況請(qǐng)參考擴(kuò)展API文檔。
●播放
播放讀取的音樂數(shù)據(jù)。使用AudioClip例子(在這稱為audio)play方法播放。
audio.play();
而且也能同時(shí)播放兩個(gè)以上的音樂數(shù)據(jù)。此時(shí),使用AudioClip例子(在這稱為audio1、audio2)play方法播放。
audio1.play();
audio2.play();
上述情況下能夠同時(shí)播放audio1,audio2。
●停止
能夠暫停音樂的播放。使用AudioClip例子的stop方法能夠停止。
audio.stop();
●其他功能
AudioClip定義了讀取其他音樂數(shù)據(jù)信息的方法和決定反復(fù)播放次數(shù)的方法。(表2)
表2
■音頻事件
音頻演奏過程中,演奏開始時(shí)、停止時(shí)、結(jié)束時(shí)都會(huì)發(fā)生音頻事件,能定義此時(shí)的處理。要定義音頻事件發(fā)生時(shí)的處理,有必要安裝AudioListener接口和記述audioAction方法內(nèi)的處理。
然后,使用AudioClip對(duì)象的addAudioListener方法進(jìn)入AudioListener。
publicclassAudioTestimplementsAudioListener{
/**
*構(gòu)造函數(shù)
**/
publicAudioTest(){
AudioClipaudio=Media.getAudioClip(/test.mid);//讀取音樂數(shù)據(jù)
audio.addAudioListener(this);//注冊(cè)audio事務(wù)監(jiān)聽器
}
/**
*音頻事件的處理
**/
publicvoidaudioAction(AudioClipsound,intevent,intparam){
//記述處理
•
•
}
}
ex.1
記述處理的audioAction方法的自變量如下所示。
表3
此外,事件的種類(audioAction方法的自變量、事件)在AudioListener接口文件夾中定義如下。(表4)
表4
以下展示的是只播放音頻數(shù)據(jù)的簡單范例。
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
/**
*音樂播放的簡單范例
*/
publicclassAudioextendsMIDlet{
Displaydisplay;
AudioCanvascanvas;
/**
*構(gòu)造函數(shù)
*/
publicAudio(){
canvas=newAudioCanvas();
display=Display.getDisplay(this);
}
protectedvoidstartApp()throwsMIDletStateChangeException{
display.setCurrent(canvas);
}
protectedvoidpauseApp(){}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
}
importjavax.microedition.lcdui.*;
importcom.nec.media.*;
/**
*音頻canvas
**/
publicclassAudioCanvas
extendsCanvas
implementsRunnable,CommandListener,AudioListener{
CommandSTART=newCommand(play,Command.OK,0);
CommandSTOP=newCommand(stop,Command.OK,0);
AudioClipa;//音樂數(shù)據(jù)
Threadth;
/**
*構(gòu)造函數(shù)
**/
publicAudioCanvas(){
a=Media.getAudioClip(/_test.mid);//讀取音樂數(shù)據(jù)
a.addAudioListener(this);//注冊(cè)AudioListener
this.addCommand(START);
this.addCommand(STOP);
this.setCommandListener(this);
th=newThread(this);
th.start();
}
/**
*音頻事件的處理
*/
publicvoidaudioAction(AudioClipsound,intevent,intparam){
if(sound==a){
if(event==AudioListener.AUDIO_COMPLETE){
sound.play();
}
}
評(píng)論