基于RTP 协议的嵌入式网络视频传输系统
【文章摘要】
本文对RTP 协议的相关概念和特性进行了简述,给出了在嵌入式系统中通过RTP 协议进行网络视频传输的设计方案。在该方案中,引入了Session 对象用于实现嵌入式系统之间的通信,同时给出了基于RTP 协议的程序流程图及重要伪代码。并在嵌入式Linux 平台上成功实现了基于RTP 协议的网络视频传输系统,该系统具有传输速度快,视频清晰度高等优点。
【关键词】
ARM ;RTP 协议;Linux ;视频传输
0 引言
随着科学技术的发展以及社会的进步,数字化、网络化正在形成一股席卷世界的浪潮。嵌入式网络视频传输系统已经不仅仅局限于数字媒体技术领域,而是成为当前一种重要的媒体工具充斥在社会的各个角落。具有更稳定的可靠性、更高的传输速率以及更加清晰的画面成为当前嵌入式网络视频传输系统所追求的目标。
本文在嵌入式平台上设计并实现了基于RTP 协议的网络视频传输系统。该设计采用了RTP 协议,并且在顺序传输数据包的过程中,可以利用RTCP 协议提供的拥塞控制与流量控制来保障可靠的传输机制。该方案兼顾了系统的稳定性、可靠性、可扩展性以及成本等多种因素。在视频监控、极端环境下的视频传输等领域有着广阔的应用前景。
1 软硬件开发环境
1.1 硬件开发环境
硬件平台采用韩国三星公司的S5PV210 处理器,内核采用ARM Cortex-A8 架构,指令集为ARM v7,运行频率为1GHZ,提供了高达2000DMIPS 的高性能运算能力。同时,该硬件平台板载了一个DM9000 以太网控制芯片,通过这个芯片扩展了一个网络接口,另外还集成了四个USB 接口,用于连接USB 设备。将USB 摄像头连接到其中任意一个USB 接口上,并在程序中定义相应的缓冲区用于存放视频图像数据,然后对数据进行编码并打包成UDP 包发送出去。下图所示是系统的硬件开发环境。
1.2 软件开发环境
软件开发环境选用了为该硬件平台定制的Linux 系统,该系统在内核中添加了USB 摄像头以及网络接口的驱动模块,并预装了Qt/Embedded 系统完成本次设计。同时,在该Linux 平台上移植了JRTPLIB。JRTPLIB 是一种面向对象的RTP 库。本文所做的工作就是完成RTP 部分的程序编写。
2 RTP 协议简析
RTP 中文全名是实时传输协议, 工作于面向无连接或连接的下层协议上,通常与UDP 协议共同使用。其包含了RTP 及RTCP 协议。RTP 协议主要用于对流媒体数据进行封包处理,然后进行实时传输。其功能是提供数据类型和编码方式、时间戳、序列号和同步源标识,接收端根据这些信息就可以将原始信息正确的还原出来。RTCP 协议用来传输实时信号的质量参数,它需要与RTP 数据协议配合使用, 并提供了QoS 监控机制。在顺序传输数据包的过程中,可以利用RTCP 提供的拥塞控制与流量控制提供可靠的传输机制。这样,就不会因为丢失数据包进行超时检测而带来延迟。同时,可以由上层根据这些数据包的重要性来判断是否对丢失的数据包进行重传。在客户端方面,虽然有时会造成画面模糊,清晰度降低,但却保证了用户体验和实时性的要求。
3 网络视频传输设计与实现
3.1 RTP 程序设计流程图( 图2)
3.2 RTP 程序的实现
3.2.1 初始化会话
在TCP/IP 协议中,使用Socket 套接字来完成系统之间的通信,而RTP 协议则需要用Session 对象来实现相应的功能。首先,应对本次RTP 会话进行表示,这就需要生成RTPSession 类的一个实例并通过调用Create() 方法对该实例进行初始化, 然后再使用JRTPLIB 实时传输流媒体数据。这里需要指明本次RTP 会话的端口号以及初始化参数,即提供给客户服务端口号的数据结构和会话参数的数据结构。下面给出的程序框架用于对RTP 会话进行初始化,并不具有任何实质的功能。
设定时间戳参数:
sessionparams.SetOwnTimestampUn it(1/90000);
设定参数为true,用于流媒体数据的接收:
sessionparams.
SetAcceptOwnPackets(true);
对传输数据包的最大字节数进行设置:
sessionparams.
SetMaximumPacketSize(8000);
设定端口参数:
transparams.SetPortbase(8800);
对会话进行Create 操作:
status = session.Create(sessionparams,& transparams);
3.2.2 设定发送的参数和数据
在RTP 会话执行完Create 操作之后就可以进行流媒体数据的实时传输了。因为RTP 协议中规定了可以有多个目标IP 地址存在于同一个RTP 会话中,所以需通过调用RTPSession 类中DeleteDestination(),AddDestination() 和ClearDestinations() 方法来设置数据包发送的目标IP 地址。如下的程序片段完成的功能是在本机的8000 端口上接收RTP 会话发来的数据包:
对客户端IP 地址进行设置:
unsigned long clientip = ntohl(inet_addr( "192.168.0.1" ));
添加客户端IP 地址和端口号到发送列表:
RTPIPv4Address addr (clientip, 8000);
对RTPv4Address 中的对象addr 进行声明,然后对目标地址进行设定:
status = session.AddDestination(addr);
在全部的目标 IP 地址都被指定之
图 1 硬件开发环境
后,就能发送流媒体数据了,一般通过调用RTPSession 类的SendPacket() 方法来实现。SendPacket() 具有多种形式,是一个由RTPSession 类提供的重载函数,如下所示的程序语句是其最典型的用法,其中包含五个参数,第一个是待发送的数据,第二个是待发送数据的长度,接下来的参数分别是负载类型、标识和时戳增量。
sess.SendPacket(buffer,5,0,false,10);
通常来讲,在同一个RTP 会话中括号后面的这三个参数都是相同的。通过调用如下所示的 RTPSession 类中的一些方法, 可以把它们设定为整个会话过程中的默认参数。这样能够使数据的发送过程大大简化。
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncreme nt(10);
这样,再发送数据时只需要指明数据的前两个参数即可:
sess.SendPacket(buffer,5);
3.2.3 数据包的接收
首先,需要在数据的接收端接收RTP 或RTCP 数据报,可以通过调用RTPSession 类的PollData() 方法来实现。因为可以有多个源存在于同一个RTP 会话中,所以可以通过调用RTPSession 类中的一些方法来遍历所有的源或者仅遍历携带有数据的源。接着,在RTP 会话过程中还需要对有效的RTP 数据报进行抽取,可以通过调用RTPSession 类的GetNextPacket() 方法来实现。最后,在处理好RTP 数据报之后,还要及时进行释放。如下的程序段是对该过程的描述:
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
pack = sess.GetNextPacket();
delete pack;
}
while (sess.GotoNextSourceWithData());
}
3.2.4 控制信息
在使用JRTPLIB 时不需要了解数据的发送与接收过程,只要保证SendPacket() 或PollData() 方法其中之一被成功调用, RTCP 数据报就能被JRTPLIB 自动处理, 并且为了保障整个RTP 会话过程中的正确性,它还会在适当的时候发送RTCP 数据报。除此之外,JRTPLIB 允许通过RTPSession 类中的方法设定RTP 会话中的控制信息。在调用所有的这些方法时都需要两个重要的参数,一个是将要发送的数据,其类型为char 型指针,另外一个是数据中要被使用的字符数,其类型为int 型数值。下列语句是对控制信息中的E-mail Address 进行设置:
s e s s . S e t L o c a l E M a i l ( " 6 8 8 3 1 6 0 @ qq.com",20);
一般只需要对RTP 会话过程中的部分控制信息进行发送。这里可以通过调用RTPSession 类提供的EnableSendName()、EnableSendEMail() 等方法,选择需要发送的控制信息。
4 结语与展望
本文简述了RTP 协议的基本内容,给出了Linux 下进行RTP 通信的流程图,对Linux 下RTP 通信的编程方式进行了详细的描述,并给出了部分重要的核心代码。
本设计采用了USB 摄像头进行图像的采集工作,在后续的开发过程中,我们可以选用更具有应用前景的GigE 工业相机。这样,我们就可以将其大规模的应用于工业、学校、银行等全天候监控系统中, 使其具有更加广阔的应用前景。
【参考文献】
[1] 金美光, 何伟宾, 王鹏杰等. 基于流媒体RTP/RTCP 协议的视频数据传输[J]. 电子技术,2010,37(11):57-59.
[2] 陈小平, 王皖陵.Linux 下实时流媒体的编程实现[J]. 安徽工业大学学报: 自然科学版, 2005, 22(3): 293-297.
[3] 杨英洁. 流媒体编程[J]. 计算机应用与软件,2007,24(9):213-214.
[4] 毛韵楠. 基于DSP 的视频流媒体嵌入式web 服务器[J]. 科协论坛: 下半月,2008 (1): 5-5.
[5] 李慧彬. 基于QoS 组播的RTP 协议的研究与实现[D]. 中北大学,2007.
[6] 王宪, 刘井权, 戴旻. 基于ARM 平台的远程视频监控系统的研究[J]. 微计算机信息,2007 (01Z): 178-180.
[7] 欧阳普勇. 基于Linux 平台下实时流媒体传输在远程教育系统中的应用[J]. 科技广场, 2008 (12): 144-146.
[8] 鹿宝生, 陈启美. 基于嵌入式网络视频服务器的远程监控系统[J]. 武汉理工大学学报: 信息与管理工程版,2006, 28(5): 9-11.
[9] 王文亮.P2P 多媒体群组通信平台多媒体技术的研究与实现[D]. 西安电子科技大学, 2009.
[10] 徐光远. 基于liunx 平台的视频数据传输优化及性能分析[D]. 华中科技大学,2006.
[11]Corbet J,Rubini A, Kroah-Hartman G. Linux Device Drivers,Third Edition[M]. 北京:中国电力出版社 O'REILLY 2006.1.
本站论文资源均为来自网络转载,免费提供给广大作者参考,不进行任何赢利,如有版权问题,请联系管理员删除! 快速论文发表网(www.ksfbw.com)本中心和国内数百家期刊杂志社有良好的合作关系,可以帮客户代发论文投稿.
投稿邮箱:ksfbw@126.com
客服Q Q:
82702382
联系电话:15295038833
本站论文资源均为来自网络转载,免费提供给广大作者参考,不进行任何赢利,如有版权问题,请联系管理员删除!
文章评论
共有 0 位网友发表了评论