FFmpeg入门详解之113:live555简介

live555简介

Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。

Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多种音频编码。

同时由于良好的设计,Live555非常容易扩展对其他格式的支持。

目前,Live555已经被用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan)、MPlayer。

 下载

live555源码:http://www.live555.com/(官网)

下载地址: http://download.videolan.org/pub/contrib/live555/

该项目的源代码包括四个基本的库,各种测试代码以及IVE555 Media Server。

四个基本的库分别是UsageEnvironment&TaskScheduler,groupsock,liveMedia,BasicUsageEnvironment。

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

LIVE555媒体服务器”是完整的RTSP服务器应用程序。它可以流式传输几种媒体文件(必须存储在当前工作目录中,即从中启动应用程序的目录中或子目录中):

MPEG传输流文件(文件名后缀“ .ts”)

甲的Matroska或WebM的文件(文件名为后缀“.MKV”或“.webm”)

一个奥格文件(文件名后缀“.OGG”,‘OGV’,或“.opus”)

MPEG-1或2节目流文件(文件名后缀“ .mpg”)

MPEG-4视频基本流文件(文件名后缀“ .m4e”)

H.264视频基本流文件(文件名后缀“ .264”)

H.265视频基本流文件(文件名后缀“ .265”)

一个VOB视频+音频文件(文件名后缀为“ .vob”)

DV视频文件(文件名后缀“ .dv”)

MPEG-1或2(包括第III层,即“ MP3”)音频文件(文件名后缀“ .mp3”)

WAV(PCM)音频文件(文件名后缀“ .wav”)

AMR音频文件(文件名后缀“ .amr”)

AC-3音频文件(文件名后缀“ .ac3”)

AAC(ADTS格式)音频文件(文件名后缀“ .aac”)

下载源码后解压得到live目录,目录结构如下,lib目录是编译后产生的目录:

     

      主要使用其中的四个目录,分别对应Live555的四个库:

UsageEnvironment目录,生成的静态库为libUsageEnvironment.lib,这个库主要包含一些基本数据结构以及工具类的定义

groupsock目录,生成的静态库为libgroupsock.lib,这个库主要包含网络相关类的定义和实现

liveMedia目录,生成的静态库为libliveMedia.lib,这个库包含了Live555核心功能的实现

BasicUsageEnvironment目录,生成的静态库为libBasicUsageEnvironment.lib,这个库主要包含对UsageEnvironment库中一些类的实现

  mediaServer目录中包含Live555流媒体服务器的标准示例程序,运行live555MediaServer.exe后出现如下界面:

   

  在mediaServer目录中放入你的媒体文件,如test.mp3,在VLC播放器中选择“媒体”-“打开网络串流”,然后输入 rtsp://127.0.0.1:8554/test.mp3 就可以播放刚才的mp3文件了。

  proxyServer目录中是live555实现的代理服务器的例子程序,这个程序可以从其他的流媒体服务器(如支持RTSP的摄像机)取实时的视频流然后转发给多个RTSP客户端,这个程序很有用,可以转发摄像机的实时视频流。

  testProgs目录中包含很多的测试例子程序,我经常用的是testOnDemandRTSPServer.cpp,我是从这个例子程序开始学习Live555的。

Live555搭建编译环境

新建解决方案Fyxylive555,同时在解决方案下分别新建Visual C++ Empty Project,它们为:BasicUsageEnvironment、groupsock、liveMedia、UsageEnvironment工程。

修改工程属性,将工程修改为lib工程,

将下载下来的live源码中的include文件以及.cpp文件拷贝到对应工程目录下面,并且设置每个工程的vc++目录

头文件路径:

..\BasicUsageEnvironment\include;..\groupsock\include;..\liveMedia\include;..\UsageEnvironment\include;

预处理器:

_CRT_SECURE_NO_WARNINGS;NO_OPENSSL;

Lib库:

ws2_32.lib;liveMedia.lib;groupsock.lib;BasicUsageEnvironment.lib;UsageEnvironment.lib;

将mp4文件中的视频流提取出来,:

ffmpeg -i test.mp4 -codec libx264 -bsf: h264_mp4toannexb -f h264 test.264

小坑:“-bsf: h264_mp4toannexb”

注意:冒号后边有一个空格

ffmpeg -i ande_302.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 test22.264

Sps, pps, idr,,.....

BasicUsageEnviroment除了需要引入自己的include文件夹下的文件外,同时还需要引入groupsock、UsageEnvironment文件夹下的include文件。

groupsock需要引入的文件为:自己include下的文件,BasicUsageEnvironment、UsageEnvironment文件夹下的include文件。

liveMedia需要引入的文件为:自己include下的文件,BasicUsageEnvironment、groupsock、UsageEnvironment文件夹下的include文件。

UsageEnvironment需要引入的文件为:自己include下的文件,BasicUsageEnvironment、groupsock文件夹下的include文件。

将.cpp文件引入工程

编译解决方案,会在debug下生成BasicUsageEnvironment.lib、groupsock.lib、liveMedia.lib、UsageEnvironment.lib四个文件

mediaServer工程设置

新建Empty Project,名称为mediaServer

include

lib

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)联系在一起。

DynamicRTSPserver服务器大流程:

参考源码

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监听数据包到达并调用注册函数进行处理。

ffmpeg -i test.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 test.264

Live555模块解析

《1》、UsageEnviroment模块

系统环境的抽象,主要用于消息的输入输出和用户交互功能,包含抽象类UsageEnviroment,TaskScheduler,DelayQueue类,HashTable。

UsageEnvironment代表了整个系统运行的环境,它提供了错误记录和错误报告的功能,无论哪一个类要输出错误,都需要保存UsageEnvironment的指针。

TaskScheduler类: 实现事件的异步处理、事件处理函数的注册等,它通过维护一个异步读取源实现对诸如通信消息到达等事件的处理,通过DelayQueue实现对其他注册事件的延时调度。TaskScheduler由于全局中只有一个,所以保存在UsageEnvironment中,而所有的类又都保存了UsageEnvironment的指针,所以谁想把自己的任务加入调度中,那是很容易的。

TaskScheduler中实现的三类调度任务:

socket任务(HandlerSet类管理)

延迟任务(DelayQueue类管理)

Event任务;

第一个及第三个在加入执行队列后会一直存在,而delay任务在执行完一次后会立即丢掉。

socket handler保存在BasicTaskScheduler0::HandlerSet* fHndlers中。

event hander保存在数据BasicTaskScheduler0::TaskFunc* fTriggeredEventHandlers[MAX_NUM_EVENT_TRIGGRES]中。

delay task保存在队列BasicTaskScheduler0::DelayQueue fDelayQueue中。

HashTable类:实现了哈希表。

HandleSet类: 是一种专门用于执行socket操作的任务(函数),被TaskScheduler用来管理所有的socket任务(增删改查)。在整个系统中都可以用到它。

DelayQueue类:延迟队列,他就是在TaskScheduler中用于管理调度任务的东西。他是一个队列,队列中每一项代表了一个要调度的任务(在fToken变量中保存)。该类同时保存了这个任务离执行时间点的剩余时间。

《2》、BasicUagesEnviroment模块

  该模块是UsageEnvoronment的一个控制台的实现。它针对控制台的输入输出和信号响应进行具体实现。

《3》、Groupsock模块

  主要被设计用于支持多播,仅仅支持UDP协议。理论上讲那些需要操作udp socket的类应保存GroupSocket的实例,但事实上并不是,RTPSink,RTPSource,RTCPInstance等,他们都没有保存GroupSocket型的变量。 他们是通过RTPInterface类来进行socket操作的!

《4》、LiveMedia模块

  该模块是Live555最重要的模块,该模块声明了一个抽象类Medium,其它所有类都派生自该类。

liveMedia主要运转的是一个source和sink的循环。

   source:数据来源的抽象,比如通过RTP读取数据;

   sink:数据消费者的抽象。比如吧接收到的数据存储到文件,该文件就是一个sink。

   source和sink通过RTP子会话(MediaSubSession)联系在一起, 数据的流通可能会经过多个Source和Sink。。

源码文件名以sink结尾的就是sink,像MediaSink.cpp,以source结尾的就是source,如MediaSource.cpp。

TCP传输方式,读取数据发送时注意TCPStreamSink::processBuffer()这个函数。

MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类。各种类型的流媒体格式和编码的支持就是通过对这两个类的派生实现的。

该模块的几个主要类:

RTSPClient:该类实现RTSP请求的发送和响应的解析,同时根据解析的结果创建对应的RTP会话。

RTSPClientSession:每个该类的实例代表每个客户端的rtsp会话,保存了每个客户的socket。

MediaSession:用于表示一个RTP会话,一个MediaSession可能包含多个子会话(MediaSubSession),子会话可以是视频子会话、音频子会话等。

RTCPInstance: 此类实现RTCP协议的通信

RtspServer:服务器实例,一旦创建就永久存在,其余对象都是由他创建或由它引起它们的创建。直接掌管ServerMediaSession和RTSPClient,只管这两个类的实例的创建不负责销毁。

ServerMediaSession:对应一个媒体文件,ServerMediaSession在客户端发出对一个新文件的DESCRIBE时创建。建立ServerMediaSession的同时也创建了ServerMediaSubsession,被ServerMediaSession所管理,代表一个文件中的track。

SercverMediaSubSession:代表的是一个静态的流(或者说tack),也就是可以从它里面获取一个流的各种信息,但是不能获取流的传输状态。

如果添加多个ServerMediaSubsession那么ServerMediaSession与流名字所指定的文件是没有关系的,也就是说ServerMediaSession不会操作文件,文件的操作是放在ServerMediaSubSession中的。

大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦。

《FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社》

京东自营链接:https://item.jd.com/13377793.html
京东其它链接:https://search.jd.com/Search?keyword=FFmpeg%E5%85%A5%E9%97%A8%E8%AF%A6%E8%A7%A3--%E9%9F%B3%E8%A7%86%E9%A2%91%E5%8E%9F%E7%90%86%E5%8F%8A%E5%BA%94%E7%94%A8&enc=utf-8&suggest=1.his.0.0&wq=&pvid=24e80535073b4e1f98e30a3e6963fe81
 

 

出书过程非常艰辛,来回校正了好几遍,后续还有FFmpeg系列的其它图书。

第一本:FFmpeg入门详解--音视频原理及应用--梅会东--清华大学出版社

第二本:FFmpeg入门详解--流媒体直播原理及应用--梅会东--清华大学出版社

第三本:FFmpeg入门详解--命令行及音视频特效原理及应用--梅会东--清华大学出版社

第四本:FFmpeg入门详解--SDK二次开发及直播美颜原理及应用--梅会东--清华大学出版社

===================================

猜你喜欢

转载自blog.csdn.net/teachermei/article/details/127650219