基于i.MX27的网络音视频通信的实现
扫描二维码
随时随地手机看文章
前言
随着因特网的发展成熟、用户需求的增长以及宏观环境变暖等条件的刺激,基于网络的音视频通信行业迅速发展起来。本文介绍基于Freescale公司i.MX27硬件平台,基于SIP(初始会话协议)协议的网络视传机的设计与实现。
视传机的软硬件技术基础
i.MX27
将视频编解码功能嵌入到多媒体应用处理器中已经成为一个趋势。Freescale DragonBall家族最新成员i.MX27多媒体应用处理器,片内集成H.264/MPEG4全双工硬件编解码视频处理单元,是嵌入式多媒体应用处理器的一颗新星,可广泛应用于多种产品中。i.MX27处理器内部的硬件编解码模块性能强劲,可以达到H.264/MPEG4编解码D1分辨率:720× 576@25fps;720×480@30fps;全双工编解码同时进行可以达到VGA分辨率:640×480@30fps。
SIP协议
SIP是由IETF(国际互联网标准制定组织)制定的面向 Internet 会议和电话的信令协议。SIP是一个应用层的协议,可以建立,修改或者中止多媒体会话或者呼叫。它是一个基于ASCII的端到端的协议,它实际上是在因特网上提供“约会”服务。用来实现VoIP的开放协议,最常用的有三种,SIP、MGCP(Media Gateway Control Protocol)和H.323。
SIP协议是专门为IP 电话,尤其是结合Internet设计的协议,同传统的H.323协议相比,SIP 拥有明显的优越性:优异的可扩展性,大大提高了系统的处理能力;与 Internet 紧密结合,使通讯更加轻松便捷的;卓越的开放性,不仅能够对手机、 PDA 等移动设备提供良好的支持,对于在线即时交流、语音和视频数据传输等多媒体应用也能够很好地完成。
SIP协议支持5方面的能力:用户定位、用户可用性、用户能力、会话建立、会话管理。SIP协议本身不提供业务,但是它提供业务支持的基础。SIP协议本身也不提供会议控制,但是SIP协议可以与任何一个会议控制的协议绑定。
Linphone
Linphone是基于WEB的IP电话工具,运行于Linux和Windows Xp下。通过Linphone可以在互联网上和其他人自由地进行声音、视频通信,也可以进行及时文本信息传送。Linphone是遵从SIP协议开发的,它需要和支持SIP协议的电话或者代理服务器进行相互操作。如果把基于Linphone开发的VoIP设备通过PSTN帐号注册到电信服务器上,就可以通过它和普通电话进行通话了。但是这些通话不是免费的,因为PSTN是收费服务。Linphone是开源免费软件,可以自由下载和重新发布。
MiniGUI
MiniGUI是面向实时嵌入式系统的轻量级图形用户界面支持系统。目前,MiniGUI已成为跨操作系统的图形用户界面支持系统,可在Linux/uClinux、eCos、uC/OS-II、VxWorks等操作系统上运行。
MiniGUI为实时嵌入式操作系统提供了完善的图形及图形用户界面支持。可移植性设计使得它不论在哪个硬件平台、哪种操作系统上运行,均能为上层应用程序提供一致的应用程序编程接口(API)。MiniGUI的技术优势:轻型、占用资源少,高性能、高可靠性,可配置,可伸缩性强,跨操作系统支持等。
视传机的实现
视传机的最主要功能包括:通过IP或者向服务器注册的ID号呼叫另一台接在网络上的设备,进行视频流实时双向收发(1帧-25帧/s),最高分辨率可达640×480(广播级图像质量/D1),可设置音频流格式,G.711/GSM/SPEEX,此功能适用于高网络带宽的应用环境。另外视传机还可以实现电影播放,音视频单向传输(远程监控),音视频录制播放,图片单双向收发,音视频邮件收发等功能。[!--empirenews.page--]
视传机实现这些功能基本原理就是用MiniGUI制作图形界面进行人机交互[1],用户通过键盘或者遥控器进行指令输入,MiniGUI接收用户指令,并传给操作系统(这里我们使用Linux 2.6.19),操作系统根据指令的不同进行不同的操作,例如若用户想进行视频呼叫,操作系统就将指令发给Linphone,Linphone就在SIP协议的基础上发起视频呼叫,根据对方不同的状态给出不同的响应,对方不在线、对方忙、对方正常应答等,在正常应答的情况下双方协商音频视频通信编解码方式,建立呼叫,进行音视频通信[2],然后任意一方挂机,退出,完成一次通信,期间还可以进行音视频录制等操作。再如若用户想进行电影播放,则操作系统会调出播放程序,播放用户指定的电影文件。
视频流的流程如下:由摄像头(支持自带插针式和TV输出两种)采集图像数据,交给操作系统[3],操作系统根据用户需要,将视频数据进行本地显示、编码录制或者发送到对端,对端收到视频数据送入VPU单元进行解码,然后显示或者录制等。通话过程中音频流的流程为:通过mic采集音频数据,交给操作系统,操作系统将数据送给Linphone,Linphone进行一定格式的编码[4],然后发送到对端,对端再进行相应的解码,再将数据输出到音箱或者耳机。
视传机主要软件Linphone的移植
Linphone有很多个版本,可以通过www.linphone.org免费下载。我们这里使用带视频功能的linphone1.6.0版本,要将这个Linphone使用在开发板上,需要做3个方面的工作:添加H264硬件视频编解码器(使用i.MX27的VPU单元进行视频编解码),修改程序使之与操作系统和其他应用程序进行通信,最后交叉编译Linphone至开发板。
Linphone功能结构
Linphone1.6.0版本的功能结构如图1。
console包括了整个终端界面部分,将界面操作和命令行输入交由下层处理。
coreapi包含Linphone大部分核心接口函数,如读配置文件进行程序初始化、呼叫的建立和结束、对SDP消息的处理等。
osip2是一个短小简洁的sip协议栈,专注于sip底层解析。
exosip是osip2的一个扩展协议集,它部分封装了osip2协议栈,使得它更容易被使用。
mediastreamer模块负责语音及铃音等的处理及传输,视频的编解码(调用ffmpeg的库)、声卡的选择等。
ortp将音视频打包为rtp包发送至指定端口。
speex是一种音频解码库。
添加H264硬件视频编解码器
Linphone1.6.0 本身具有视频编解码功能,默认具有H263 、mpeg4、mjpeg等编解码器,我们要仿照这些编解码器的源码结构添加H264解码器,重要的是将编解码器的软件编解码部分替换成i.MX27的 VPU(视频处理单元)来进行硬件编解码,因为i.MX27的CPU处理速度有限,远及不上PC的CPU,而i.MX27的VPU则是专门进行视频编解码处理的协处理器,在处理视频数据的时候是不需要CPU参与。
代码的添加过程如下:在向Linphone注册编解码器的地方添加H264编解码器,使得Linphone具备H264编解码器的功能选项,注册的内容包括:编解码器id,一些名称文本等标识符,编解码器初始化,视频数据预处理、处理、后处理,编解码器销毁(释放系统资源)等函数链接,编解码器方法(进行基本视频编解码处理之外的操作)等。注册好编解码器后,就是如何真正实现编解码器对视频流的编解码处理了,也就是编解码器的初始化,视频数据预处理、处理、后处理,编解码器销毁等函数的实现。视频处理的软件部分主要包括内核空间的驱动和编解码库以及用户空间的应用程序。内核驱动负责系统控制和系统资源的申请和释放,提供一些IOCTRL接口给用户空间的应用程序使用调配系统硬件资源;用户空间的应用程序调用适当的IOCTRL和编解码库函数来实现复杂的编解码系统。[!--empirenews.page--]
VPU的内核驱动主要包括以下功能:模块初始化、器件初始化、中断服务策略、文件操作策略、器件关闭、编解码库、系统IO操作等。
视频编解码的计算和绝大部分视频流的压缩/解压缩都是由i.MX27的硬件VPU单元来完成的,这样软件就不需要过多的控制或者时间消耗等来实现一个复杂的编解码系统。VPU的硬件数据流可以用一个mpeg4格式数据的解码实现过程展示(见图2)。
硬件编解码速度快、效率高、功耗和热功耗低,节省了CPU的资源,实现了良好画质的传输,这一点充分体现了i.MX27芯片在视频处理方面的优势。
结语
本文基于linphone、ffmpeg、speex、minigui、linux等开源软件实现了嵌入式可视终端软件系统——视传机样机,如图3所示。样机充分使用已有的开源软件成果进行开发,实现语音通话,视频通话,视频监控,媒体文件播放等基本的功能。