最近需要在Android的客戶端中使用PCM聲音播放和錄制,簡單學(xué)習(xí)了一下。有不正確的地方還請指出。
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、來賓網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為來賓等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
首先有幾個概念需要了解一下:采樣頻率、聲道數(shù)、采樣位數(shù)。
采樣頻率一般是sample rate, 代表的是數(shù)字化音頻時每秒采樣的次數(shù)。常見的有44.1KHz(CD品質(zhì))、48KHz等。
這個很好理解,單聲道Mono就是聲音從一個方向傳出來;雙聲道Stereo也叫立體聲,聲音是從兩個方向傳來。通常的流行音樂中,仔細聽能發(fā)現(xiàn)每個聲道可能側(cè)重不同的樂曲聲部,比如左聲道吉他,右聲道鋼琴,人聲似乎兩個聲道都有,聽起來就像站在中間一樣。(這里沒有考證,隨便舉例)
每一個采樣都是一個數(shù)據(jù)點,采樣位數(shù)是指這個數(shù)據(jù)點使用了幾位來記錄。AudioTrack類只支持8位和16位的PCM音頻。8位就是2的8次方,即256個值;而16位則是2的16次方,有65536個值。
這個在音頻的編解碼中還是比較常用的。在PCM格式中,1秒鐘音頻的數(shù)據(jù)大小是SampleRate×Channel×Bit/8,單位是byte字節(jié)。由于PCM本身沒有音頻幀的概念,所以通過這個公式就能計算出任意時長音頻的大小,或者得到任意大小音頻的時長。如果規(guī)定1個音頻幀是“每個聲道256個采樣”,雙聲道下就是512個采樣,那么1幀的數(shù)據(jù)量就是256×Channel×Bit/8,同理可以推斷出1秒鐘有多少音頻幀等等。音頻幀的概念在各種編解碼中各有不同,但計算公式大同小異,這里不展開。
Android中音頻的播放使用的是AudioTrack類,具體用法非常簡單。
首先設(shè)置buffer大小。AudioTrack播放時需要先寫入buffer,如果這個buffer沒有寫滿,那么這部分是不會播放的。所以buffer不能設(shè)置太小,這樣會導(dǎo)致播放不連貫;而buffer也不能設(shè)置太小,這樣不間斷寫入會消耗許多CPU資源。AudioTrack自帶了getMinBufferSize方法可以給出一個最小buffer,一般用這個值就可以。getMinBufferSize方法三個參數(shù)分別是sample rate、channel和bit。
設(shè)置完buffer size就可以實例化一個AudioTrack。其中第一個參數(shù)streamType是指不同的音頻流類型,包括STREAM_MUSIC、STREAM_ALARM、STREAM_VOICE_CALL、STREAM_RING等,是Android對不同音頻的分類。中間三個參數(shù)很好理解,第四個是buffer size,剛剛計算出來了。最后一個參數(shù)mode有兩種:MODE_STREAM和MODE_STATIC。前者是以流形式播放,后者則是一次性全部寫入然后播放。
調(diào)用實例的play()方法就可以開始播放了。不過播放得要有數(shù)據(jù)吧?要填寫數(shù)據(jù)就要用到write()方法。write方法中第一個參數(shù)是一個byte[]類型,是要寫入的數(shù)據(jù)源,可以是從文件流中讀取出來的;第二個參數(shù)offset是初始位移,即從source的哪個位置開始;第三個參數(shù)則是輸入長度。
當(dāng)write方法寫滿一個AudioTrack的buffer時,就會有聲音播放出來了。
當(dāng)播放完成后記得要把AudioTrack停止并釋放。
如果您使用的是華為手機,手機外放無聲音,可以通過以下方法進行排查處理:
1,查看手機是否顯示耳機圖標(biāo)
如果手機未插入耳機,仍顯示耳機圖標(biāo),會導(dǎo)致手機外放無聲,出現(xiàn)該現(xiàn)象的原因有多種可能為進入液體、受潮、進灰等情況或者耳機是否標(biāo)配都可能會影響到耳機孔功能。您可以按照以下方法嘗試解決:
(1)、請嘗試插拔一次耳機或重啟手機進行嘗試
(2)、如果耳機孔有入液、進灰等情況,請嘗試清理。
(3)、如果您的手機顯示仍然異常,請您,提前備份好數(shù)據(jù)(QQ,微信等第三方應(yīng)用需單獨備份)、攜帶相關(guān)購機憑證,前往附近的華為客戶服務(wù)中心,獲取更多幫助
2,確保喇叭沒有被遮擋
3,重啟手機或更換播放音源后嘗試;
4,獲取更多幫助
如果您的手機外放仍然異常,請您提前備份好數(shù)據(jù)(QQ,微信等第三方應(yīng)用需單獨備份)、攜帶相關(guān)購機憑證,前往附近的華為客戶服務(wù)中心,獲取更多幫助 ?
相關(guān)鏈接如下;客戶服務(wù)中心預(yù)約服務(wù)維修備件價格查詢寄修服務(wù)
若使用的是vivo手機,可參考設(shè)置輸入法按鍵振動方法:
百度輸入法定制版:進入設(shè)置--系統(tǒng)管理--輸入法--百度輸入法定制版--鍵盤界面設(shè)置--按鍵反饋,根據(jù)您的需要調(diào)整振動大小即可;
搜狗輸入法定制版/vivo輸入版:進入設(shè)置--系統(tǒng)管理/更多設(shè)置--輸入法--搜狗輸入法定制版/vivo輸入法--鍵盤設(shè)置--按鍵反饋,根據(jù)您的需要調(diào)整振動大小即可。
Android中手機聲音調(diào)節(jié)步驟:
a、通過系統(tǒng)服務(wù)獲得聲音管理器:
AudioManager audioManager = (AudioManager)getSystemService(Service.AUDIO_SERVICE);
b、根據(jù)實際需要調(diào)用適當(dāng)?shù)姆椒ǎ海ǔS梅椒ǎ?/p>
audioManager.adjustStreamVolume(int streamType, int direction, int flags);
streamType:聲音類型,可取的為STREAM_VOICE_CALL(打電話時的聲音), STREAM_SYSTEM(Android系統(tǒng)聲音), STREAM_RING(電話鈴響), STREAM_MUSIC(音樂聲音)or STREAM_ALARM(警告聲音)。
direction:調(diào)整音量的方向,可取為ADJUST_LOWER(調(diào)低音量), ADJUST_RAISE(調(diào)高音量), or ADJUST_SAME(保持先前音量)。
flags:可選標(biāo)志位(如要顯示出音量調(diào)節(jié)UI,使用如下flag:AudioManager.FLAG_SHOW_UI)。
audioManager.setStreamMute(int streamType, boolean state);設(shè)置指定聲音類型(streamType)是否為靜音。如果state為true,則設(shè)置為靜音;否則,不設(shè)置為靜音。
audioManager.setRingerMode(int ringerMode);
設(shè)置鈴音模式,可取值為RINGER_MODE_NORMAL(鈴音正常模式), RINGER_MODE_SILENT(鈴音靜音模式), or RINGER_MODE_VIBRATE(鈴音震動模式,即鈴音為靜音,啟動震動)。
audioManager.setMode(int mode);
設(shè)置聲音模式,可取值為MODE_NORMAL(正常模式,即在沒有鈴音與電話的情況), MODE_RINGTONE(鈴響模式), MODE_IN_CALL(接通電話模式)or MODE_IN_COMMUNICATION(通話模式)。
注意:聲音的調(diào)節(jié)是沒有權(quán)限要求的。
若使用的是vivo手機,可參考以下方法:
設(shè)置系統(tǒng)鈴聲的方法:
進入設(shè)置--聲音與振動/聲音、振動與靜音鍵/聲音--可設(shè)置來電鈴聲、信息鈴聲、日歷提醒鈴聲、通知鈴聲、鬧鐘鈴聲等。
自定義鈴聲設(shè)置方法:
1、進入設(shè)置--聲音與振動/聲音、振動與靜音鍵/聲音--來電鈴聲--自定義鈴聲,選擇本地歌曲,也可在選擇歌曲后點擊右上角剪輯,自由截取歌曲片段設(shè)置為來電鈴聲。
2、進入i音樂中,在音樂播放列表中選擇歌曲--點擊“...”--選擇鈴聲彩鈴--截取片段后--設(shè)為鈴聲。目前支持鈴聲制作的格式:MP3和WAV,付費或會員歌曲暫不支持設(shè)置鈴聲(制作好的鈴聲保存在文件管理的“制作鈴聲”文件夾中)