Linux下视频流多播速率控制方法的设计与实现

时间:2022-08-23 09:48:26

Linux下视频流多播速率控制方法的设计与实现

摘要:针对目前流媒体中视频数据发送速度难以控制的问题,以当前广泛使用的MPEG2视频解码模型为例,设计并实现了一种linux视频多播速率控制方法。这种方法能够有效的控制服务器视频数据的发送速率,具有占用服务器资源少,适应各种网络要求的优点。经Linux平台验证结果表明,传送视频数据的网络速度平稳,未出现视频数据溢出现象,可以得到良好的视频效果,具有很好的实用价值。

关键词:视频流;多播;速率控制;解码器

中图分类号:TP37文献标识码:A文章编号:1009-3044(2008)08-10ppp-0c

1 引言

随着网络、通信等技术的发展,流媒体技术在很多领域都得到了广泛的应用,例如VOD、电视会议、远程教育等,而流媒体技术的关键技术之一就是流媒体的网络传输技术。一般来说,网络传输方式包括单播、多播和广播。与网络单播和广播技术相比,组播是一种优化使用带宽的路由技术,允许数据流从一个源或多个源发送到多个目的地。采用组播技术后,应用仅发送每个数据包的一个拷贝给一组要接受信息的计算机,因而组播有助于控制网络的流量,减少主机的处理量[1]。正是因为组播具有单播、广播所不具有的优点,而流媒体又有流量大、实时性强的特点,所以组播技术在流媒体技术中得到了广泛的应用。

从当今市场上来看,主流的流媒体技术产品有三种,分别是Microsoft的Windows Media Techology系统、Real Networks公司的Real System系统以及Apple的Quicktime系统[2]。尽管它们有些产品也具备了组播的功能,但是它们有一个缺点就是必须满足它们自己的视频压缩格式,才能进行流媒体传送。而本文的目的是只需有视频的解码器,就可以开发出适合自身需要的流媒体系统,这样就可以满足不同视频压缩格式文件网络传输的需要。

如果视频发送速率没有得到有效的控制,当发送速率高于正常发送速率时,将会出现如图1所示的情况,出现许多的马赛克;当发送速率低于正常发送速率时,解码器将会因为不能及时的解码器而出现画面暂停的现象。目前,视频组播速率控制研究主要基于三种速率控制手段,即基于发送端的速率控制、基于接收端的速率控制和混合性速率控制的方法。发送端的速率控制方法主要基于反馈信息进行速率调节,可以适用于单播的方式或组播的方式。在基于接受端的速率控制中,发送方不参与速率控制,而由接受方通过增加和减少通道的数量来进行速率的调整。通常,这种方法用于采用可扩展编码的组播的情况,组播的视频流分为多层,每个层对应组播树的一个通道。混合性速率控制的方法,兼有二者的特点,即接受方增加减少通道,而发送方同时根据反馈调整各个通道的速率[3]。

本文设计实现了一种Linux下视频流多播速率控制方法。这种方法属于发送端的速率控制方法,基于实时解码情况,得到反馈信息,从而实现视频组播发送速率控制。这种方法以视频解码模型为基础,以MPEG2为例,测试环境为局域网。在此基础上,采用类比的方法,MPEG2压缩格式可以推广到MPEG4、H.263和H.264等视频压缩格式;同理,局域网环境也可以推广到校园网、企业网等网络环境。

图1 原图与发送速率高于正常发送速率的视频对比图

2 发送速率控制方法

如图2所示,为一个局域网环境的连接图。本方法由发送端来进行数据发送速率的控制,由服务器来完成。客户端可以用视频组播接收软件如VLC、mplayer接收并播放,也可以自己编写一个解码器来进行网络接收和视频的播放。这种方法包含两部分内容,分别是负责网络组播的视频组播发送程序,另一部分是负责网络组播接收、视频解码、发送速率控制以及发送握手信息等功能。视频组播发送程序运行服务器上,但用于速率控制的解码程序可以放在局域网环境的任意一台服务器或者PC上。

图2 局域网连接示意图

下面介绍一下这两部分程序的工作原理及如何进行协同工作。整个方法的执行过程为:

(1)视频组播发送程序首先读取需要发送的一组视频文件数据;

(2)视频组播发送程序然后将这部分视频数据组播至解码程序;

(3)解码程序在接收到视频组播发送程序发送过来的组播数据之后进行解码;

(4)解码程序解码完之后,如果:

①未解完一帧数据,则继续,跳至5)继续执行;

②解完一帧数据,判断是否继续执行,判断的依据为:

(当前时间 - 上次显示的时间) >= (1000000/帧率)… (依据1)

当满足依据1的时候,则跳至(5)继续执行,否则:

while((当前时间 - 上次显示的时间) < 1000000/帧率)

{

执行空指令;

读取当前时间;

}

注:上述的时间的单位均为微秒,执行空指令的作用为延时作用。

(5) 解码程序将一个握手信息通过TCP连接发送至视频组播发送程序;

(6) 视频组播发送程序在接收到握手信息之后,如果未至视频文件尾,则继续读取一组视频数据,然后跳至(2)继续执行,直至读取视频文件结束。

3 发送速率控制方法的实现

在上述讲到,服务器程序由两部分程序组成:视频组播发送程序和MPEG2解码程序。下面分别详细介绍这两部分程序的运行步骤和内容。本方法开发的环境为linux,采用gcc进行编译,网络连接图如图2所示。

3.1 视频组播发送程序实现

下面介绍一下视频组播发送程序的实现步骤:

(1)定义组播地址及端口号,定义发送缓冲区的容量为4KB(因为上述的解码器每次处理4KB的数据),定义一个TCP连接用的端口号以及网络的其它一些参数;

(2)建立一个基于UDP连接的组播用的套结字,绑定好相应的端口号;

(3)建立一个基于TCP连接的套结字,用于和解码程序进行通信,然后进行端口绑定、连接以及监听;

(4)读取文件的4KB数据,通过UDP组播发送至解码程序;

(5)等待解码程序发送回来的握手信息(如hello信息),如果收到握手信息,重复(4)操作,否则一直等待解码程序发送过来的握手信息(如hello信息);

(6) 直至文件结束,发送完数据为止。

3.2 解码程序实现

解码程序的实现是以开源软件libmpeg2(/) 为原型,添加了网络组播接收、发送速率控制以及发送握手信息功能。后面列出具体的函数名称为libmpeg2开源软件中的函数名称。下面介绍一下解码程序具体实现的程序流程:

(1)处理程序的输入参数,调用handle_args()函数;

(2)初始化解码器参数,给部分参数分配内存,调用mpeg2_init()和mpeg2_malloc_hooks()函数;

(3)判断视频的封装形式:

1)如果是pva文件封装格式,则调用pva_loop()函数;

2)如果是TS视频流(一般是卫星电视传送采取的格式),则调用ts_loop ()函数;

3)如果是PS视频流(一般是DVD等所采取的格式),则调用ps_loop ()函数;

4)如果是ES纯视频流,则调用es_loop ()函数。

(4)解码完毕,释放分配的内存空间。

这里,MPEG2的封装形式采用PS视频流,因为这种封装形式应用非常广泛,例如VCD中的dat文件,DVD中的vob文件,都是采用PS视频流结构。下面详细介绍一下PS视频流的处理过程及其步骤。

(1)定义组播地址及端口号,定义接收缓冲区的容量为4KB(因为解码器每次处理4KB的数据,当然这个数据可调),定义一个TCP连接用的端口号以及网络的其它一些参数;

(2)建立一个基于UDP连接的组播用的数据报套结字,绑定好相应的端口号;

(3)加入多播组;

(4)建立一个基于TCP连接的流式套结字,用于和视频组播发送程序进行通信,然后进行端口绑定、连接以及监听;

(5)监听组播发送程序端口;

(6)等待视频组播发送程序发过来的多播数据,如果有多播数据到达,则读取组播发来的视频流数据,否则,继续等待;

(7)调用解视频流封装函数demux( )。demux( )函数主要内容为:

如果4K数据中包含视频流数据,则调用mpeg2解码器来对数据进行解码,调用decode_mpeg2()函数。

(8)是否到文件结尾,如果是则结束,否则跳至(6)执行。

最后,介绍一下decode_mpeg2( )函数的运行步骤:

(1)分配内存空间给解码器用,调用mpeg2_buffer( )函数;

(2)获取视频的头信息,调用mpeg2_info( )函数;

(3)分析视频流数据,获取现在的状态信息:

1)如果是序列头(sequence)信息,则执行case STATE_SEQUENCE部分的内容;

2)如果是图像头信息,则执行case STATE_PICTURE部分的内容;

3)如果是slice信息,或者序列结束,或者无效的结尾标志,判断是否解完一帧:

①如果未解完一帧数据,则跳出decode_mpeg2( )函数,继续执行;

②如果解完一帧数据,则判断是否继续执行,判断继续执行的依据如依据1所述。如果满足依据1则跳出decode_mpeg2( )函数,继续执行,否则一直等待直至满足依据1这个条件。

③如果不是参考帧,在显示完后将解码后的视频数据丢弃,否则不能丢弃,用来作为参考帧的数据。

4 结果分析

测试结构如图2所示,测试环境为linux,编译和调试工具分别为gcc和gdb。经多次反复测试发现本程序不仅可以针对CIF、D1大小的图像进行组播,还可以对高清节目(测试分辨率为1920* 1080i)进行组播,用户接收效果良好,经多次测试,未出现任何跳帧、数据溢出的现象。下面只列出其中一组分别为CIF、D1和高清节目进行组播时的网络接收速度的状况图,如图3、4、5所示。图中横坐标为时间,纵坐标为客户端的网络接收速率。

图3 CIF大小

图4 D1大小

图5 高清分辨率(1920* 1080i)大小

由于视频组播发送程序和MPEG2解码程序之间采取的是可靠的TCP连接,因此,除了极少数出现的网络丢包情况外,端到端的丢包情况不存在,此外,也不存在缓冲区丢包的情况。

5 结论

本文设计并实现了一种Linux下视频流多播速率控制方法。在linux环境下,用gcc进行了编译,得以成功的实现。测试结果发现该方法不仅可以针对高清节目及以下任意分辨率的视频进行组播发送,而且通过MEPG2的例子,还可以将这种方法扩充至对MPEG4、H.263、H.264等国际化标准的视频压缩格式的支持,具有良好的实用价值。

参考文献:

[1]汪凡.组播技术概述[J].中国金融电脑,2001,(3):92-93.

[2]王萍,赵明,等.流式媒体中的关键技术[J].安徽大学学报,2006,(1):31.

[3]杨明川,解冲峰.Internet视频传输中的关键技术分析[EB/OL].www.chinatelecom. ,2002-12-27.

[4]Floyd S,Handley M,Padhye J,et al.Equation-Based Congestion Control for Unicast Applications[J].The Extended Version,2000,(2):147-163.

[5]李飞,杨林军,王新,等.基于端系统的视频流组播速率控制方法[J].计算机应用与软件,2007,24(6):49-52.

上一篇:凸透镜数字模型设计 下一篇:基于MATLAB的自动控制原理实验教学软件的研制