即时通信系统中的音视频处理技术
2012-06-06苏育挺金富玉张承乾
苏育挺,金富玉,张承乾
(天津大学 电子信息工程学院,天津 300072)
随着因特网的飞速发展,基于网络的即时通信工具已从早期的消息聊天逐渐发展成为具备音视频聊天功能的综合应用程序。目前已经实现的音视频通信方式主要包括点对点视频通信、视频会议系统、语音电话等,其传输服务质量的优劣已成为衡量即时通信系统整体性能的一个关键性指标。
在现有的即时通信系统中,实现音视频通信的核心组件包括音视频处理框架和即时通信协议两个部分。音视处理框架集成了音视频采集、音视频编解码、音视频分流控制、音视频数据流网络拥塞控制等技术模块,能够完成音视频数据流的采集、编码、分流等基本处理流程;即时通信协议则负责为音视频数据协商传输通道,并且在协商好的传输通道上建立对应的连接,从而为音视频数据的顺畅传输提供保障。
1 即时通信协议
即时通信协议是进行即时通信必须遵循的信息规范,主要负责完成用户信息传输通道协商,客户端与服务器通信信令传输控制等任务。XMPP是主流即时通信协议之一,是基于可扩展标记语言(XML)的协议,其继承了在XML的高可扩展性,可以通过发送扩展的信息来处理用户需求。目前最常用的即时通信协议体系主要是SIP和XMPP协议体系,两者都可以完成音视频通信功能。另外,一些商业公司自行开发私有的即时通信协议实现了相对封闭的通信环境,例如QQ和MSN。
XMPP协议是个总称,包括核心协议,扩展协议等。核心协议只规定了很小、很基本的一些功能,大部分功能都是在扩展协议中规定的。实际上,XMPP协议只是作为协商协议应用,真正的P2P连接和实时通信是通过其扩展协议实现的。Jingle就是典型的扩展协议案例。
Jingle[6]是Google开发的XMPP协议上的扩展,其解决了在XMPP协议体系下点对点的P2P连接问题。Jingle协议提供了多种传输方式用于数据传输,而针对多媒体数据的最为常见的模式是两种UDP传输方式。一种传输模型是RAWUDP[9],RAWUDP是在UDP协议上发送媒体数据包的传输通道模型,可以实现在同一局域网下的P2P连接,没有网络穿越功能,无法实现远程通信;另一种模型则是功能更为强大的 ICE-UDP[8],ICE-UDP 也是在 UDP协议上发送媒体数据包,并且可以实现具有防火墙的网络穿越和ICE连接性检查,实现远程通信。ICE是标准的建立P2P连接性检查的协议,其自身不能独立工作,必需在信号通道的协调下建立连接,而XMPP协议就可以作为ICE通道协商的协议标准。
基于Jingle/XMPP协议实现的即时通信框图如图1所示。Jingle通过XMPP完成P2P通道的协商任务,同时通过Jingle协议建立P2P通道并进行连接性检查,然后建立并完成RTP会话,从而完成音视频通信。如果选择ICE-UDP通道传输模型进行RTP视频数据传输,XMPP服务器可以使用STUN[2]服务器收集用户的地址,包括NAT[3]后面的私有地址以及NAT与互联网连接的公共地址,并且以此为基础建立映射机制,完成会话参与者跟具体的网络地址间的转换和NAT穿越。
图1 Jingle/XMPP通信NAT穿越
2 音视频处理框架
即时通信系统中的音视频处理框架主要为用户提供一组多媒体数据处理的接口,用户可以用这些接口实现从多媒体采集卡上获得数据,进行压缩编码、格式转换、数据封包等一系列操作,从而完成多媒体的实时处理传输功能,大大简化多媒体处理的复杂性。目前具有二次开发功能的音视频处理框架包括Gstreamer,Directshow,Opencore等。其中DirectShow是微软公司在ActiveMovie和Video for Windows基础上推出的基于COM的流媒体处理开发包。运用DirectShow可以很方便地从支持Windows驱动模型的采集卡上捕获数据,并进行相应的后期处理乃至存储到文件中。OpenCore则是手机操作系统Android的多媒体核心,OpenCore的代码非常庞大,是一个基于C++的实现,定义了全功能的操作系统移植层,各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承等方式。而基于Linux平台的GStreamer则是完全开源的多媒体框架库,利用其可以构建一系列媒体处理模块,包括从简单的Ogg播放功能到复杂的音频混音和视频非线性编辑处理。Gstreamer应用非常广泛,大多数手机平台及个人电脑Linux平台均采用Gstreamer进行音视频处理开发。
2.1 Gstreamer音视频处理
Gstreamer通过其模块化设计理念,更加便于构建流媒体应用程序。它将各个模块封装起来,以元件的形式提供给用户使用。用户可以利用库中原有的元件进行应用程序的编程,同样也可以编写元件,然后插入到库中,以便日后调用时使用。如果只利用库中的元件来实现特定功能,只需要采用模块化的方式编写应用程序[4]。Gstreamer实现局域网内简单多媒体音视频传输发送端的框图如图2所示。对于视频数据流,Gstreamer在发送端将摄像头(v4l2src1)采集的数据依次经过色度空间转换(ffmpegcsp1)、H263 视频编码(ffenc_h263p1)、RTP[1]载荷头添加(rtph263ppay1),在gstrtpbin中实现实时传输协议(RTP)和实时传输控制协议(RTCP)数据包整合,并添加发送报告的背景时钟时间戳,便于在接受端进行音视频同步播放,然后发到UDP端口(udpsink)。在接收端,从UDP端口截获的数据依次经过 RTP和RTCP数据包解析、RTP载荷头解码、H263解码器解码视频数据、色度空间转换,最后经过视频显示插件显示到窗口中。其中gstrtpbin是进行RTP会话管理的核心组件,可以完成RTP数据包传输控制、RTCP数据包生成、冲突检测、音视频分流等任务。
图2 Gstreamer音视频通信发送端
2.2 Farsight视频会议框架
通过Gstreamer开发库中的基础元件可以完成音视频处理的功能,并且可以进行简单的局域网内视频通信。但是,在视频会议等复杂应用中经常包含多个多媒体会话,而且多媒体会话之间的协调非常复杂,需要通过更为高层的处理框架来实现会话管理的功能。Farsight是以Gstreamer为基础开发的视频会议框架,它能够提供一套完整的为多媒体流协议编写插件的应用程序接口,同时还为用户提供API调用这些插件。即时通信应用程序可以使用Farsight进行音视频会议,而无须担心底层的数据流和NAT穿越的问题。因为Farsight[5]是以Gstreamer为基础进行开发,所以开发新的元件能够和已有的Gstreamer元件整合,实现完成视频会议功能的多媒体框架。Farsight可以包含多路音视频会话流,包含多个会话参与者,具有强大的音视频会话管理功能。它通过模块化设计为许多即时通信软件提供音视频会议的服务,大大扩展了多媒体处理的功能,并且可以实现更为强大的视频会议功能。目前很多即时通信客户端软件都采用Farsight完成音视频通信。本文以Gstreamer/Farsight音视频处理框架为重点,详述其内部结构及功能实现。
Farsight中包括4个核心概念:会议(Conference)、会话(Session)、参与者(Participant)、流(Stream)。会话参与者是指多媒体数据源,可以是音频或视频等;会话则代表一路音频或视频会话,通常有一个媒体类型和一个输出端;会议则代表一个多媒体会议,可以包含多路会话,并且完成多路会话的协调管理;当参与者加入到会话中,就将多媒体数据引入会话中,使得数据能够流动,从而构成数据流。另外,Farsight实现了网络层的抽象,即将网络抽象为一个发射器对象,当数据流被创建时就会建立发射器对象,然后通过设置发射器参数确定发送的目的地址。实际上,Farsight并没有参与多媒体数据的采集和打包工作,它只是为多媒体数据流传输到网络端进行发送提供了一个通道,并且对通道进行协调管理,保证不同的会话参与者与其特定的数据流绑定以防止收发混淆。
Farsight实现RTP视频会议的结构如图3所示,其中FsRTPConference是Farsight框架下的一种插件,主要的RTP会话管理功能都在这个组件中实现。FsRTPConference中可以同时存在多路FsSession,每一路FsSession因参与者或音媒体源的不同代表不同的多媒体会话。编解码器在双方建立连接前无法确定,只有当通信双方的客户端协商之后,才会根据具体的编解码器名字调用并进行插件的连接。Farsight通过将gstrtpbin封装到FsRTPConference中,添加一些其他的必要组件,实现RTP会话。RTP管理器主要由gstrtpbin负责完成RTP会话管理的操作。在发送端,视频源和音频源通过Sink接入到会话中,编解码器协商成功后,将编码器与数据源和过滤元件连接,然后通过RTP混合器将音视频数据发送到RTP管理器中,完成RTCP数据包的生成以及RTP会话的管理。最后,经过数据发射器将数据发送到相应的数据通道中。在接收端,数据流同样要经过类似的信息解码过程得到音视频数据。
图3 Farsight视频会议框架
在发送端,数据发射器在Farsight中通常有多种插件选择,例如多播UDP插件、Libnice插件等,目的是为了实现底层数据传输的连接性检查。Libnice是实现了ICE和STUN协议规范的软件库,开发者以此为基础完成nice插件,可以实现基于ICE的数据发送。但是Libnice中只定义了如何在P2P连接确立后进行连接性检查,以及如何在确定的P2P连接上进行数据传输的网络穿越,并没有定义如何进行P2P连接,即P2P通道的协商任务。Jingle协议规范则定义了P2P通道建立连接及通道协商的任务。目前,Jingle协议已经在Libpurple(多协议会话开发库)中实现。
3 即时通信系统中音视频通信的实现
为了开发的便捷,Pidgin软件的开发者将负责通信部分与图形用户界面部分分开,分离出来的核心代码构成即时通信客户端开发的核心部分,被称为Libpurple。这个程序库已被Adium与Proteus这些客户端使用。完成分离后,开发者将有可能以各自的图形程序库编写自己的客户端接口。
在Libpurple中,为实现多媒体通信,开发者将基于Farsight的多媒体处理框架进行继承和封装,实现即时通信协议,并提供接口供用户使用,用户可利用应用程序接口编写程序实现网络层的连接。使用者可以使用Libpurple直接编写即时通信程序的核心代码,并构建应用程序。同时,Libpurple实现了许多即时通信协议的通信,例如MSN,XMPP,AIM等协议,同时完成了媒体后端流处理与相应即时通信协议的协同工作。
Libpurple在Farsight的基础上进行开发,实现了一套具备自身特点的流媒体模式。通过对Lipurple库的理解分析[10],得到了Libpurple实现音视频数据流控制及会话管理的方法,如图4所示。
图4 Libpurple音视频通信模式
图4中Src是音视频数据源,传输到FsSession进行音视频流整合、RTCP包生成、数据流管理等操作。Volume和level则分别表示音频的音量与消息控制插件。Libpurple采用FsSession做会话管理,并在FsSession的基础上添加Gstreamer基础元件进行控制,完成自己需要的功能。FsSession通过选择不同的连接通道,将音视频数据流通过发送器进行发送。Libpurple中实现了Jingle协议进行RTP通信的规范,并提供两种数据通道,RAWUDP和ICEUDP供用户使用。在进行具体RTP视频通信时,程序根据不同情况选择不同的通道使用。图4选择RAWUDP作为数据发送通道,用户也可以选择其他通道进行数据发送。为了与Jingle协议合作完成音视频通信,Libpurple建立了一个组件对象purplemedia,这个对象在Farsight组件中提取相关的参数信息,例如编解码器信息、发送目的地址等,并传递给Jingle协议,便于Jingle协议进行通道协商。当有新的即时通信协议需要利用Farsight完成视频通信时,开发者往往需要以Libpurple为基础进行开发,完成即时通信协议在Libpurple上的移植,以实现视频通信。
在众多采用Libpurple库开发的即时通信软件客户端中,Pidgin是最成功的,也是少数几个可以实现音视频通信的案例。Pidgin是一款支持多协议客户端的图形化即时通信应用程序,它可以使用AIM,Jabber,MSN,Yahoo等即时通信软件的帐号进行登录。并采用Libpurple作为开发库,利用图形开发工具包编写用户界面及各种事件提醒和任务管理,从而实现在多种即时通信协议基础上的音视频通信。
4 总结
目前,即时通信系统层出不穷,相比于诸如Skype、腾讯等商业公司开发的即时通信系统框架,具有开源特性的即时通信开发模式发展更加快速,技术更新更加频繁,能够为用户提供更为丰富和个性化的应用模式,因此更受到研发人员的关注。而以Farsight/Gstreamer音视频处理框架为代表的通用音视频处理框架,为音视频处理在即时通信环境下的实现提供了有力的技术基础,使音视频通信变得非常简单,并且大大扩展了多媒体通信的功能。在Linux环境下实现音视频通信的客户端软件有限,其中通信效果最好的Pidgin和Empathy均采用Gstreamer/Farsight作为其开发音视频功能的基本库,通过Jingle/XMPP等协议实现连接,完成音视频通信。因此,充分了解即时通信系统后端音视频处理的技术,将为研究人员开发音视频通信系统提供非常大的帮助。
[1] SCHULZRINNE H,CASNER S,FREDERICK R.RFC3550-RTP:A transport protocol for real-time applications[S].2003.
[2] ROSENBERG J,MAHY R,MATTHEWS P.RFC5389:Session traversal utilities for NAT(STUN)[S].2008.
[3]ROSENBERG J.RFC5245:a protocol for network address translator(NAT)traversal for offer/answer protocols[S].2010.
[4] TAYMANS W,BAKER S,WINGO A,et al.Gstreamer application development[M/OL].[2011-06-18].http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html.
[5] CRETE O.Audio/video communications framework[EB/OL].[2011-06-18].http://www.freedesktop.org/wiki/Software/Farstream.
[6] LUDWIG S,BEDA J,SAINT-ANDRE P,et al.Jingle[EB/OL].(2009-12-23)[2011-06-18].http://www.xmpp.org/extensions/xep-0166.html.
[7] LUDWIG S,SAINT-ANDRE P,EGAN S,et al.Jingle RTP sessions[EB/OL].(2009-12-23)[2011-06-18].http://www.xmpp.org/extensions/xep-0167.html.
[8] BEDA J,LUDWIG S,SAINT-ANDRE P,et al.Jingle ICE-UDP transport method[EB/OL].(2009-06-10)[2011-06-18].http://www.xmpp.org/extensions/xep-0176.html.
[9] BEDA J,SAINT-ANDRE P,LUDWIG S,et al.Jingle raw UDP transport method[EB/OL].(2009-12-23)[2011-06-18].http://www.xmpp.org/extensions/xep-0177.html.
[10] ATALLAH D,AURICH P,BAILEY J,et al.Farsight2 backend for media API[CP/OL].[2011-06-18].http://pidgin.sourcearchive.com/documentation/1:2.7.3-1ubuntu1/backend-fs2_8h.html.