@[TOC](錄制音頻后 播放速度變快)
錄制音頻文件
我使用aduiorecord錄制pcm文件 錄制代碼如下
創(chuàng)建實(shí)例
mAudioRecorder = new AudioRecord(
mRecorderBuilder.mAudioSource,
sample_rate,
channel_config,
format,
mRecorderBuilder.bufferSize);
其中參數(shù)含義
private int mAudioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;//自動(dòng)降噪,也嘗試過 MIC
private int mSampleRate = SAMPLE_RATE_44K_HZ;//44100
private int mChannelConfig = AudioFormat.CHANNEL_IN_MONO;//單聲道
private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;//每次采樣位數(shù)
mRecorderBuilder.bufferSize//緩沖區(qū)大小,其值大于 用AudioRecord.getMinBufferSize(sample_rate, channel_config, format) 獲取的最小值
錄音
//mPcmBuffer.size就是上面的mRecorderBuilder.bufferSize 大小
//private short[] mPcmBuffer
mAudioRecorder.read(mPcmBuffer, 0, mPcmBuffer.length);
存儲(chǔ)
我是通過隨機(jī)存儲(chǔ)文件對(duì)象,進(jìn)行數(shù)據(jù)的存儲(chǔ).
由于需要存儲(chǔ)為wav格式的文件,因此需要寫頭文件.
頭文件中需要計(jì)算 當(dāng)前錄音的格式 數(shù)據(jù)
第一次寫,網(wǎng)上找的格式寫的[1]
RandomAccessFile rand = new RandomAccessFile(saveFile, "rw");
RandomAccessFile rand = randomAccessFile;
long totalDataLen = totalAudioLen + 36;
rand.seek(0);
byte[] header = new byte[44];
header[0] = 'R'; // RIFF/WAVE header
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f'; // 'fmt ' chunk
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = 16; // 4 bytes: size of 'fmt ' chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1; // format = 1
header[21] = 0;
header[22] = (byte) (nChannels & 0xff);
header[23] = (byte) ((nChannels >> 8) & 0xff);
header[24] = (byte) (sampleRate & 0xff);//采樣率
header[25] = (byte) ((sampleRate >> 8) & 0xff);
header[26] = (byte) ((sampleRate >> 16) & 0xff);
header[27] = (byte) ((sampleRate >> 24) & 0xff);
header[28] = (byte) (byteRate & 0xff);//取八位
header[29] = (byte) ((byteRate >> 8) & 0xff);
header[30] = (byte) ((byteRate >> 16) & 0xff);
header[31] = (byte) ((byteRate >> 24) & 0xff);
int b = weikuan * nChannels / 8;//每次采樣的大小
header[32] = (byte) (b & 0xff); // block align
header[33] = (byte) ((b >> 8) & 0xff);
header[34] = (byte) (weikuan & 0xff);
header[35] = (byte) ((weikuan >> 8) & 0xff);
header[36] = 'd';//data
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte) (totalAudioLen & 0xff);
header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
rand.write(header, 0, 44);
寫完之后將寫入pcm數(shù)據(jù)流 我這里分裝了一個(gè)對(duì)象,單獨(dú)開了一個(gè)寫文件線程.
通過handler 開啟工作線程(之前的錄音也是一個(gè)單獨(dú)的線程具體看demo)
saveFileThread = new SaveFileThread();
saveFileThread.start();
saveHandler = new SaveFileThread.SaveHandler(saveFileThread);
if (msg.what == SAVEING) {
saving = true;
while (saveFileThread.doWork() > 0) ;
// Log.e(SaveFileThreadTAG, "收到 msg");
saving = false;
} else if (msg.what == STOP) {
saveFileThread.finish();
removeCallbacksAndMessages(null);
getLooper().quit();
}
SaveTask remove = saveDatas.remove(0);
int mSize = remove.mSize;
saveFile.saveByet(remove.saveData, 0, mSize);
至此wav文件錄制完畢
遇見的問題
錄出來的wav文件,播放時(shí) 語(yǔ)速非车福快, 感覺是快進(jìn)了兩倍.
找了很多原因都找不到,網(wǎng)上搜了幾天,無果.只有一篇帖子很像[2]
但是該帖子并沒有解決我的問題
特此發(fā)帖,一方面是記錄一下自己的demo
二來,希望哪位大神可以幫我看一下,我的demo到底出了說明問題
ps :demo中還實(shí)現(xiàn)了 lame庫(kù) 將 pcm格式轉(zhuǎn)換為mp3 格式的文件.使用 pcm格式文件轉(zhuǎn)換可以正常使用
我的demo地址 https://github.com/MartinLi89/myrecorder.git