1、音视频通信
音视频通信完整流程有如下几个环节:采集、编码、前后处理、传输、解码、缓冲、渲染等。
每一个细分环节,还有更细分的技术模块。比如,前后处理环节有美颜、滤镜、回声消除、噪声抑制等,采集有麦克风阵列等,编解码有H.263,H.264、H.265等,传输就涉及到了本文重点介绍的 RTSP/RTMP/RTP/RTCP 等流媒体协议以及相关的信令技术。
2、流媒体协议
流媒体协议一般分成传输控制报文的协议和传输媒体数据的协议。传输控制报文的协议一般用于协商流媒体通信建立的参数等,如SIP,RTSP等协议。传输媒体数据报文一般用于传输音视频媒体数据,如RTP/RTCP/SRTP/SRTCP等协议。此外,也有部分协议将控制信令和媒体信令放在一个连接里传输的,如RTMP等协议。下面会详细介绍这些具体的协议。
2.1、SIP协议
SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。SIP 是一种源于互联网的IP 语音会话控制协议,具有灵活、易于实现、便于扩展等特点。
SIP作为控制信令一般要和RTP/RTCP媒体信令配合起来用在音视频通话上,整个音视频交互如上图所示。
交互细节如下:
- Alice发起Invite请求(携带SDP,媒体初始化描述信息),邀请Bob进行音视频通话。
- 如果Bob在线,服务器将Alice的请求转发给Bob。
- Bob收到Alice的请求之后,回180 Ringing振铃以及200 ok的确认接入音视频通话。
- Alice收到确认后,使用RTP/RTCP进行音视频通话。
- Alice发Bye请求,挂断电话。
- Bob回200 ok,确认挂断电话。
SIP协议原来比较多的用于视频会议,现在基本上被RTMP协议取代了。
2.2、RTMP
RTMP(Real Time Messaging Protocol, 实时消息传输协议)Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议。RTMP是基于TCP协议的一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种,主要用来在 Flash/AIR 平台和支持 RTMP 协议的流媒体/交互服务器之间进行音视频和数据通信。
如上图所示,RTMP的交互流程中,需要经过握手,建立连接,建立流,播放,停止等阶段。在播放流媒体之前,需要先创建网络连接(NetConnection)和网络流(NetStream)。网络连接表示客户端和服务器之间的连通关系,而网络流代表了发送多媒体的通道。所以,客户端和服务器之间只能建立一个网络连接,而基于这个网络连接可以创建很多网络流。
RTMP 是目前主流的流媒体传输协议,广泛用于直播领域,目前市面上绝大多数的直播产品都采用了这个协议。
2.3、RTSP
RTSP(Real Time Streaming Protocol, 实时流传输协议),RFC2326,,是基于TCP或UDP的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。SIP作为控制信令一般要和RTP/RTCP媒体信令配合起来用在音视频媒体传输上。
RTSP的交互流程如上图所示。其交互细节如下:
- 客户端询问(OPTIONS)服务器目前有哪些方法。
- 服务器提供所有可用的方法。
- 客户端请求(DESCRIBE)服务器提供SDP(媒体初始化描述信息)。
- 服务器提供SDP(媒体初始化描述信息)
- 设置(SETUP)音视频的会话属性,以及传输模式,提醒服务器建立会话。
- 服务器建立会话,返回会话描述标识符以及会话的相关信息。
- 客户端请求播放(PLAY)。
- 服务器响应请求。
- 服务求发送(RTP/RTCP)流媒体数据。
- 客户端请求关闭(TEARDOWN)会话。
- 服务器响应关闭请求。
和RTMP协议一样,RTSP也经常用于直播。但RTSP协议一般传输的是ts,mp4格式的流,而RTMP协议一般传输的是flv,f4v格式流。
RTSP传输一般需要2-3个通道,命令和数据通道分离,RTMP一般在TCP一个通道上传输命令和数据。
目前使用比较多的浏览器和Flash都不支持rtsp支持。所以,RTSP在直播领域,没有RTMP使用广泛。
2.4、RTP/RTCP
RTP(real-time transport protocol, 实时传输协议),在多点传送(多播)或单点传送(单播)的网络服务上,提供端对端的网络传输功能,适合应用程序传输实时数据,如:音频,视频或者仿真数据。RTP没有为实时服务提供资源预留的功能,也不能保证QoS(服务质量)。
数据传输功能由一个控制协议(RTCP)来扩展,通过扩展,可以用一种方式对数据传输进行监测控制,该协议(RTCP)可以升级到大型的多点传送(多播)网络,并提供最小限度的控制和鉴别功能。
RTP和RTCP被设计成和下面的传输层和网络层无关。协议支持RTP标准的转换器和混合器的使用。
RTP由IETF的多媒体传输工作小组1996年在RFC 1889中公布,现行版本为RFC3550,
RTCP(Real-time Transport Control Protocol或RTP Control Protocol,实时传输控制协议)是实时传输协议(RTP)的一个姐妹协议,由RFC 3550定义(取代作废的RFC 1889)。
RTP 使用一个 偶数 UDP port ;而RTCP 则使用 RTP 的下一个 port,也就是一个奇数 port。RTCP与RTP联合工作,RTP实施实际数据的传输,RTCP则负责将控制包送至电话中的每个人。其主要功能是就RTP正在提供的服务质量做出反馈。
RTCP协议处理机根据定义了五种类型的报文:
- SR: sender report
- RR: receiver report
- SDES: source description items.
- BYE: indicates end of participation.
- APP: application specific functions
SR报文用于发送端报告本端的数据发送统计信息和数据接收统计信息,RR报文用于报告本端的数据接收统计信息,SDES报文用于报告本端的描述性信息,BYE在本端离开会话时发送,而APP则是特定于应用的数据。
2.5、SRTP/SRTCP
SRTP(Secure Real-time Transport Protocol,安全实时传输协议)是在实时传输协议RTP基础上所定义的一个协议,旨在为单播和多播应用程序中的实时传输协议的数据提供加密、消息认证、完整性保证和重放保护。它是由David Oran(思科)和Rolf Blom(爱立信)开发的,并最早由IETF于2004年3月作为RFC3711发布。
由于RTP协议和RTCP协议有着紧密的联系,SRTP同样也有一个伴生协议RTCP(Secure RTCP或SRTCP, 安全实时传输控制协议)。SRTCP为RTCP提供类似的与安全有关的特性,就像SRTP为RTP提供的那些一样。
在使用RTP或RTCP时,使不使用SRTP或SRTCP协议是可选的;但即使使用了SRTP或SRTCP,所有它们提供的特性(如加密和认证)也都是可选的,这些特性可以被独立地使用或禁用。唯一的例外是在使用SRTCP时,必须要用到其消息认证特性。
3、流媒体信令技术
目前主流的音视频方案商都会提供包括流媒体信令协议在内的音视频方案SDK,不需要开发者重新移植开发流媒体协议。
一般厂商会同步提供端侧和云侧的SDK,SDK使用的流媒体协议可能是SIP/RTMP/RTSP/RTCP/SRTP/SRTCP等协议, 也可能是厂商私有自定义的协议,但基本流媒体协议的原理几乎都是类似的。
大多数时候,只需要在厂商SDK的流媒体协议的基础上做信令的开发,就可以完成一个完整的流媒体通信。
如上图所示,设计了一套基于MQTT的SIP协议的信令,目的是为了用这套信令去协商获取厂商SDK流媒体通信的参数。具体流程如下:
- Alice向服务器发SIP Invite消息邀请Bob通话。
- 服务器收到SIP Invite消息请求后,通过厂商SDK,确认Bob是否处于在线状态。
- 如果Bob不在线,直接返回异常给Alice,如果Bob在线,将Invite请求转发给Bob。
- Bob无论同意还是拒绝都发出回复给服务器,由服务器转发给Alice。
- 如果Bob同意接收Alice的视频通话,服务器同时向Alice和Bob发送厂商流媒体通信的参数,如聊天房间号等信息。
- Alice和Bob使用服务器发送的流媒体通信的参数,配置到集成流媒体通信端侧SDK的应用上。Alice和Bob就可以正常进行通信。
- Alice发起SIP bye请求断开整个通话,服务器和Bob收到请求后,同步断开连接,并回收对应的资源。