基于live555实现rtsp视频直播

基于live555实现rtsp视频直播

  (2012-12-06 20:56:59)
转载
标签: 

杂谈

 
其实做一个也不难!要做的工作就是对h.264字节流进行分析,分离出单个的nalu,然后经rtp协议组包发送即可。这个可以完全从头做,不用 live555,rtp库可以用jrtpib,rtsp协议部分自己写,代码量不到3千就可以搞定。只不过live555是从文件读h.264字节流,实 时监控的字节流则是现场采集。二者的差别仅此而已。

基于Live555的多路视频流的流媒体服务器框架

基于Live555的多路视频流的流媒体服务器的整体框架

 

创建静态的多路视频流的流媒体服务器的框架(一开始就创建好)

1、创建一个RTSPServer;

2、为每路视频流创建一个 ServerMediaSession,用一个唯一标识跟ServerMediaSession构建成一个hash_map保存起来;

3、根据视频流的类型的不同,为每路视频流创建一个 OnDemandMediaSubsession ;

4、将创建的 OnDemandMediaSubsession 添加到第2步创建的 ServerMediaSession ;

5、将第2步创建的 ServerMediaSession 添加到 RTSPServer ;

6、 开启 doEventLoop ;

 


基于live555的视频直播 DM368IPNC RTSP分析

本文是 我对TI DM368IPNC RTSP直播部分的代码分析。

 

appro IPNC视频流直播部分用的RTSP,基于live555,通过改写wis-streamer实现的,在live555官网上有wis-streamer 的代码下载,appro将其修改,在framedsource中加入了GetAVData接口,这样ipnc就可以直播了。

 

感慨:C++ 真的太好用了

 

现在懒了,文字部分就直接复制出来,源文档使用的是excel,

 

 

基于live555的视频直播 DM368IPNC RTSP分析

一、描述 

 

 

appro利用live555实现了三种视频流以及一种音频流的直播

 

1、MJPEG Video

2、H264 Video

3、MPEG4 Video

4、PCM Audio

 

live555是一个开源的RTSP C++类库,默认实现音视频文件的点播,但是可以通过继承相关类,重写相关方法实现视频直播

 

 

live555提供的实现直播的通用步骤是:

 

 

截图来自之前的《live555分析与开发.xlsx》

 

appro也是按照此种方法实现

 

二、Appro的添加的live555源文件 

 

之所以文件复杂,是由于实现了多种音视频流,如果只留其一,源文件将非常简洁

 

下图是appro源码的UML类图

 

APPROInput类 类似于设计模式中的简单工厂模式,用于创建具体的FramedSource,对于WISServerMediaSubsession类来说,处理FramedSource的接口是相同的,

但是对于FramedSource来说,VideoSource与AudioSource的具体的帧获取是不同的,

这样,就需要利用APPROInput来分别创建VideoSource和AudioSource。

 

 

类APPROInput的videoSource()方法 返回VideoOpenFileSource类的实例

类APPROInput的audioSource()方法 返回AudioOpenFileSource类的实例

 

三、重要的FramedSource 

 

FramedSource类的doGetNextFrame()方法用于获得音视频的帧数据,子类需要实现这个方法

 

OpenFileSource中的incomingDataHandler1,调用了虚函数readFromFile,这个函数与底层相关,

所有由OpenFileSource的子类 VideoOpenFIleSource和AudioOpenFileSource类实现

 

在appro的ipnc中,不管是视频还是音频数据,均是通过GetAVData()函数来获得,

所以VideoOpenFileSource类和AudioOpenFIleSource类的readFromFile方法中封装了GetAVData()这个函数。

 

具体获得哪种类型的数据是由类OpenFileSource中的属性APPROInput &fInput来传递的

 

在main函数中有关FramedSource操作的所有代码如下图,以H264为例

启示:在移植appro的live555到高清相机中,我认为最好的方法就是按照IPNC的GetAVData()函数结构,

 

封装高清相机的GetAVData()函数,高层的live555RTSP部分可不做任何改动

 

四、RTSP直播 main主程序 

 

这与普通的live555 rtsp service结构并无太多区别,只是由于要传输的视频类型较多,所以多了很多if else,这部分比较简单,不作分析。

 

 

appro也是按照此种方法实现



基于live555实现rtsp视频直播

2011-11-20 22:52  3646人阅读  评论(21)  收藏  举报
 

email:[email protected]

现有的安防监控设备视频传输都是用的各家私有协议,鲜有用标准协议rtsp的。如果能用rtsp来传输,那很多标准的rtsp客户端都能连上观看, 真正做到互联互通。Live555是目前实现rtsp协议最短小精悍的开源代码,能很方便的移植到各种嵌入式系统中,而且该开源项目更新速度很快,基本每 个月都有更新版本。Live555目前已经实现了基于udp和tcp的传输,支持mpg、mkv、h264、mpeg4、amr等文件的点播。有服务器端 和客户端两种实现。

首先需要将live555移植到嵌入式linux上编译,这一步比较简单,只要执行下面的步骤即可。

Ø  修改config.armlinux,将编译器改为对应的交叉编译器名,如arm-uclibc-linux-

Ø  执行genMake armlinux,生成相应的makefile文件

Ø  执行 make,即会生成live555库。

Live555采用的是单线程架构,将所有事件句柄(包括socket,fd)都加入事件队列中,然后在BasicTaskScheduler::SingleStep中调用select轮询每个事件句柄,如果有事件发生就进入相应的事件处理。

Live555中自带了一个server的例子是实现的文件点播,实现直播和点播有些区别,这里参考了wis-streamer的代码。我原来在 arm板上已实现了每采集压缩一个数据包,就存入队列中。为了与live555的select事件相对应,加入了管道操作,在将数据包存入队列的同时,同 时往管道写1个数。再将管道句柄加入live555的事件队列中,在相应的事件处理函数中从管道读1个数,同时从队列中读取一个数据包。对应到代码中是修改WISInput.cpp中的WISVideoOpenFileSource::readFromFile,将原来从v4l读取视频数据改为从队列读 取。另外wisinput原来读取的视频为未压缩的原始数据,这里已经在arm板上用硬件压缩完成了,不需要软压缩,因此不再需要创建相应的压缩 filter。再者arm板上往队列中写入数据包前已经做了分包处理,不再需要在live555中进行rtp分包,因此将 MultiFramedRTPSink.cpp进行相应的修改,主要修改了MultiFramedRTPSink::packFrame()、 MultiFramedRTPSink::afterGettingFrame1函数。同时修改了 H264VideoRTPSink::continuePlaying(),不需要创建H264FUAFragmenter进行h264数据分包。

      上面主要描述了针对h264视频的处理,对音频的处理也是同样的思路。经过对live555的移植和改造,实现了在arm板上采集压缩h264视频,采用 rtsp协议直播。客户端在pc机上可以用vlc、quicktime等软件连接,在手机上可以用coreplayer连接。另外还可以用rtsp协议发 到flash media server上,通过flash media server的转发,用户在网页上可以用flash看到实时视频。这就是采用标准协议的好处,可以与多种现有的客户端和服务器实现互联互通。


你可能感兴趣的:(基于live555实现rtsp视频直播)