//OutputStream outputStream是socket的输入流,实时传输到PC端。socket这块就不添代码了。
public void StartRecord(OutputStream outputStream) {
Log.i(TAG, "开始录音");
//采样率
int frequency = 44100;
//格式,单声道
int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
//16Bit
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
try {
int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize);
byte[] buffer = new byte[bufferSize]; //一样要用byte[], 否则会有字节序大小尾端的问题。
audioRecord.startRecording();
while (isRecording) {
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
if (bufferReadResult > 0) {
outputStream.write(buffer);
}
}
audioRecord.stop();
} catch (Throwable t) {
Log.e(TAG, "录音失败");
}
}
PC端播放PCM流是完全参考了雷神的代码:https://blog.csdn.net/leixiaohua1020/article/details/40540147
在PC代码中参数设置一定要和android端保持一致!
1. 采样率
2. 声道
3. 字节编码深度,//AudioFormat.ENCODING_PCM_XX
4. bufferSize。 PC Socket每次获取的流大小必须也是 AudioRecord.getMinBufferSize()
5. 前面提到的要用byte[], 不要用short[], int[], 不然后果就是小时候电视机没信号的声音! 这个问题困扰了我一天,最后发现是字节序的问题,这个不详细展开了。 搜大尾端,小尾端了解一下就好了。
雷神的demo是可以直接跑的。致敬一下雷神。