[JavaME]手機同時播放兩個音樂
探討一
摘要:
本文檔以及后續文檔試圖一步一步地探討如何在手機上同時播放兩個聲音文件,譬如一個是背景音樂,一個是按鍵觸發的游戲音效。請慢慢看下去,我們盡量糅合進各方匯集的一些經驗。
1背景
摘要:本章 簡單描述手機同時播放兩個音樂的背景。
1.1. 常見于各大J2ME論壇的這個問題
最近看到,不斷地有人再詢問同一類型的問題:
“如何同步播放兩個音樂?”
“如何在播放背景音效的同時,還能夠播放其他聲音?”
大家眾說紛紜,不過有一部分的先行者已經琢磨出了實際可行之法。譬如,migjava曾經談及“索尼愛立信V800, Z800, K750, W800和K600移動電話支持同時播放兩個聲音”。
由于并不是所有機型支持,這個問題不是一個能夠用一攬子解決方法搞定的問題,換而言之,就算你能在一種類型的手機上驗證成功,也仍然會在其他廠商的手機上煩惱不已。
原因是我們所用到的MMAPI是一個仍然帶有很大局限性的玩具,各大廠商實現它的方法各異,你很難找到一個統一指導。即使是同一個廠商,譬如說Nokia,你也不能指望有什么你不會遇到。
我們編纂一下很多方面的抱怨,如下所示:
1.2. 每個廠商都會給你帶來煩惱
廠商之間的格式差別 : |
Midi和wav的編碼格式在Nokia上和其他廠家(譬如motorrola、siemens),所以逼迫你不得不在不同廠家機型上使用不同的wav文件。 |
摩托羅拉V300-V500-V600同時播放音樂的講究 : |
標題所指明的這幾款手機,唯一支持的同步播放音樂的辦法是,midi和wav聲音混合播放。
即使是這樣,也存在著一個限制:
應用程序必須先播放midi(可以作為背景音樂),然后再播放wav;wav文件還必須是以下的格式:
n PCM 8000KHZ;
n 8Bit;
n Mono。
除了上面這種方法,只要是一個新的media被播放,上一個Player必須被停止而且釋放資源。 |
在MOTO手機中播放聲音有下面幾條約束 : |
MOTO系列手機中JAVA程序播放一個聲音文件比較簡單,但是用于交互式音效時就有問題了。
根據MOTO的一些資料顯示,在MOTO手機中播放聲音有下面幾條約束:
1、除了同時播放一個MIDI和一個WAV以外,MOTO手機無法同時播放多個聲音,而且必須是先播放MIDI然后播放WAV;
2、除了MIDI或音階序列以外,不能同時實現player的多個實例進入prefetched狀態(預讀取聲音流);
3、播放新的聲音之前,前一個player必須停止并釋放資源(stop();deallocate())。 |
nokia6230i上的一些現象: |
當一個Player被prefetched,那么其他Player也就不再能夠prefetched,除非它們都是midi或都是amr。
如果你沒有在start/prefetch一個Player之前把其他的Player停下來,那么你將得到一個MediaException。 |
Dodgy MMAPI implementations : |
老實說,在摩托羅拉和其他大多數手機上的MMAPI實現是“dodgy”的,大多時候你不得不忍受它。 |
Nokia 3650與K700i之比 : |
不幸的是,老的Nokia S60系列在播放聲音上十分的不可靠,一個midi文件在一部手機上播放起來可能和另外一個同系列的手機上聽起來不同,特別是與K700i相比而言。K700i提供了優秀的midi聲效,而一個Nokia 3650基本上屬于垃圾。
|
甚至于有人憤怒地提出:dont try background sounds/music : |
I learned not to push nokia s60 sounds very far at all, the sound support is dire, my advice would be space the sound playing out (so that it isnt possible for your game to need to play 2 sounds at the same time or even one *directly* after another), dont try background sounds/music, dont try any time critical or constant sound calling (like from paint() constantly) .. Use a minimum amount of players, the limit on my ngage was 10, and i was having to prefetch but not realise for optimum results. Dont deallocate anything if you plan to reuse it. You cant reuse a player for a different sound. And finally, you cant always 100% of the time take the API commands at face value..
As a word of encouragement, I was pissed off with nokia sound, but so long as you dont push it too much, and keep it simple, ultimately it does end up being reliable. |
2
演示程序-TwinsMusic探索一
我們首先提供一個利用一個Player數組在不同線程中播放音效的例子,以體會下面幾點:
l 這個程序在WTK2.3 beta的模擬器中是可以通過測試的,可以在播放背景midi音效的同時,按鍵觸發播放midi或者wav音效;
l 在真機上的測試則不同。
以后,我們將陸續提供各種方式的實現,以充分探討這一問題,我們不單單需要正確的解決方法,還需要了解哪些方法是在真機上不可行的。
2.1. 程序說明
首先,程序啟動之后,我們自行編寫了一個StringKeyItem,它擴展了CustomItem,所以它可以幫助你的Form高級UI接收用戶手機按鍵。它還打印了當前機型是否支持混音,如上圖所示,模擬器是支持混音的,所以同時播放兩個聲音是沒有問題的。但是我的Nokia7610上則清楚地表明它不支持混音!
Form初始化的時候,就建立一個線程,播放背景音效“jazz.mid”。
同時,Form當前的焦點在StringKeyItem上,所以用戶按鍵能夠被StringKeyItem所截獲,如下面代碼所示:
代碼演示如何接收用戶按鍵事件: |
public class StringKeyItem extends CustomItem{
...
protected void keyPressed( int keyCode )
{
System.out.println("Key code=" + keyCode);
int GameKeyCode = getGameAction( keyCode );
int AudioPlayMusicKey = Audio.BEEP;
switch(GameKeyCode)
{
case Canvas.FIRE:
case Canvas.KEY_NUM7:
case Canvas.KEY_NUM8:
case Canvas.KEY_NUM9:
{
AudioPlayMusicKey = Audio.MESSAGE;
break;
} |
按鍵觸發了另一個線程播放音效:
代碼演示根據按鍵播放不同的音效: |
// 根據按鍵播放音樂
Audio.playSound(m_nKeyCode); |
Audio是我們封裝的一個播放類。
2.2. 使用說明
我是在Nokia真機上測試的,啟動程序之后,就立即開始播放背景音效“jazz.mid”,但是每當一個按鍵按下,jazz.midi就會被打斷,并自動重新播放,但是按鍵所對應的音效并沒有被正確播放。
我們將背景音效改為amr格式,也依然如此。
但是一旦我們選擇命令“停止背景音”,然后再按鍵,就會清楚地聽到按鍵音效,說明那個播放前臺音效的線程還是可以正常播放音樂的,只要沒有其他的player在播放。
3 資源
網絡資源:
1:《[JavaME]手機同時播放兩個音樂 探討一》
2:下載midlet:TwinsMusic-Effect1-deployed.rar ,大約26KB。代碼TwinsMusic-Effect1.rar,大約65KB。
3:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=547,索愛部分機型支持同時播放多個聲音;
4:Working with the Mobile Media API – Part 2.pdf
5:Sound_Implementation_on_V300-V500-V600.pdf
6:CH_BriefIntroductiontoMMAPIv1_0.pdf
7:《Sound_Whitepaper.pdf,http://trix2.cellmania.com/downloads/downloads/pdf/Sound_Whitepaper.pdf》
8:《MG_E680_V1_2.pdf,http://trix2.cellmania.com/downloads/downloads/pdf/MG_E680_V1_2.pdf,關于e680的media開發指導》;
鄭昀@ultrapower |
試驗品名稱 |
試驗品版本 |
Keyword: Mobile MMAPI Media 媒體播放 j2me |
TwinsMusic |
0.0.1 BETA |
4 歷史更新
暫無。