之前工作内容涉及音视频录制,这里做些记录。
如果实现一个录音功能,包含如下要求
- 可以暂停,继续
- 每次暂停为一段
- 可以删除上一段
- 最后输出Mp3
接下去讲如何实现如上的需求
AudioRecord:是android提供的录音API,主要功能是录音,输出的结果是PCM数据
PCM: 脉冲编码调制是Pulse Code Modulation的缩写,模拟信号的数字化
1:初始化
public class AudioPart{
public AudioRecord audioRecord;
//采样率
public static final int SAMPLE_RATE = 44100;
//单声道
public static final int ChannelConfig = AudioFormat.CHANNEL_IN_MONO;
//采样位数 16 bit
public static final int PCM_BIT = AudioFormat.ENCODING_PCM_16BIT;
//声道数1
public static final int ChannelCount = 1;
public AudioPart() throws IOException {
...
//最小缓存大小
bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, ChannelConfig, PCM_BIT);
mBuffer = new byte[bufferSize];
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, ChannelConfig, PCM_BIT, bufferSize);
...
}
}
开始录制
audioRecord.startRecording();
读取数据
RandomAccessFile file
while{
int readSize = mAudioRecord.read(mBuffer, 0, mBuffer.length);
//mBuffer[0-readSize]的PCM数据,存入文件
for (int i = 0; i < readSize; i++) {
file.writeShort(mBuffer[i]);
}
}
}
停止录制
audioRecord.stop();
上面提到
可以暂停,继续
每次暂停为一段
可以删除上一段
主要是在数据上做处理
每次录制后向文件追加PCM数据,并记录这段的开始位置和结束位置
比如追加第三段PCM,开始位置为第二段末尾,结束位置为第三段末尾
删除上一段:即删除最后一段(第三段)的pcm数据
删除
当业务PCM数据都确定之后,一般需要上传服务器,上传前需要编码压缩,这里采用Mp3
PCM转Mp3使用的是第三方库lame
基于lame的封装https://github.com/shoyu666/PcmToMp3