上一篇文章 讲到了 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 函数:
执行: