基于live555实现rtsp视频直播

 

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看到实时视频。这就是采用标准协议的好处,可以与多种现有的客户端和服务器实现互联互通。

quicktime查看效果图

 

手机查看效果图

你可能感兴趣的:(makefile,server,编译器,flash,嵌入式,服务器)