上一篇文章 讲到了 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
可以对比官方源码,看看自己实现的和官网源码有啥不一样。
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
FramedSource 是一个抽象类,继承自mediaSource继承自medium,里面有纯虚函数virtual void doGetNextFrame ();
此函数初始化了几个必要参数,并调用了纯虚函数doGetNextFrame();此函数留给派生类实现,例如ByteStreamFileSource 类
这两句道明了三者关系!!
window版本博文了已经说明了,这里不使用命名管道来实现,而是直接读取本地H264文件,分解成StartCode+NALU 内存块,然后拷贝到 Live555 Server 。这样一来,就很容易改成命名管道的形式,命名管道的客户端只需读取本地H264文件,分解成StartCode(0x000001或0x00000001)+NALU内存块,并写入管道,命名管道服务器端(在Live555 Server中)读取管道数据,并拷贝到Live555 Server。
它对应官方源码这部分
再有
它对应官方源码这部分
最后是 doGetNextFrame 这部分有点意思
这部分有参看源码部分:
这部分还有一个很重要的地方。
比如,我想用 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 函数:
执行: