Android PCM流录音在PC端实时播放

//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是可以直接跑的。致敬一下雷神。

你可能感兴趣的:(Android PCM流录音在PC端实时播放)