RTMP语音通讯

前言

最近在搞即时语音聊天的功能,经过几个月的努力,目前基本稳定,达到了可以上线的标准,在此写篇博客记录下。

客户端采用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) 
采样

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值