LIVE555再学习 -- live555实现RTSP直播服务器 分析

来源:互联网 发布:juniper network mac 编辑:程序博客网 时间:2024/06/12 01:13

上一篇文章 讲到了 live555实现RTSP直播服务器,但是篇幅有点长,没有来得及对源码进行分析。

这篇文章就好好看看,源码部分这次参看Linux版本下的 通过live555实现H264 RTSP直播 (代码太繁琐)

然后还可以结合 live555直播(准备2)-重写doGetNextFrame()和doEventLoop() 这篇文章来讲。

这哥们写的这几篇文章,都是很不错的。可以关注一下。

他的 DM365+live555实现RTSP直播服务器(广播) ,正是我要实现的结果。

一、源码分析

一下源码分析以参看 通过live555实现H264 RTSP直播(Windows版) 为主。

查看 testOnDemandRTSPServer.cpp 源码 h264 部分。


你可以看到,我参看的这几篇文章里,都是 修改为自己实现的H264LiveVideoServerMediaSubssion  


然后就涉及到自写 H264LiveVideoServerMediaSubssion.hh、H264LiveVideoServerMediaSubssion.cpp

可以对比官方源码,看看自己实现的和官网源码有啥不一样。



H264LiveVideoServerMediaSubssion.hh 主要移植这几部分,省去了 fileName 


再有就是创建类,继承自 H264VideoFileServerMediaSubsession


但是我看到 Linux 那篇是用的 OnDemandServerMediaSubsession  


H264LiveVideoServerMediaSubssion.cpp 主要移植这几部分



最后这里有一个 H264LiveFramedSource 它是自己建的类,对应的即官网源码的 ByteStreamFileSource



然后就涉及到自写 h264LiveFramedSource.hh、h264LiveFramedSource.cpp

可以对比官方源码,看看自己实现的和官网源码有啥不一样。



h264LiveFramedSource.hh 主要移植这几部分,还是将 fileName 去掉了。

再有就是创建类,继承自 ByteStreamFileSource 这里有点懵逼,不知道为什么要用 ByteStreamFileSource
因为我看其他两个博客里用的是 FramedSource 

PS:window版本博文了已经说明了

通过“基础”中的分析可以得出,想实现自定义服务器,需要将sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, inputFileName,reuseFirstSource)),中的H264VideoFileServerMediaSubsession替换成自己的子会话。H264VideoFileServerMediaSubsession类在其createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate)函数中调用了ByteStreamFileSource::createNew(envir(), fFileName),而 frame 的获取正是在 ByteStreamFileSource 类中的 doGetNextFrame() 函数中实现的。因此,这里需要继承H264VideoFileServerMediaSubsession 和 ByteStreamFileSource类,并重写其中的createNewStreamSource 和 doGetNextFrame 函数。

这部分概念:

参看:live555学习-ByteStreamFileSource和H264VideoStreamFramer

参看:live555学习-FramedSource详解

FramedSource 是一个抽象类,继承自mediaSource继承自medium,里面有纯虚函数virtual void doGetNextFrame ();
此函数初始化了几个必要参数,并调用了纯虚函数doGetNextFrame();此函数留给派生类实现,例如ByteStreamFileSource 

这两句道明了三者关系!!


h264LiveFramedSource.cpp 部分主要移植

window版本博文了已经说明了,这里不使用命名管道来实现,而是直接读取本地H264文件,分解成StartCode+NALU 内存块,然后拷贝到 Live555 Server 。这样一来,就很容易改成命名管道的形式,命名管道的客户端只需读取本地H264文件,分解成StartCode(0x000001或0x00000001)+NALU内存块,并写入管道,命名管道服务器端(在Live555 Server中)读取管道数据,并拷贝到Live555 Server。


它对应官方源码这部分


再有


它对应官方源码这部分



最后是 doGetNextFrame 这部分有点意思

这部分有参看源码部分:


跳转查看 doReadFromFile



这部分还有一个很重要的地方。

比如,我想用 DM368 + live555 实现RTSP 直播怎么办?

在 demo 的 encode 里有个 writer.c 找到里面有获取一帧的部分

if (fwrite(Buffer_getUserPtr(hOutBuf),Buffer_getNumBytesUsed(hOutBuf), 1, outFile) != 1) {ERR("Error writing the encoded data to video file\n");
这里的 Buffer_getUserPtr(hOutBuf)  即可获取一帧一帧的数据。

它等同于上述代码的 inBuf 将其替换,然后解析 test.264 那一套删除了,就可以。就这么简单粗暴!!!

直播、多播 参看:DM365+live555实现RTSP直播服务器(广播)



在h264LiveMediaServer.cpp主要是下面这部分做相应的修改


它对应官方源码下面这部分


这样就回到本文开始讲的了,源码分析到此结束!!

二、doEventLoop 源码分析

在最后部分有这样一段


有时我们有必要重写  doEventLoop 的

得,我们先看一下源码


跳转查看 doEventLoop   注释:反复循环,处理readble套接字和定时事件:


讲解部分:

看:live555 env->taskScheduler().doEventLoop()解析/自己实现

参看:live555直播(准备2)-重写doGetNextFrame()和doEventLoop()

自行查看吧,我是太懒了,不想看!!

直接看怎么重写 doEventLoop 函数:


执行:




原创粉丝点击