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

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

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

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

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

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

一、源码分析

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

查看 testOnDemandRTSPServer.cpp 源码 h264 部分。

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第1张图片

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


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

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



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

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第2张图片

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

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第3张图片

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

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第4张图片


H264LiveVideoServerMediaSubssion.cpp 主要移植这几部分

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第5张图片


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

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第6张图片


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

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



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

再有就是创建类,继承自 ByteStreamFileSource 这里有点懵逼,不知道为什么要用 ByteStreamFileSource
LIVE555再学习 -- live555实现RTSP直播服务器 分析_第7张图片
因为我看其他两个博客里用的是 FramedSource 
LIVE555再学习 -- live555实现RTSP直播服务器 分析_第8张图片

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。

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第9张图片

它对应官方源码这部分

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第10张图片

再有

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第11张图片

它对应官方源码这部分



最后是 doGetNextFrame 这部分有点意思

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第12张图片

这部分有参看源码部分:

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第13张图片
跳转查看 doReadFromFile

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第14张图片

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第15张图片

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

比如,我想用 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直播服务器(广播)

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第16张图片

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


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

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第17张图片

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

二、doEventLoop 源码分析

在最后部分有这样一段


有时我们有必要重写  doEventLoop 的

得,我们先看一下源码


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


讲解部分:

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

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

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

直接看怎么重写 doEventLoop 函数:

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第18张图片

执行:

LIVE555再学习 -- live555实现RTSP直播服务器 分析_第19张图片



你可能感兴趣的:(图像和流媒体,图像和流媒体)