Live555编译实现过程
来源:互联网 发布:17173魔兽世界数据库 编辑:程序博客网 时间:2024/05/23 21:50
简介:
Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议和RTP/RTCP、RTSP、SIP等的支持。Live555实现了对多重音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多重音频编码。同时由于良好的设计,Live555非常容易扩展对其他格式的支持。目前,Live555已经被用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan)、MPlayer。
Live555 Streaming Media is a set of open source(LGPL) C++ libraries for multimedia streaming. The libraries support open standards such as RTP/RTCP and RTSP for streaming, and can also manage video formats such as H.264, MPEG, VP8, and DV, and audio formats such as MPEG, AMR, AC-3 and Vorbis. It is designed in such a way that it can be easily extended to support more formats.
Its RTSP/RTP/RTCP client implementation is used by VLC media player and MPlayer.
Live555 Streaming Media 整体框架
UsageEnvironment模块是对系统环境的抽象,包括抽象类UsageEnvironment和TaskScheduler。
UsageEnvironment主要用于消息的输入输出和用户交互功能;
TaskScheduler实现事件的异步处理、事件函数的注册等,它通过维护一个异步读取源实现对诸如通信消息到达等事件的处理,通过使用DelayQueue实现对其他注册函数延时调度。该模块还包含一个HashTable类,在整个项目中都可以用到它。程序设计者通过自定义该抽象了类UsageEnvironment和TaskScheduler类的子类,就可以在特定环境(如GUI环境)中运行,不需要进行过多的修改。
BasicUsageEnvironment模块是UsageEnvironment的一个控制台应用的实现。它针对控制台的输入输出和信号响应进行具体实现。
GroupSock模块用于实现数据包的发送和接受。GroupSock主要被设计用来以支持多播,但它也完全支持单播通信。
LiveMedia模块是Live555最重要的模块。该模块声明了一个抽象类Medium,其他所有类都派生自该类,下面简单介绍这些类:
RTSPClient:该类实现RTSP请求的发出和相应的解析,同时根据解析的结果创建对应的RTP会话。
MediaSession:用于表示一个RTP会话,一个MediaSession可能包含多个子会话(MediaSubSession),子会话可以是音频子会话、视频子会话等。
RTCPInstance:该类实现RTCP协议的通信。
Source和Sink:这两个概念类似DirectShow中的Filter。Source抽象了数据源,比如通过RTP读取数据。Sink是数据消费者的抽象,比如把接受到数据存储到文件,该文件就是一个Sink。数据的流动可能经过多个Source和Sink。MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式和编码的支持即是通过对这两个类的派生实现的。Source和Sink通过RTP子会话(MediaSubSession)联系在一起。
OpenRTSP客户端流程
1.创建TaskScheduler和BasicUsageEnvironment类
2.命令行解析,获取流媒体地址和其他选项
3.创建RTSPClient对象
4.如果需要,RTSPClient对象发送OPTIONS命令并解析服务端响应,获取可以使用命令集。
5.RTSPClient对象发送DESCRIBE命令,并从获服务端反馈中获取流媒体相关描述SDP字串。
6.创建MediaSession对象,解析SDP字串,创建了相应的子会话对象。在这个过程中还完成了RTP和RTCP通信使用的GroupSock对象的创建,包括协议和端口的选择。
7.根据流媒体不同类型,实例化具体的RTP会话的Source和Sink对象。
8.RTSPClient对象发送SETUP和PLAY命令,服务端开始传输流媒体数据。
9.TaskScheduler开始事件处理循环,通过Select监听数据包到达并调用注册函数进行处理。
项目介绍
项目的源代码包括四个基本的库,各种测试代码以及Live555 Media Server。四个基本的库分别是UsageEnvironment & TaskScheduler, groupsock, liveMedia, BasicUsageEnvironment。
源码下载
live555源码:http://www.live555.com/(官网)
编译步骤 --- VS2010可实现
下面通过两个方法进行介绍编译过程。
方法一(Win7 下命令方式)
编译思路:利用genWindowsMakefiles.cmd生成VS可用的makefile。
1.准备过程,即将Windows下的和VS2010 nmake命令在命令行可运行。
上面报错,是因为没有对nmake输入参数文件,即,makefile。
2.修改win32config。打开live\win32config文件,修改内容如下所示:
3.新增Makefile设定。打开live\groupsock\Makefile.head,修改如下:
图片中的代码: -DNO_STRSTREAM
4.建立makefile
方法:运行live\genWindowsMakefiles.cmd,生成VS能够编译的*.mak文件
5.建立build.bat命令
新建live\compile.bat,并添加内容如下:【同样要注意自己VS2010目录地址】
6.开始编译:执行compile.bat
7.编译结果说明:
①生成与cpp文件对应的obj文件(Object File中间代码文件,源文件compile生成,在linux下为文件)
②生成lib库:libBasicUsageEnvironment.lib、libgroupsock.lib、libUsageEnvironment.lib和libliveMedia.lib。这些文件在对应的目录下可以找到。
③在对应的文件中可以找到相应的可执行文件exe,如live555MediaServer.exe、registerRTSPStream.exe和其他以test开头的相应测试文件的exe。
NOTE: 若要用VS2010对代码进行调试跟踪,那么编译时需要做相应修改,修改方法如下:
策略一: 修改*.mak文件下的NODEBUG。不带DEBUG,NONDEBUG=1(default);带DEBUG,DEBUG=1
策略二:在win32config加入一行"NONDEBUG=1"(没试过)
方法二:Win7+VS2010方式
如果需要自己调试修改源码,采用编译器的方式会更好些,这种方式也更有利于源码分析,步骤如下:
编译思路:分别为每个库单独编译生成lib
1.新建解决方案,并用lib工程来建立(NTOE:如何建立库工程),目录分别如下所示:(相对路径)
解决方案目录如下所示:
2.添加各个项目的头文件
在每个工程→属性→配置属性→C/C++→常规→附加包含目录,用绝对路径,如下图所示:
NOTE:这里对于每个项目的包含头文件都要添加这四项。具体原因还需要再分析源码,再做修正。^_^
3.添加文件
在上面的各个项目中添加对应的所有CPP文件,在liveMedia中直属目录下的*.hh可以也拷贝进来(要用到),要不就在上一步,用include方式加进去(自己选择),否则,会出错。
4.设置工程的输出目录
方法:项目→属性→常规→输出目录
路径:../MyLive555lib 【当前解决方案目录下】
5.编译解决方案
结果: 在MyLive555lib目录下生成 BasicUsageEnvironment.lib、groupsock.lib、UsageEnvironment.lib、liveMedia.lib
- Live555编译实现过程
- live555编译
- 编译live555
- live555编译
- live555 编译
- live555编译
- Live555 编译
- live555编译
- VLCKit编译过程中live555报404的问题解决
- live555 visual 2005 编译
- LIVE555 vc 编译
- live555 linux 编译
- vs2008编译live555
- live555编译 WINDOWS
- live555 编译 运行服务器
- live555 linux 编译
- live555 --- vs2010编译
- live555的交叉编译
- 解决HTML5新标签不兼容的问题
- document.addEventListener 事件的最后一个参数
- 第一篇流水帐
- JavaScript专业八级测试,答案
- iOS学习之iOS沙盒(sandbox)机制和文件操作(二)
- Live555编译实现过程
- C/C++回调函数简要介绍
- Linux中增加Swap分区文件
- request.getHeader(referer)的使用
- 关于判断web是手机端还是电脑端访问以及复制删除按钮的实现
- 调用百度翻译API
- Unity3D 场景编辑器扩展学习笔记-Handles&Event
- ContentProvider 学习
- Linux查看硬盘使用情况