前言
最近在搞即时语音聊天的功能,经过几个月的努力,目前基本稳定,达到了可以上线的标准,在此写篇博客记录下。
客户端采用rtmp协议做推流和拉流,在网络稳定的情况下,实测延迟在200ms~500ms。
RTMP/RTSP协议说明
RTMP仅支持TCP协议、RTSP支持TCP和UDP两种协议。针对推流端,不管使用RTMP还是RTSP都需要使用TCP协议,以保证源头数据的正确性。拉流端如果使用RTSP的话,可以使用UDP协议。
使用RTMP作为拉流端的问题
在网络状态变化的时候,可能导致拉流端声音来不及消费,使缓存区数据过多,从而使延迟变得严重。解决办法即:需要判断缓存区已缓存的大小,计算出需要消费的时间,根据自己的需要,在超出预期的时候,断开重连。RTMP只支持TCP协议,如果不断开重连,数据不会丢失,必定要消费掉,延迟没法解决。
声音录制
初始化AudioRecord
int bufferSize = AudioRecord.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, sampleRate,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
开始录制
audioRecord.startRecording();
获取音频流
int bufferReadResult;
byte[] data = new byte[bufferSize];
while (isRecording() && (bufferReadResult = audioRecord.read(data, 0, bufferSize)) > 0) {
listener.onAudioRecorded(data, bufferReadResult);
}
boolean isRecording() {
return audioRecord != null
&& audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING;
}
停止录制
audioRecord.release();
音频参数
从初始化AudioRecord中可以看出,我们需要掌握的概念知识有4个:
采样率(sampleRate)
声道(AudioFormat.CHANNEL_IN_MONO)
采样