Android使用AudioRecord判斷是否有音頻輸入
Android黨都應(yīng)該玩過一個叫吹裙子的游戲,這個游戲就是原理就是通過監(jiān)聽用戶吹出的氣的力度來決定如何把MM的裙子弄飛起來的,所以關(guān)鍵在于如何判斷用戶吹氣的力度問題?,F(xiàn)在公司剛好有這個需求要評估就是需要一直監(jiān)聽用戶的語音輸入,當(dāng)在兩秒內(nèi)沒有語音輸入時候就暫停某項事情,有語音輸入的時候就要繼續(xù)做某件事。其實這兩件事情的本質(zhì)原理是一樣的,就是通過這AudioRecord來處理用戶輸入的原始音頻數(shù)據(jù),從而計算出當(dāng)前用戶輸入的音量大小來判斷用戶是否有語音輸入。下面貼上一段代碼用戶可以自行研究。
public static int calculateVolume(byte[] var0, int var1) { int[] var3 = null; int var4 = var0.length; int var2; if(var1 == 8) { var3 = new int[var4]; for(var2 = 0; var2 < var4; ++var2) { var3[var2] = var0[var2]; } } else if(var1 == 16) { var3 = new int[var4 / 2]; for(var2 = 0; var2 < var4 / 2; ++var2) { byte var5 = var0[var2 * 2]; byte var6 = var0[var2 * 2 + 1]; int var13; if(var5 < 0) { var13 = var5 + 256; } else { var13 = var5; } short var7 = (short)(var13 + 0); if(var6 < 0) { var13 = var6 + 256; } else { var13 = var6; } var3[var2] = (short)(var7 + (var13 << 8)); } } int[] var8 = var3; if(var3 != null && var3.length != 0) { float var10 = 0.0F; for(int var11 = 0; var11 < var8.length; ++var11) { var10 += (float)(var8[var11] * var8[var11]); } var10 /= (float)var8.length; float var12 = 0.0F; for(var4 = 0; var4 < var8.length; ++var4) { var12 += (float)var8[var4]; } var12 /= (float)var8.length; var4 = (int)(Math.pow(2.0D, (double)(var1 - 1)) - 1.0D); double var14 = Math.sqrt((double)(var10 - var12 * var12)); int var9; if((var9 = (int)(10.0D * Math.log10(var14 * 10.0D * Math.sqrt(2.0D) / (double)var4 + 1.0D))) < 0) { var9 = 0; } if(var9 > 10) { var9 = 10; } return var9; } else { return 0; } }
上述方法的形參中的一個字節(jié)數(shù)組便是當(dāng)前捕捉到用戶輸入的原始音頻數(shù)據(jù),第二個形參則是音頻數(shù)據(jù)格式位PCM,16位每個樣本,比如如果音頻數(shù)據(jù)格式設(shè)為AudioFormat.ENCODING_PCM_16BIT,則參數(shù)傳16。最后實現(xiàn)的效果就是如下:
01-12 18:54:17.222 E/recordtest(24249): no voice input
…………….
01-12 18:54:19.027 E/recordtest(24249): no voice input
01-12 18:54:19.067 E/recordtest(24249): no voice input
01-12 18:54:19.105 E/recordtest(24249): no voice input
01-12 18:54:19.145 E/recordtest(24249): no voice input
01-12 18:54:19.188 E/recordtest(24249): no voice input
01-12 18:54:19.227 E/recordtest(24249): no voice input
01-12 18:54:19.228 E/recordtest(24249): no voice input in 2 sec
01-12 18:54:19.269 E/recordtest(24249): no voice input
01-12 18:54:19.306 E/recordtest(24249): no voice input
01-12 18:54:19.345 E/recordtest(24249): no voice input
01-12 18:54:19.387 E/recordtest(24249): no voice input
01-12 18:54:19.427 E/recordtest(24249): no voice input
01-12 18:54:19.466 E/recordtest(24249): has voice input
01-12 18:54:19.505 E/recordtest(24249): has voice input
01-12 18:54:19.546 E/recordtest(24249): has voice input
01-12 18:54:19.586 E/recordtest(24249): has voice input
01-12 18:54:19.646 E/recordtest(24249): has voice input
01-12 18:54:19.686 E/recordtest(24249): has voice input
01-12 18:54:19.726 E/recordtest(24249): has voice input
01-12 18:54:19.766 E/recordtest(24249): has voice input
以上所述是小編給大家介紹的Android使用AudioRecord判斷是否有音頻輸入,多條目的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android學(xué)習(xí)系列一用按鈕實現(xiàn)顯示時間
這篇文章主要介紹了Android學(xué)習(xí)系列一用按鈕實現(xiàn)顯示時間的相關(guān)資料,需要的朋友可以參考下2016-05-05在RecyclerView中實現(xiàn)button的跳轉(zhuǎn)功能
本次實驗就是在RecyclerView中添加一個button控件并實現(xiàn)監(jiān)聽,使鼠標(biāo)點擊時可以跳轉(zhuǎn)到另外一個設(shè)計好的界面,對RecyclerView實現(xiàn)button跳轉(zhuǎn)功能感興趣的朋友一起看看吧2021-10-10android6.0權(quán)限動態(tài)申請框架permissiondispatcher的方法
下面小編就為大家分享一篇android6.0權(quán)限動態(tài)申請框架permissiondispatcher的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android中Glide實現(xiàn)超簡單的圖片下載功能
本篇文章主要介紹了Android中Glide實現(xiàn)超簡單的圖片下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03在Android環(huán)境下WebView中攔截所有請求并替換URL示例詳解
這篇文章主要介紹了在Android環(huán)境下WebView中攔截所有請求并替換URL示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07使用TransitionDrawable實現(xiàn)多張圖片淡入淡出效果
這篇文章主要為大家詳細(xì)介紹了使用TransitionDrawable實現(xiàn)多張圖片淡入淡出效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08