亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android游戲開發(fā)之八】游戲中添加音頻-詳解Me

系統(tǒng) 2958 0

李華明Himi 原創(chuàng),轉(zhuǎn)載務(wù)必在明顯處注明:
轉(zhuǎn)載自 【黑米GameDev街區(qū)】 原文鏈接: http://www.himigame.com/android-game/312.html

很多童鞋說我的代碼運行后,點擊home或者back后會程序異常,如果你也這樣遇到過,那么你肯定沒有仔細讀完Himi的博文,第十九篇Himi專門寫了關(guān)于這些錯誤的原因和解決方法,這里我在博客都補充說明下,省的童鞋們總疑惑這一塊;請點擊下面聯(lián)系進入閱讀:

【Android游戲開發(fā)十九】(必看篇)SurfaceView運行機制詳解—剖析Back與Home按鍵及切入后臺等異常處理!


游戲開發(fā)中,通過資料和書籍了解到在有兩種播放音頻形式可以用在我們的游戲開發(fā)中,第一個:MediaPlayer 類 ;第二個:SoundPool 類!

PS:當然還有一個JetPlayer 但是 播放的文件格式比較麻煩,所以這里拋開不解釋,有興趣的可以去自己研究下、呵呵;

運行效果圖:


【Android游戲開發(fā)之八】游戲中添加音頻-詳解MediaPlayer與SoundPoo!并講解兩者的區(qū)別和游戲中的用途!

MediaPlayer 和:SoundPool 類!那么他們之間的利弊各是什么呢?或者說,我們游戲開發(fā)到底用哪一個更佳呢?

答案就是:兩者都必須要!!!分析利弊與各自的用途后,等各位童鞋熟習每個播放形式實現(xiàn)之后我會詳細道來!

下面仍然是先上代碼:(先看代碼 然后我講解兩個播放形式的利弊關(guān)系和各個用途以及其中解釋代碼中的幾個備注!)


一、 MediaPlayer 播放音頻的實現(xiàn)步驟:

1. 調(diào)用 MediaPlayer.create(context, R.raw.himi); 利用 MediaPlayer類調(diào)用create方法并且傳入通過id索引的資源音頻文件,得到實例;

2. 得到的實例就可以調(diào)用 MediaPlayer.star();

簡單吧、其實MediaPlayer還有幾個構(gòu)造方法,大家有興趣可以去嘗試和實現(xiàn),這里主要是簡單的向大家介紹基本的,畢竟簡單實用最好!

二、 SoundPlayer 播放音頻的實現(xiàn)步驟:

1. new出一個實例 ; new SoundPool(4, AudioManager.STREAM_MUSIC, 100);第一個參數(shù)是允許有多少個聲音流同時播放,第2個參數(shù)是聲音類型,第三個參數(shù)是聲音的品質(zhì);

2.loadId = soundPool.load(context, R.raw.himi_ogg, 1);

3. 使用實例調(diào)用play方法傳入對應(yīng)的音頻文件id即可!

下面講下兩個播放形式的利弊:

使用MediaPlayer來播放音頻文件存在一些不足:

例如:資源占用量較高、延遲時間較長、不支持多個音頻同時播放等。

這些缺點決定了MediaPlayer在某些場合的使用情況不會很理想,例如在對時間精準度要求相對較高的游戲開發(fā)中。

最開始我使用的也是普通的MediaPlayer的方式,但這個方法不適合用于游戲開發(fā),因為游戲里面同時播放多個音效是常有的事,用過MediaPlayer的朋友都該知道,它是不支持實時播放多個聲音的,會出現(xiàn)或多或少的延遲,而且這個延遲是無法讓人忍受的,尤其是在快速連續(xù)播放聲音(比如連續(xù)猛點按鈕)時,會非常明顯,長的時候會出現(xiàn)3~5秒的延遲,【使用MediaPlayer.seekTo() 這個方法來解決此問題】;

相對于使用SoundPool存在的一些問題:

1. SoundPool最大只能申請1M的內(nèi)存空間,這就意味著我們只能使用一些很短的聲音片段,而不是用它來播放歌曲或者游戲背景音樂(背景音樂可以考慮使用JetPlayer來播放)。

2. SoundPool提供了pause和stop方法,但這些方法建議最好不要輕易使用,因為有些時候它們可能會使你的程序莫名其妙的終止。還有些朋友反映它們不會立即中止播放聲音,而是把緩沖區(qū)里的數(shù)據(jù)播放完才會停下來,也許會多播放一秒鐘。
3. 音頻格式建議使用OGG格式。使用WAV格式的音頻文件存放游戲音效,經(jīng)過反復測試,在音效播放間隔較短的情況下會出現(xiàn)異常關(guān)閉的情況(有說法是SoundPool目前只對16bit的WAV文件有較好的支持)。后來將文件轉(zhuǎn)成OGG格式,問題得到了解決。

4.在使用SoundPool播放音頻的時候,如果在初始化中就調(diào)用播放函數(shù)進行播放音樂那么根本沒有聲音,不是因為沒有執(zhí)行,而是SoundPool需要一準備時間!囧。當然這個準備時間也很短,不會影響使用,只是程序一運行就播放會沒有聲音罷了,所以我把SoundPool播放寫在了按鍵中處理了、 備注4的地方

大概看完了利弊解釋,那么來看我的代碼備注的地方:

備注1:

這里我定義了一個 HashMap ,這個是哈希表,如果大家不是很了解這個類,那建議百度 google學習下,它與Hashtable很常用的,它倆的主要區(qū)別是:HashMap 不同步、空鍵值、效率高; Hashtable 同步、非空鍵值、效率略低 ;而 在J2ME中不支持HashMap ,因為me中不支持空鍵值,所以在me中只能使用hashtable、咳咳、言歸正傳,我這里使用hashmap主要是為了存入多個音頻的ID,播放的時候可以同時播放多個音頻。

上面也介紹了,SoundPool可以支持多個音頻同時播放,而且SoundPool在播放的時候調(diào)用的這個方法( 備注3 )soundPool.play(loadId, currentVol, currentVol, 1, 0, 1f); 第一個參數(shù)指的就是之前的loadId !是通過 soundPool.load(context, R.raw.himi_ogg, 1);方法取出來的,

那么除此之外還要注意一點的就是定義hashmap的時候一定要定義成這種形式HashMap<Integer, Integer> hm = new Hash<Integer, Integer>,聲明此哈希表就是一個key和volue值都是Integer的哈希表! 為什么要這么做,因為如果你只是簡單的定義成HashMap hm =new HashMap(),那么當你在播放的時候,也就是 備注4 方法這里的第一個id參數(shù)使用Hashmap.get()這個方法的時候總會出現(xiàn)錯誤的提示!

《SoundPool最大只能申請1M的內(nèi)存空間,這就意味著我們只能使用一些很短的聲音片段》為什么只能使用一些很短的聲音呢?

大家還是看 備注4 方法的第一個參數(shù),這里要求傳入的Id類型是個int值,那么這個int其實對應(yīng)的是通過load()方法返回的音頻id,而且這個id會因音頻文件的大小而變大變小,那么一旦我們的音頻文件超過int最大值,那么就會報內(nèi)存錯誤的異常。所以為什么用SoundPool只能播放一些簡短的音頻這就是其原因了。當然os 里為什么這么定義 我也無從查證和說明。

備注4 :此方法中參數(shù)的解釋

第一個參數(shù)是我通過SoundPool.load()方法返回的音頻對應(yīng)id,第二個第三個參數(shù)表示左右聲道大小,第四個參數(shù)是優(yōu)先級,第五個參數(shù)是循環(huán)次數(shù),最后一個是 播放速率 1.0 = 正常播放 ,范圍是 0.5至 2.0)

備注2:

這里是通過媒體服務(wù)得到一個音頻管理器,從而來對音量大小進行調(diào)整。這里要強調(diào)一下,調(diào)整音頻是用這個音頻管理器調(diào)用setStreamVolume()的方式去調(diào)整,而不是MediaPlayer.setVolue(int LeftVolume,int RightVolume);這個方法的兩個參數(shù)也是調(diào)正左右聲道而不是調(diào)節(jié)聲音大小。

好了,對此我們對游戲開發(fā)中到底需要用什么來做進行了分析,總結(jié)就是SoundPool適合做特效聲,其實播放背景音樂我感覺還是用MediaPlayer比較好,當然啦,用什么都看大家喜好和選擇啦!下面附上項目下載地址:(項目10+MB因為含有res音頻文件)

有人問 怎么才知道一首歌曲播放完了,那么這里給說下:

PlaybackCompleted 狀態(tài): 文件正常播放完畢,而又沒有設(shè)置循環(huán)播放的話就進入該狀態(tài),并會觸發(fā) OnCompletionListener onCompletion() 方法。此時可以調(diào)用 start() 方法重新從頭播放文件,也可以 stop() 停止 MediaPlayer ,或者也可以 seekTo() 來重新定位播放位置。

注意:1、 別忘記綁定操作! mp.setOnCompletionListener(this);

2、如果你設(shè)置了循環(huán)播放mp.setLooping(true);的話,那么永遠都不會監(jiān)聽到播放完成的狀態(tài)!!!!這里一定要注意!

源碼下載地址: 原文鏈接: http://www.himigame.com/android-game/312.html

(推薦大家訂閱本博客,因為咱的更新速度可是很快的~娃哈哈)

【Android游戲開發(fā)之八】游戲中添加音頻-詳解MediaPlayer與SoundPoo!并講解兩者的區(qū)別和游戲中的用途!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久九九精品一区二区 | 国产亚洲一区二区三区啪 | 高清国产天干天干天干不卡顿 | 亚拍一区| 国产精品v | 亚洲国产高清视频在线观看 | 色吧久久 | 亚洲视频久久 | 亚洲乱码一区二区三区国产精品 | 精品综合一区二区三区 | 狠狠操在线观看 | 亚洲男人天堂久久 | 国产视频久久久 | 激情婷婷成人亚洲综合 | 欧美福利视频在线 | 成 人 黄 色视频免费播放 | 久章草在线 | 夜夜爽网站 | 高清不卡日本v在线二区 | 国产欧美亚洲精品第3页在线 | 中文字幕在线观看亚洲日韩 | 日本一级毛片不卡免费 | 亚洲三级中文字幕 | 伊人一区二区三区 | 国产成+人+综合+欧美 亚洲 | 久久精品中文字幕首页 | 欧美成人免费xxx大片 | 亚洲欧洲第一页 | 青青影院一区二区免费视频 | 日本高清不卡视频 | 欧美高清成人 | 妞干网这里只有精品 | 福利一区视频 | 国产成人精品久久一区二区小说 | 久久成年人 | 国产欧美视频综合二区 | 四影虎库最新2021 | 国产精品一在线观看 | 免费看搡女人的视频 | 国产精品久久久久久久牛牛 | 国产com |