Android實(shí)現(xiàn)語音數(shù)據(jù)實(shí)時采集、播放
最近做的項(xiàng)目是和語音實(shí)時采集并發(fā)送,對方實(shí)時接收并播放相關(guān),下面記錄下實(shí)現(xiàn)的核心代碼。
很多Android開發(fā)者應(yīng)該知道android有個MediaRecorder對象和MediaPlayer對象,用于錄制和播放音頻。這個弊端在于他們不能實(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ù)定義好的幾個配置,來獲取合適的緩沖大小
// 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ā)送出去還是直接播放,這個隨便你。*/
}
//錄制循環(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í)時發(fā)送,所以需要考慮到包的大小,經(jīng)測試,我們使用160個byte作為一個包傳遞可以做到比較良好的播放效果(也就是將一份buffer拆分成四個發(fā)送)。處理代碼如下:
// 將數(shù)據(jù)通過監(jiān)聽接口回調(diào)出去
if (audioRecordingCallback != null) {
int offset = result % MAX_DATA_LENGTH > 0 ? 1 : 0;
//將一個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ù)倪^來播放聲音會一卡一卡的,為了解決這樣的問題,暫時使用了語音雙緩沖機(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í)現(xiàn)代碼
相關(guān)文章
Android?WebView緩存機(jī)制優(yōu)化加載慢問題
我知道你一定在煩惱Android?Webview的性能問題,特別突出的是-加載速度慢、消耗流量,針對Android?Webview的性能問題,提出一些有效解決方案2023-02-02
Flutter?文字中劃線動畫StrikeThroughTextAnimation
這篇文章主要為大家介紹了Flutter?文字中劃線動畫StrikeThroughTextAnimation示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Android使用自定義view在指定時間內(nèi)勻速畫一條直線的實(shí)例代碼
這篇文章主要介紹了Android使用自定義view在指定時間內(nèi)勻速畫一條直線的實(shí)例代碼,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
Android5.0+ CollapsingToolbarLayout使用詳解
這篇文章主要為大家詳細(xì)介紹了Android5.0+ CollapsingToolbarLayout使用,感興趣的小伙伴們可以參考一下2016-09-09
Android項(xiàng)目實(shí)現(xiàn)視頻播放器
這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目實(shí)現(xiàn)視頻播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Android PhotoView使用步驟實(shí)例詳解
這篇文章主要介紹了Android PhotoView使用步驟實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android StatusBar 透明化方法(不同的版本適配)
本篇文章主要介紹了Android StatusBar 透明化方法(不同的版本適配),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01

