基于Linux的流媒体传输

时间:2022-08-26 06:03:02

基于Linux的流媒体传输

摘要:实时传输协议RTP在单点传输的网络服务上,提供端对端的网络传输功能,适合传输音视频、仿真数据。本文主要介绍了基于H.264的,在Linux下的实时传输系统构建的方法和步骤,以及RTP实时传输协议和H.264编码的视频源。

关键词:流媒体;RTP;H.264;Linux

Linux-based streaming media transmission

SI Yong-wei, ZHU Zhong-ming, LIU Yong, ZHU Lin

(College of Information Engineering,Chengdu University of Technology,Chengdu 610059)

Abstract: Real-time Transport Protocol transmission in a single point of network services provides end-to-end network transport functions, suitable for audio/video transmission, and simulation data. This paper introduces the way to build a real-time transmission system and steps based on the H.264 and Linux system, and also introduces the Real-time Transport Protocol and H.264-encoded video sources.

Key word: Streaming Media; RTP; H.264; Linux

1引言

随着现代网络和图像处理技术的发展,人们对视频传输的要求也越来越高,流媒体的出现在很大程度上满足了我们的要求。Internet的迅猛发展和多媒体通信技术的快速进步,在网络上进行视频通讯越来越受到人们的广泛重视,网络通信技术己经成为现代信息社会不可缺少的需求和技术热点。视频通信系统及相关技术的进一步提高和现代社会交流的需要日益增强,使其成为一种全新的通信方式,必定会有更广阔的应用领域和发展前景。

2H.264视频源

H.264是一种高性能的视频编解码技术,它是由国际电联(ITU-T)和国际标准化组织(ISO)联合组建的联合视频组(JVT)共同制定的新数字视频编码标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高级视频编码。H.264具有很多其他编码方法不具有的优势,主要有:1)将每个视频帧分离成由像素组成的块,因此视频帧的编码处理的过程可以达到块的级别。2)采用空间冗余的方法,对视频帧的一些原始块进行空间预测、转换、优化和熵编码。3)对连续帧的不同块采用临时存放的方法,这样,只需对连续帧中有改变的部分进行编码,该算法采用运动预测和运动补偿来完成。对某些特定的块,在一个或多个已经进行了编码的帧执行搜索来决定块的运动向量,并由此在后面的编码和解码中预测主块。4)采用剩余空间冗余技术,对视频帧里的残留块进行编码。

对于传输要用到的H.264编码的视频,可以直接由支持H.264协议的视频产品生成。还可以通过编码转换来获取,就是通过一种编码转换工具来产生H.264视频,可以采用一款免费的视频编码软件MediaCoder进行高质量的转码,图1就是经过编码转换后的视频源,与其他编码技术相比它占用的资源小,而且画面清晰。

3RTP协议

RTP协议是由IETF开发的针对实时数据传输的协议,1996年成为RFC正式文件RFC 1889,是用于VoIP(Voice over Internet Protocol)视频等实时媒体传输的协议。

RTP协议包括两个关系十分密切的子协议:RTP(实时传输协议),用于传输具有实时属性的数据;RTCP(Real-Time Transport Control Protocol(实时传输控制协议),用于监视网络服务质量,传递会话者的信息。RTP/RTCP属于一种应用型的传输层协议,所以它并不提供任何传输可靠性的保证和流量的拥塞控制机制。

3.1RTP

RTP 协议位于UDP 协议之上,在功能上独立于下面的传输层和网络层,但不能单独作为一个层次存在,通常是利用低层的UDP 协议对实时视音频数据进行组播(Multicast)或单播(Unicast),从而实现多点或单点视音频数据的传输,用以提供时序重构、帧遗失检测、数据安全等多种服务。

RTP协议的结构如表1所示.

(1) Version(V)(版本号):域长度为2 bit,标示出了RTP的最近版本,当前的版本为2.0;

(2) Padding(P)(填充位):域长度为1 bit,若置为1,RTP包在结尾处包含有一个或多个附加填充字节,这些填充字节不是有效负荷的一部分;

(3) Extension(X)(扩展位):域长度为1 bit,若置为1,RTP包的头部将附带一个头部扩展;

(4) CSRC count(CC):域长度为4 bit,此数据用来保存CSRC标识符的数目;

(5)标记位Make(M):域长度为1 bit,如果M被置为1,则表示一些重要的项目在包中被标记,如帧边界等;

(6) Payload Type(PT)(有效载荷类型):域长度为7 bit,这个字段指出后面的RTP数据属于何种格式,收到RTP分组的应用层就根据此字段指出的类型进行处理;

(7) Sequence number(序列号):域长度为16 bit,在第一次RTP会话开始的初始序号是随机选择的。每发送一个RTP数据包后,序号就增加一,接收方可以利用它来检验是否有丢包现象,也可以按序号重组包序列;

(8) Time stamp(时间戳):域长度为32 bit,时间戳反映RTP数据包中的第一个字节的数据采集时间,接收方使用时间戳可准确知道应当在什么时候还原哪个数据块,采样时间必须由时钟得来,并且随时间单调线性增加以便进行同步和计算抖动;

(9) SSRC(Synchronization Source)(同步源标识符):域长度为32 bit,用以标识同步源,其初始值应随机指定,目的是使得在同一个RTP会话中所有同步源的SSRC值各不相同;

(10) CSRC(Contributing Source)list(参与源列表):此列表为0~15项,每项32 bit,CSRC列表标识出载荷数据的多个同步源,标识符的个数由CC字段给出,CSRC标识符由混频器插入,内容是参与源的SSRC值。

混频器是RTP在发送方和接收方之间引入的一个功能模块。混频器接收来自一个或多个发送方的RTP组块,并把它们组合成一个新的RTP分组继续转发。混频器的重要应用是在高带宽网络与低带宽网络之间,改变从高带宽网络接收数据的压缩编码,把音/视频流转换成低码流数据发送到低带宽网络。

3.2 RTCP

RTCP是RTP的控制协议,用于监视网络的服务质量,为正在进行的会话传递信息。RTCP采用和数据包相同的传输机制向会话中的所有与会者周期性地发送控制包。RTCP主要有如下功能:

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

(1) 基本功能是提供数据传输质量的反馈。反馈对自适应编码控制直接起作用,反馈功能由RTC发送者和接收者报告执行。

(2) RTCP为每个RTP源传输一个固定的识别符,称为规范名(CNAME)。如果出现冲突或者程序重新启动时,SSRC同步源标识符会改变,所以接收者要求有一个CNAME保持每一个与会者的轨迹。

(3) 控制发送速率。上面的两种功能要求所有的与会者都发送RTCP包。为了将RTP扩展到更多的与会者,发送速率必须受到控制。

(4) 传输最小限度的会话控制信息。这个是可选功能,主要应用于进入或离开没有成员资格控制的“松散控制”会话中,成员可以不经过资格控制和协商而加入或退出会话。

4系统的搭建

4.1 搭建平台

本系统是基于Linux下的,要在Linux平台上进行实时流媒体编程,在这里我们使用开源的RTP库JRTPLIB。它是一个面向对象的RTP库,完全遵循RFC 1889设计,以运行在Windows、Linux、和Unix等多种操作系统上。

如果要为Linux安装JRTPLIB,必须先要从JRTPLIB网站上下载最新版本的源码包,在本系统中用的是jrtplib-3.7.1。将其解压后会出现jrtplib-3.7.1和jthread-1.2.1两个目录,jthread-1.2.1是一个控制线程库。在安装jrtplib之前,需要先安装jthread,jrtplib和jthread的安装方法及步骤如下:

1:进入jthread解压目录,运行./configure配置环境,如果出现permission denied,说明configure文件权限设置问题,运行sudo chmod 777 configure。配置完毕后运行make,接着运行make install。如果有问题则可能是权限问题,改为sudo make install即可。

2:jrtplib的安装和jthread的相同,安装好以后会在/usr/local/include目录下多出两个文件夹jrtplib3和jthread。复制jthread下所有文件到jrtplib3文件夹下,这样做是为了让所有头文件在一个目录下方便的调用。

完成了以上的步骤,静态动态库就安装成功了,其路径为/usr/local/lib。在jrtplib3源代码目录里有五个例子程序,example1.cpp是一个发送数据的程序,执行编译语句:g++ -o 1 example1.cpp -I /usr/local/include/jrtplib3/ -ljrtp ,即可生成可执行程序1,它的make文件都是写好的。图2是可执行程序1的运行过程

5软件描述

在使用JRTPLIB进行实时流媒体数据传输之前,首先要生成RTPSession类的一个实例来表示此次RTP会话,然后调用Create()方法来对其进行初始化操作。RTPSession类的Create()只有一个参数,用来指明此次RTP会话所采用的端口号。

数据发送:当RTP会话成功建立起来之后,接下来就可以开始进行流媒体数据的实时传输了。首先需要设置好数据发送的目标地址,RTP协议允许同一会话存在多个目标地址,通过调用RTPSession类的AddDestination()、DeleteDestination()和ClearDestinations()方法来完成。

数据接收:对于流媒体数据的接收端,首先需要调用PollData()方法来接收发送过来的RTP或者RTCP数据报。由于同一个RTP会话中允许有多个参与者(源),因此既可以通过调用GotoFirstSource()和GotoNextSource()方法来遍历所有的源,也可以通过调用GotoFisstSourceWithDat()和GotoNextSourceWithData()方法来遍历那些携带有数据的源。在从RTP会话中检测出有效的数据源之后,接下去就可以调用RTPSession类的GetNextPacket()方法从中抽取RTP数据包,接下来就可以使用实时播放器实时的播放接收到的流媒体数据。

6小结

本系统实现了点对点的实时流媒体的传输,但是这只是在网络质量比较好的情况下才能顺利传输的。还要考虑到在网络质量差的情况下流媒体的传输问题,进一步将研究实时流协议(RTSP),来进行实时数据发送的速率控制。

参考文献

[1]毕厚杰.新一代视频压缩编码标准H.264/AVC[M].北京:人民邮电出版社,2005.

[2] 卢辉斌,李宏波,李永国.Linux网络中的RTP协议的分析与应用[M].机械工业出版社.

[3] 徐延明,林立志,王罡.Linux编程指南与实例[M] 北京:人民邮电出版社,2000.

[4] 钟玉琢,向哲,沈洪.流媒体和视频服务器[M].清华大学出版社,2003.6

[5] 王祥,黄廷辉.基于RTP协议的实时视频监控系统的实现[J].大众科技.2008

作者简介

司永卫,成都理工大学在读硕士研究生,研究方向为ARM嵌入式系统。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:基于GX1121+GX3001的直播卫星机顶盒整体解决方... 下一篇:应用于无线传感器网络低噪声放大器的设计