亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android實現(xiàn)語音數(shù)據(jù)實時采集、播放

 更新時間:2016年12月09日 10:26:39   作者:LanTingShuXu  
這篇文章主要介紹了android實現(xiàn)語音數(shù)據(jù)實時采集、播放的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近做的項目是和語音實時采集并發(fā)送,對方實時接收并播放相關,下面記錄下實現(xiàn)的核心代碼。
很多Android開發(fā)者應該知道android有個MediaRecorder對象和MediaPlayer對象,用于錄制和播放音頻。這個弊端在于他們不能實時采集并發(fā)送出去,所以,我們只能使用AudioRecord和AudioTrack來實現(xiàn)。
記得申明權限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" >


一、AudioRecord實現(xiàn)核心代碼介紹如下:

1、先申明相關錄制配置參數(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);
// 實例化AudioRecord
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
    frequence, channelInConfig, audioEncoding, bufferSize);
// 定義緩沖數(shù)組
buffer = new byte[bufferSize];

3、準備開始錄制,使用循環(huán)不斷讀取數(shù)據(jù)。

audioRecord.startRecording();// 開始錄制
isRecording = true;// 設置錄制標記為true

// 開始錄制
while (isRecording) {
// 錄制的內(nèi)容放置到了buffer中,result代表存儲長度
int result = audioRecord.read(buffer, 0, buffer.length);
/*.....result為buffer中錄制數(shù)據(jù)的長度(貌似基本上都是640)。
剩下就是處理buffer了,是發(fā)送出去還是直接播放,這個隨便你。*/
}

//錄制循環(huán)結束后,記得關閉錄制!!
if (audioRecord != null) {
  audioRecord.stop();
}


二、AudioTrack代碼實現(xiàn)介紹如下:

1、聲明播放相關配置。

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對象(初始化一次,該對象可重復使用)

// 獲取緩沖 大小
bufferSize = AudioTrack.getMinBufferSize(frequence, channelInConfig,
    audioEncoding);
// 實例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);


問題一:

由于目前的項目是實時采集,實時發(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ù)倪^來播放聲音會一卡一卡的,為了解決這樣的問題,暫時使用了語音雙緩沖機制來解決,問題優(yōu)化很明顯。代碼和示意圖如下:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論