Android语音通话实现方案及相关技术介绍

语音通话

Step1:语音采集和输出

  • 基于相应的android手机设备,采用Android SDK提供的API,就是mediaRecoder类用于采集,AudioTrack类用于输出播放;或者采用Android OpenSL ES接口,在Native层实现,有封装好的OpenSL ES de APIAndroid audio streaming with OpenSL ES and the NDK

Step2:编解码方式

  • Opus编码格式,在低码率下压缩效率高,或者ilbc编码,在http://www.opus-codec.org 中有一套完整的基于C语言的编解码库,可以用JNI整合到android中去。

Step3:网络传输

  • TCP/UDP或者RTP方式进行网络传输。

Step4:去噪声消回音

  • 通过Speex库(暂时未做了解)

语音通话资料

涉及到通信协议,还有编解码的问题。(我目前了解到这两个方面)。查找资料知道,现在的主流LTE语音解决方案包括三种:双待机、CSFB、VoLTE三种:

CSFallBack(CSFB):
是LTE终端通过电路域使用语音业务的一种方案,终端平时驻留在LTE网络,使用LTE数据业务,当发起语音呼叫或者接收到语音呼叫的时候,终端回落到2G/3G电路域进行语音呼叫,结束后再返回LTE。
双待机:
具备双待机能力的LTE终端可以同时再LTE和2G/3G电路域工作,即同时在LTE网络上使用数据业务, 在2G/3G电路域上使用语音业务,实现数据业务的并发,无需回落。
VoLTE:
是架构在LTE网络上全IP条件下的端到端语音方案。VoLTE的语音作为IP数据传输,无需2G/3G网,全部业务承载于LTE网络上,可实现数据与语音业务在同一网络下的统一。相对于现有技术的2G/3G网络,通过引入高清编解码等技术,VoLTE可拥有比2G/3G语音,以及时下流行的OTT语音业务更好的用户体验。同时,当终端离开LTE的覆盖区,VoLTE能够将LTE上的语音呼叫切换到2G/3G网络山,保证语音呼叫的连续性。


IM(instant message)所涉及的协议

1)SIP协议

会话初始化协议(Session Initiation Protocol, RFC3261),是一个基于文本的处于应用层的控制协议,可以用来创建,修改和终止会话。它是多媒体框架中的一部分,它与RTP(实时数据传输协议)、RSTP(实时流协议)、SDP(会话描述协议)构成一个完整的多媒体架构,SIP是其中的交通工具。它是基于TCP/IP协议进行传输的,因此可以通过UDP或者TCP传输。

2)XMPP协议

针对即时通讯和空间平衡扩充的进程开始协议(SIMPLE)、即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)为另外三种主流IM协议。XMPP是这四种协议中最灵活的。基于XML的协议的XMPP协议继承了在XML环境中灵活性和发展性。这就是基于XMPP协议的应用为何具有超强的可扩展性的根本性原因。处理用户的需求可以采用经过扩展后的XMPP协议通过发送扩展信息来处理,以及在XMPP的顶端建立应用程序,如内容发布系统和基于地址的服务等。开发者很容易的构建客户端应用程序或给已经配好的系统添加一些功能,是因为XMPP协议包含对服务器端的软件协议,使之能与另一个客户端通话。
以XML为基础XMPP协议会在网络上分片段的发送XML流协议。XMPP协议使得即时通讯的使用领域更加丰富,因为XMPP协议不但可以实现人与人之间的交流,还可以实现软件与人或软件与软件之间的交流。
XML流:XML流可以看成一个含有俩个实体通过网络交换的XML元素的容器,XML打开标签<stream>(包含属性和名字空间声明)作为XML流的开始,流的结尾则是一个XML关闭标签</stream>。XML流的生命周期里,初始化实体可以使用XML流发送很多XML元素给接收实体,完成交换信息,接收实体必需发起一个反向的握手(应答流)。
XML节:XML节从会话的一端发送具有语义的结构化数据单元到另一端。它从开始标签到结束标签,位于<stream/>的子层。作为一个语义单元,协议定义了三个XML节:<presence/>节,<message/>节,<iq/>节。他们也是XMPP协议的三种基本的通信机制:

  • 基于Subscribe-publish的广播通信机制:Presence类型的通信
  • 基于push的通信机制:Message类型的通信
  • 基于Request-Response的通信机制:I/Q类型的通信

3)TCP和UDP协议

此处不对这两个协议进行过多介绍


编码方式

基于Opus的编解码

Opus是一个有损声音编码的格式,低码率下Opus比曾经的HE AAC格式又是大很多,中码率下可以与压缩码率比它高出30%左右的AAC格式,高码率下更是接近于原始音频。因此非常适合用于VoIP语音电话的项目。

基于ilbc的编解码

这种编解码的压缩比率还是比较大的,大概在1/10至1/9之间。也就是说假如每秒20kb的语音数据,编码后就是2kb/s,比较小,利于网络传输。


服务器端

流媒体服务器Wowza部署及实现

Wowza Media Server是一款高性能、多线程的,专为多种终端设备提供音视频内容播放服务的流媒体服务器软件。 基于Java的架构Wowza Media Server的接口相当丰富,程序员可以十分便捷地进行二次开发。RTSP/RTP是实时流传输协议之一,定义了应用程序的媒体数据如何通过IP网络传输。 RTSP协议主要作用是控制应用程序如何通过网络传送媒体数据,主要分为暂停(PAUSE)、播放(PALY)、停止(CEASE)、快进(SPEED)、快退(BACK)等操作。

即时通信服务器Openfire部署及实现

即时通讯服务器——Openfire,可以实现同时登陆多个客户端,并且可以并发的连接到一个服务器上。Openfire使用XMPP协议,采用XMPP协议的IM(Instant Messaging)客户端软件可以登录服务器。然后,服务器对连接通过认证的客户端创建会话,该会话负责服务器端和客户端之间的通信。Openfire服务器创建一个个线程来响应每个用户的请求,为了使服务器的执行效率能够提升,Openfire通过线程池创建和管理线程。通过Openfire接收到的用户请求的数量,线程池可以自动调整大小。


音频采集

在android中采集音频的api是android.media.Audio.Record类。

public AudioRecord(

int audioSource, //音频源,从麦克风采集所以参数值为MIC

int sampleRatelnHz, //采样率,每秒采样次数,采样率越高,音质越好,一般是44100,不同采样率的值,对饮不同设备的支持。

int channelConfig, //声道设置,android支持双声道和单声道,分别为STEREO和MONO

int audioFormat, //编码制式和采样大小,android一般使用PCM编码,大小一般为16bit或者8bit

int bufferSizeInBytes //采集数据缓冲区大小

)


Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐