LIVE555研究之三:LIVE555基础

LIVE555基础

LIVE555是为流媒体提供解决方式的跨平台C++开源项目。从今天起我们将正式開始深入LIVE555代码。

一、各库简要介绍

LIVE555下包括LiveMedia、UsageEnvironment、BasicUsageEnvironment、GroupSock库,MediaServer简单server程序以及其它多个測试demo。

    LiveMedia库:包括一系列处理不同编码格式和封装格式的类。基类是Medium。

    UsageEnvironment库:环境类,用于错误信息的输出。

LIVE555中多数类中均包括此类对象指针。其内部包括TaskSchedule抽象类的指针,该类用于任务调度。因此全部包括UsageEnvironment指针的类均可将自己增加到调度中。

    BasicUsageEnvironment库:包括详细环境类和详细TaskScheduler类。

UsageEnvironment用于对错误信息的处理。BasicUsageEnvironment类用于以控制台方式输出错误信息。因此想要以其它方式输出错误信息的类。能够从UsageEnvironment派生。BasicTaskSchedule类继承自TaskScheduler抽象类。用以定义详细的调度策略。

不论什么基于LIVE555的应用程序均须要定义自己的BasicEnvironment和TaskScheduler库。假设创建窗体应用程序,在重定义TaskScheduler时。须要与图形环境自己的事件处理框架集成。

BasicTaskSheduler使用select模型实现事件的获取和处理。

假设想使用更高效的IOCP模型,能够定义自己的BasicTaskScheduler类。BasicTaskScheduler内部有一个循环,循环读取队列中的消息并处理。整个基于BasicTaskScheduler的程序唯独一个线程驱动。

    GroupSock库:对各种socket操作的封装,用于收发数据。主要面向组播。但也能够进行单播的收发数据。仅支持UDP。不支持TCP。

    MediaServer server程序:该程序使用BasicUsageEnvironment库实现,因此是一个控制台程序。

任务调度类是BasicTaskScheduler类,因此使用Select模型且仅有一个线程在循环处理各种事件。

后期假设有时间会实现基于IOCP的MediaServerserver程序。

    其它測试Demo:基于LIVE555实现的client程序,会在须要的时候介绍。

二、涉及到的基本概念

1.  Souce、Sink

Souce :翻译为源、源头。表示数据的提供者,比方通过RTP读取数据,通过文件读取数据或者从内存读取数据,这些均能够作为Souce。

Sink:翻译为水槽。表示数据的流向、消费者。

比方写文件、显示到屏幕等。

Filter:翻译为过滤器。

在数据流从Souce流到Sink的过程中能够设置Filter,用于过滤或做进一步加工。

在整个LiveMedia中,数据都是从Souce,经过一个或多个Filter。终于流向Sink。在server中数据流是从文件或设备流向网络,而在client数据流是从网络流向文件或屏幕。

MediaSouce是全部Souce的基类,MediaSink是全部Sink的基类。

从类数量和代码规模能够看到。LiveMedia类是整个LIVE555的核心,其内部包括数十个操作详细编码和封装格式的类。LiveMedia定义的各种Souce均是从文件读取,假设想实现从设备获得实时流的传输,能够定义自己的Souce。

2.  ClientSession

对于每一个连接到server的client。server会为其创建一个ClientSession对象,保存该client的socket、ip地址等。

同一时候在该client中定义了各种响应函数用以处理和回应client的各种请求。

新版(2014.7.4)的LIVE555增加了ClientConnection类。用于处理一些与正常播放无关的命令。如命令未找到、命令不支持或媒体文件未找到等。在ClientConnection处理DESCRIBE命令时会创建ClientSession对象。其它命令在ClientSession中处理。

3.  MediaSession、MediaSubsession、Track

LIVE555使用MediaSession管理一个包括音视频的媒体文件。每一个MediaSession使用文件名称唯一标识。

使用SubSession管理MediaSession中的一个音频流或视频流。

为行文方便我们称音频或视频均为一个媒体文件里的媒体流。

因此一个MediaSession能够有多个MediaSubsession。一个管理音频流一个管理视频流。

在上一篇介绍RTSP协议时。client在给server发送DESCRIBE查询某个文件的SDP信息时,server会给client返回该媒体文件所包括的多个媒体流信息。

并为每一个媒体流分配一个TrackID。

如视频流分配为Track1,音频流分配为Track2。

此后client必须在URL指定要为那个Track发送SETUP命令。

因此我们能够觉得MediaSubsession代表Server端媒体文件的一个Track,也即相应一个媒体流。

MediaSession代表Server端一个媒体文件。

对于既包括音频又包括视频的媒体文件,MediaSession内包括两个MediaSubsession。

但MediaSession和MediaSubsession仅代表静态信息。若多个client请求同一个文件,server仅会创建一个MediaSession。各个client公用。为了区分各个MediaSession的状态又定义了StreamState类,用来管理每一个媒体流的状态。在MediaSubsession中完毕了Souce和Sink连接。Souce对指针象会被设置进sink。在Sink须要数据时,能够通过调用Souce的GetNextFrame来获得。

LIVE555中大量使用简单工厂模式,每一个子类均有一个CreateNew静态成员。该子类的构造函数被设置为Protected,因此在外部不能直接通过new来构造。同一时候。每一个类的构造函数的參数中均有一个指向UsageEnvironment的指针,从而能够输出错误信息和将自己增加调度。

4. HashTable

LIVE555内部实现了一个简单哈希表类BasicHashTable。在LIVE555中。有非常多地方须要用到该哈希表类。如:媒体文件名称与MediaSession的映射,SessionID与ClientSession的映射,UserName和Password的映射等。

5. SDP

SDP是Session Description Protocol的缩写。是一个用来描写叙述多媒体会话的应用层协议。它是基于文本的,用于会话建立过程中的媒体类型和编码方案的协商等。

client会通过DESCRIBE命令请求查询指定文件的媒体信息。有不明确的能够看下上一篇介绍RTSP、RTP、RTCP的文章。

6.  LIVE555中的关键类继承层次(均以对H264码流的处理为例)

大家能够先混个脸熟。以后会详细介绍。

Souce

H264VideoStreamFramer是真正的Souce,它用于从h264文件里读取数据,并组装成帧。在Sink调用GetNextFrame时将帧数据返回给Sink。

Sink

H264VideoRTPSink是真正的Sink,用于完毕帧数据的发送。

SubSession

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRoemhhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

SubSession用于完毕Souce和Sink的连接,同一时候用于管理每一个媒体流。

对于H264码流。数据流的流动方向为:

server端:H264VideoStreamFramer ->H264Or5Fragmenter (Filter)r->H264VideoRTPSink

client:H264RTPSouce ->Sink(不同client实现不同)

LIVE555类之间关系非常是复杂。类之间犬牙交错的关系增大了学习LIVE555的难度,深入学习之前应先熟悉基本流程,对各类的大概功能有所了解,至于细节问题可临时略过。

对于LIVE555的代码风格,本人不是非常喜欢:一是成员变量命名方式。二是花括号({)紧跟在上一行的末尾。没有上下对齐层次清晰。

三是多句代码位于同一行,多见于if语句。当然这不过是个人喜好。欢迎大家表达自己的见解。

文章的最后。让我们来探讨下LIVE555应该怎样发音的问题。听过不少人都读成: [liv](力V555)。个人感觉不正确。由于live作为动词讲时。确实是读成:力V,但此时是居住、生存、经历的意思。作为形容词讲时是活的、直播、生动的。此时应读成:赖V。作为一个为流媒体提供解决方式的开源C++项目,应该离直播更近一些吧!

个人觉得应该读成赖V555。更洋气的读法:赖V Triple Five!

这都是个人想当然的读法。没有听过老外怎样读。欢迎拍砖!

下节我们将从server程序入手。開始介绍LIVE555源代码。

2014.8.16于浙江杭州

时间: 2024-10-20 13:50:57

LIVE555研究之三:LIVE555基础的相关文章

LIVE555研究之三LIVE555基础

LIVE555基础 LIVE555是为流媒体提供解决方案的跨平台C++开源项目.从今天起我们将正式开始深入LIVE555代码. 一.各库简要介绍 LIVE555下包含LiveMedia.UsageEnvironment.BasicUsageEnvironment.GroupSock库,MediaServer简单服务器程序以及其他多个测试demo.     LiveMedia库:包含一系列处理不同编码格式和封装格式的类,基类是Medium.     UsageEnvironment库:环境类,用于

多维化计算机系统的研究与设计——基础原理(二)

 多维化计算机系统的研究与设计--基础原理(二) 一.  多维化系统在数据加密领域中的应用 在详细描述多维化计算机的概念之前,让我们先分享几个应用实例,以具体的应用描述为基础,可以更好的理解多维化的优势所在. 1.1.      一种无法被暴力破解的加密方式 在传统的计算机数据加密领域,并不存在一种绝对安全的加密算法,任何的加密算法都无法杜绝暴力破解的可能性,唯一的区别仅在于所需要的时间成本的大小. 但是在多维化的计算机系统中,这种情况得到了根本性的改善.从高维度加密的低纬度数据,是无法以传

【流媒體】live555—VS2008 下live555编译、使用及测试(一)

[流媒體]live555—VS22008 下live555编译.使用及测试 Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化.接收和处理等支持,包括MPEG.H.263+.DV.JPEG视频和多种音频编码.同时由于良好的设计,Live555非常容易扩展对其他格式的支持.目前,Live555已经被用于多款播放器的流媒体播放功

LIVE555研究之五:RTPServer(二)

接上文,main函数的几行代码创建了RTSPServer类的子类DynamicRTSPServer对象.RTPServer类是服务器类的基类,DynamicRTSPServer代表具体的服务器子类.我们今天介绍的服务器程序就是基于该类实现的. 在创建DynamicRTSPServer时传入了值为554的端口号.这是因为RTSP默认端口号为554,与http默认使用80端口是一样的. DynamicRTSPServer 继承关系: Medium是很多类的基类.内部定义了指向环境类的引用和一个cha

Live555研究之一 源代码编译

Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化.接收和处理等支持,包括MPEG.H.263+.DV.JPEG视频和多种音频编码.同时由于良好的设计,Live555非常容易扩展对其他格式的支持.目前,Live555已经被用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan).MPlayer. 从今天开始我们将一起学习live555源码

深入研究iptables防火墙基础

防伪码:没有比脚更长的路,没有比人更高的山 第十章 iptables防火墙(一) 前言:我们在以前学习过asa防火墙,对防火墙有一定的了解,那么iptables和asa防火墙类似,作用一样,都是为了保证网络安全,系统安全,服务器的安全,和asa一样也需要建立策略,个人觉得比asa的策略要繁琐一点,但"只要功夫深铁杵磨成针". 一.基础概念 1.iptables表.链结构 a.规则表 表的作用:容纳各种规则链 表的划分依据:防火墙规则的作用相似 默认包括4个规则表 raw表:确定是否对该

Jsp之三 servlet基础

Servlet带给开发人员最大的好处是它可以处理客户端传来的http请求,并返回一个响应.Servlet是一个java类,java语言能够实现的功能,servlet基本上都可以实现. ?       可移植性 因为servlet是由java开发并符合规定定义和广泛接受的API他可以再不同操作系统和不同的应用服务器平台下移植. ?       集成 Servlet和服务器紧密集成,他们可以密切合作完成特东的任务. ?       模块化 每一个servlet可以完成一个特定任务,并且可以将他们并在

多维化计算机系统的研究与设计——基础原理(一)

 一. 前言及背景概述 原本这只是一个因个人兴趣而逐步发展起来的毕业设计中的内容,但是经过多年来不懈的发展与探索,这个概念性质的设计已经逐步延伸到了包括:硬件芯片设计.空间数学方程.软件架构变革等一系列的内容,甚至在探讨智能计算机实现的时候还牵扯到了哲学概念.生物.物理.化学等诸多领域,形成和发明的专利已达十多项. 然而随着基础理论研究的逐步深入,个人的能力已经无法掌控如此规模庞大的研究课题.也曾尝试过组建团队或直接找企业进行合作,但是研究的进度却始终难以达到预期.因此,方决定将此技术整理成几

嵌入式:电路设计之三极管基础电路设计

在嵌入式电路中经常使用IO口来控制某些电路的开关功能,此时可把三极管用作开关器件.在使用时需要利用开关三极管如9014和9015等小功率器件,此时的三极管处于饱和状态.本文用实例来说明该类电路的特点. 该仿真电路图不是很完整,该电路为晶振关闭功能电路,其中VO接MCU晶振输入端如(XIN). 若Q1和Q3基极同时为低时,Q2导通而使得VO为0造成晶振停振关闭处理器.我们分析R3和R4(实际电路470K)使得Q2和Q3处于饱和态:Q3为Q1集电极负载,调整R5阻值时可控制Q1处于饱和态或放大态.要