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于浙江杭州
LIVE555研究之三:LIVE555基础的更多相关文章
- Live555研究之三 RTSP Server处理请求
RTSP Server会不断用select查询是否有socket连接,如果有则在(*handler->handlerProc)(handler->clientData, resultCon ...
- Live555研究之中的一个 源码编译
Live555研究之中的一个 源代码编译 Live555 是一个为流媒体提供解决方式的跨平台的C++开源项目,它 ...
- LIVE555研究之五:RTPServer(二)
port是一样的. DynamicRTSPServer 继承关系: Medium是非常多类的基类.内部定义了指向环境类的引用和一个char类型媒体名称.并定义了依照媒体名称,查找相应媒体的成员函数lo ...
- 【流媒體】live555—VS2008 下live555编译、使用及测试
[流媒體]live555—VS22008 下live555编译.使用及测试 Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如R ...
- 【视频开发】【Live555】通过live555实现H264 RTSP直播
前面的文章中介绍了<H264视频通过RTMP流直播>,下面将介绍一下如何将H264实时视频通过RTSP直播. 实现思路是将视频流发送给live555, 由live555来实现H264数据流 ...
- kubebuilder实战之三:基础知识速览
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Live555研究之二Sleep实现
Live555通过一个while循环来不断读取socket,判断是否有连接进来,但是Live555并没有使用Sleep函数来让线程休眠多少毫秒来降低CPU占用率.Live555是通过select函数来 ...
- Live555研究之一 源代码编译
Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化 ...
- 【流媒體】live555—VS2010 下live555编译、使用及测试
Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...
随机推荐
- No Pain No Game
hdu4630:http://acm.hdu.edu.cn/showproblem.php?pid=4630 题意:给定一个排序,求区间最大GCD. 题解:离散树状数组.首先把查询按左端点从大到小排序 ...
- yiic 数据库迁移工具
数据库的结构也同源代码一样随着我们开发的进行而不断的发生着改变.在开发过程中,一般的我们需要像管理我们的源代码一样记录下数据库结构的整个变化过程,以便代码还原到指定版本后,数据库能同步的还原到指定的版 ...
- 【原创】MIPS·Verilog·FPGA
时至今日,终于将全部的计划55条MIPS指令在FPGA上全部验证完毕,通过这近一个月的不断的修改调试.修改调试,我对整个流程对MIPS有了深刻的体会和认识.借着刚刚现阶段任务的兴奋和短暂的空闲时间,将 ...
- [hadoop源代码解读] 【SequenceFile】
SequeceFile是Hadoop API提供的一种二进制文件支持.这种二进制文件直接将<key, value>对序列化到文件中.一般对小文件可以使用这种文件合并,即将文件名作为key, ...
- JS頁面值傳遞
<script type="text/javascript"> function GetValue() { var url=location.search; var R ...
- POJ_3185_The_Water_Bowls_(反转)
描述 http://poj.org/problem?id=3185 20个碗,要全部反转过来.反转某个碗,其相邻的碗(左右两边)也要反转. The Water Bowls Time Limit: 10 ...
- XmlNode中Value和InnerText的区别
XmlNode中Value和InnerText的区别 这个问题我想很多人在使用.NET 操作 Xml 文档时都遇到过,先看一下MSDN里对这两个属性的解释: XmlNode.Value:获取或设置 ...
- 一步步写STM32 OS【四】OS基本框架
一.上篇回顾 上一篇文章中,我们完成了两个任务使用PendSV实现了互相切换的功能,下面我们接着其思路往下做.这次我们完成OS基本框架,即实现一个非抢占式(已经调度的进程执行完成,然后根据优先级调度等 ...
- LightOJ 1074 Extended Traffic SPFA 消负环
分析:一看就是求最短路,然后用dij,果断错了一发,发现是3次方,有可能会出现负环 然后用spfa判负环,然后标记负环所有可达的点,被标记的点答案都是“?” #include<cstdio> ...
- BOM(浏览器对象模型)的一些内置对象总结
1.window对象 BOM的核心对象是window,它表示浏览器的一个实例,它也是ECMAScript规定的Globle对象,也就是说网页中任何一个对象都是在window这个对象里面的.如果有用到框 ...