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

执行:

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

  1. LIVE555再学习 -- live555实现RTSP直播服务器

    分析完 testOnDemandRTSPServer 和 testH264VideoStreamer 的源码.我们现在就可以做相关的项目工程. 我之前写过一个,参看: DM368开发 -- 编码并实时 ...

  2. LIVE555再学习 -- VLC搭建RTSP服务器(转)

    实时流协议 RTSP 是在实时传输协议的基础上工作的,主要实现对多媒体播放的控制.用户对多媒体信息的播放.暂停.前进和后退等功能就是通过对实时数据流的控制来实现的. 而这些播放控制功能的实现不仅需要多 ...

  3. LIVE555再学习 -- testOnDemandRTSPServer 源码分析

    一.简介 先看一下官网上的介绍: testOnDemandRTSPServercreates a RTSP server that can stream, via RTP unicast, from ...

  4. LIVE555再学习 -- FFmpeg + live555实现RTSP直播

    一.简单实验 首先先简单的实验了一下. 运行 FFmpeg 将 MP4文件转成 264 文件 ffmpeg -i Tai.mp4 test.264 执行 testOnDemandRTSPServer ...

  5. LIVE555再学习 -- testH264VideoStreamer 源码分析

    上一篇文章我们已经讲了一部分: testH264VideoStreamer 重复从 H.264 基本流视频文件(名为"test.264")中读取,并使用 RTP 多播进行流式传输. ...

  6. LIVE555再学习 -- testRTSPClient 实例

    上一篇文章简单看了一遍 testRTSPClient  的源码,接下来举几个应用实例加深一下. 首先什么都不做修改,先执行一遍,看一下. 一.执行 testRTSPClient 特么,上面的东西我没看 ...

  7. LIVE555再学习 -- DM368/Hi3516A 交叉编译

    接着上篇文章来讲,参看:LIVE555再学习 -- Linux 下编译 下载源码.文件介绍部分不再介绍.主要看配置编译部分. 三.配置编译 DM368 的交叉编译器为 arm-none-linux-g ...

  8. LIVE555再学习 -- 初识

    之前用过 LIVE555,资料什么的都是有的但是并没有系统的总结.现在有时间可以再看一下. 一.LIVE555 初识 首先要了解一下什么是 LIVE555. 参看:LIVE555 官网 参看:LIVE ...

  9. LIVE555再学习 -- 单播、多播、广播、直播、点播 都是个啥?

    转自:https://blog.csdn.net/qq_29350001/article/details/78086800 一.单播 简介 Unicast,是客户端与服务器之间的点到点连接." ...

最新文章

  1. SOCKET是调用操作系统通信服务的一种机制
  2. shell定时执行java,shell学习之定时运行作业
  3. Task5:第五回:样式色彩秀芳华
  4. 马化腾的马氏建议:“小步快跑 快速迭代”
  5. 从菜鸟到架构师(六)
  6. python长度单位换算用def_【每天学点Python】案例一:汇率换算
  7. Python实现批量修改图片名称并存入新文件夹
  8. 天津理工大学计算机学院绩点,天津理工大学花宇杰:平均绩点4.0你该这般青春昂扬...
  9. react钩子_了解用户的React钩子
  10. Photoshop液化工具塑造完美的脸型
  11. 响铃:“新品牌计划”出炉,但拼多多要的不只是C2M
  12. html中visibility属性,(CSS) 不同浏览器对table中visibility属性显示的不同
  13. 竣达技术丨电池巡检微信云监控系统
  14. R语言如何向向量中追加一个元素?
  15. 【Linux】树莓派控制光强传感器(C、python手把手教学)
  16. Android模拟器系统应用卸载办法
  17. html怎么做左侧广告,利用DIV+CSS制作浮动广告
  18. forest种树未能连接到服务器,今天,你种树了吗?
  19. 初学php做的有关php有关知识的了解
  20. 自我探索:2022年,拼命找到自己的使命

热门文章

  1. [Xcode 实际操作]七、文件与数据-(3)创建文本文件、属性列表文件、图片文件
  2. Lucene搜索引擎例子demo
  3. Lucene实战之基于StandardAnalyzer读写索引
  4. HUE配置文件hue.ini 的zookeeper模块详解(图文详解)(分HA集群)
  5. 使用Apache php 的一些基本操作(一)
  6. 算法编程题的心得体会
  7. HDU 1054 Strategic Game 最小点覆盖
  8. 8080处理器计算机启动
  9. 高效CSS的一些建议
  10. C++ unique and erase问题处理