Android實(shí)現(xiàn)語音數(shù)據(jù)實(shí)時(shí)采集、播放
最近做的項(xiàng)目是和語音實(shí)時(shí)采集并發(fā)送,對方實(shí)時(shí)接收并播放相關(guān),下面記錄下實(shí)現(xiàn)的核心代碼。
很多Android開發(fā)者應(yīng)該知道android有個(gè)MediaRecorder對象和MediaPlayer對象,用于錄制和播放音頻。這個(gè)弊端在于他們不能實(shí)時(shí)采集并發(fā)送出去,所以,我們只能使用AudioRecord和AudioTrack來實(shí)現(xiàn)。
記得申明權(quán)限:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" >
一、AudioRecord實(shí)現(xiàn)核心代碼介紹如下:
1、先申明相關(guān)錄制配置參數(shù)
private AudioRecord audioRecord;// 錄音對象 private int frequence = 8000;// 采樣率 8000 private int channelInConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;// 定義采樣通道 private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;// 定義音頻編碼(16位) private byte[] buffer = null;// 錄制的緩沖數(shù)組
2、在開始錄制前,我們需要初始化AudioRecord類。
// 根據(jù)定義好的幾個(gè)配置,來獲取合適的緩沖大小 // int bufferSize = 800; int bufferSize = AudioRecord.getMinBufferSize(frequence, channelInConfig, audioEncoding); // 實(shí)例化AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequence, channelInConfig, audioEncoding, bufferSize); // 定義緩沖數(shù)組 buffer = new byte[bufferSize];
3、準(zhǔn)備開始錄制,使用循環(huán)不斷讀取數(shù)據(jù)。
audioRecord.startRecording();// 開始錄制 isRecording = true;// 設(shè)置錄制標(biāo)記為true // 開始錄制 while (isRecording) { // 錄制的內(nèi)容放置到了buffer中,result代表存儲長度 int result = audioRecord.read(buffer, 0, buffer.length); /*.....result為buffer中錄制數(shù)據(jù)的長度(貌似基本上都是640)。 剩下就是處理buffer了,是發(fā)送出去還是直接播放,這個(gè)隨便你。*/ } //錄制循環(huán)結(jié)束后,記得關(guān)閉錄制!! if (audioRecord != null) { audioRecord.stop(); }
二、AudioTrack代碼實(shí)現(xiàn)介紹如下:
1、聲明播放相關(guān)配置。
private AudioTrack track = null;// 錄音文件播放對象 private int frequence = 8000;// 采樣率 8000 private int channelInConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;// 定義采樣通道 private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;// 定義音頻編碼(16位) private int bufferSize = -1;// 播放緩沖大小
2、初始化AudioTrack對象(初始化一次,該對象可重復(fù)使用)
// 獲取緩沖 大小 bufferSize = AudioTrack.getMinBufferSize(frequence, channelInConfig, audioEncoding); // 實(shí)例AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, frequence, channelInConfig, audioEncoding, bufferSize, AudioTrack.MODE_STREAM);
3、使用AudioTrack播放語音數(shù)據(jù)。
//將語音數(shù)據(jù)寫入即可。 track.write(dataArray, buffer, len);
問題一:
由于目前的項(xiàng)目是實(shí)時(shí)采集,實(shí)時(shí)發(fā)送,所以需要考慮到包的大小,經(jīng)測試,我們使用160個(gè)byte作為一個(gè)包傳遞可以做到比較良好的播放效果(也就是將一份buffer拆分成四個(gè)發(fā)送)。處理代碼如下:
// 將數(shù)據(jù)通過監(jiān)聽接口回調(diào)出去 if (audioRecordingCallback != null) { int offset = result % MAX_DATA_LENGTH > 0 ? 1 : 0; //將一個(gè)buffer拆分成幾份小數(shù)據(jù)包 MAX_DATA_LENGTH 為包的最大byte數(shù) for (int i = 0; i < result / MAX_DATA_LENGTH + offset; i++) { int length = MAX_DATA_LENGTH; if ((i + 1) * MAX_DATA_LENGTH > result) { length = result - i * MAX_DATA_LENGTH; } //寫到回調(diào)接口 audioRecordingCallback.onRecording(buffer, i * MAX_DATA_LENGTH, length); } }
問題二:
有時(shí)候傳輸?shù)倪^來播放聲音會一卡一卡的,為了解決這樣的問題,暫時(shí)使用了語音雙緩沖機(jī)制來解決,問題優(yōu)化很明顯。代碼和示意圖如下:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android基于訊飛語音SDK實(shí)現(xiàn)語音識別
- Android仿微信語音聊天功能
- android預(yù)置默認(rèn)的語音信箱號碼具體實(shí)現(xiàn)
- Android實(shí)現(xiàn)語音識別代碼
- Android使用百度語音識別的示例代碼
- Android 輕松實(shí)現(xiàn)語音識別詳解及實(shí)例代碼
- Android Studio應(yīng)用開發(fā)集成百度語音合成使用方法實(shí)例講解
- Android 基于百度語音的語音交互功能(推薦)
- Android仿微信語音聊天界面設(shè)計(jì)
- android語音即時(shí)通訊之錄音、播放功能實(shí)現(xiàn)代碼
相關(guān)文章
Android開發(fā)Dart?Constructors構(gòu)造函數(shù)使用技巧整理
這篇文章主要為大家介紹了Android開發(fā)Dart?Constructors構(gòu)造函數(shù)使用技巧整理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05android Watchdog 實(shí)現(xiàn)剖析
Android提供了Watchdog類,用來監(jiān)測Service是否處于正常工作中,是在SystemServer中啟動的;本文將詳細(xì)介紹2012-11-11Android 微信搖一搖功能實(shí)現(xiàn)詳細(xì)介紹
這篇文章主要介紹了Android 微信搖一搖功能實(shí)現(xiàn)詳細(xì)介紹的相關(guān)資料,并附實(shí)例代碼及實(shí)現(xiàn)微信搖一搖的思路,需要的朋友可以參考下2016-11-11Android中模仿抖音加載框之兩顆小球轉(zhuǎn)動效果
這篇文章主要介紹了Android仿抖音加載框之兩顆小球轉(zhuǎn)動控件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09Android 自定義ProgressDialog進(jìn)度條對話框用法詳解
ProgressDialog為進(jìn)度對話框。android手機(jī)自帶的對話框顯得比較單一,我們可以通過ProgressDialog來自己定義對話框中將要顯示出什么東西2016-01-01Android計(jì)算器簡單邏輯實(shí)現(xiàn)實(shí)例分享
這篇文章主要介紹了Android計(jì)算器簡單邏輯實(shí)現(xiàn)實(shí)例,有需要的朋友可以參考一下2014-01-01Android中EditText光標(biāo)在4.0中的bug及解決方法
這篇文章主要介紹了Android中EditText光標(biāo)在4.0中的bug及解決方法,簡單分析了Android4.0版本中EditText光標(biāo)消息的原因及相應(yīng)的解決方法,需要的朋友可以參考下2016-01-01Android中ListView Item布局優(yōu)化技巧
這篇文章主要介紹了Android中ListView Item布局優(yōu)化技巧,以實(shí)例形式分析了ListView Item布局的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10