LIVE555再学习 -- live555实现RTSP直播服务器 分析
上一篇文章 讲到了 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
参看: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直播服务器 分析相关推荐
- LIVE555再学习 -- live555实现RTSP直播服务器
分析完 testOnDemandRTSPServer 和 testH264VideoStreamer 的源码.我们现在就可以做相关的项目工程. 我之前写过一个,参看: DM368开发 -- 编码并实时 ...
- LIVE555再学习 -- VLC搭建RTSP服务器(转)
实时流协议 RTSP 是在实时传输协议的基础上工作的,主要实现对多媒体播放的控制.用户对多媒体信息的播放.暂停.前进和后退等功能就是通过对实时数据流的控制来实现的. 而这些播放控制功能的实现不仅需要多 ...
- LIVE555再学习 -- testOnDemandRTSPServer 源码分析
一.简介 先看一下官网上的介绍: testOnDemandRTSPServercreates a RTSP server that can stream, via RTP unicast, from ...
- LIVE555再学习 -- FFmpeg + live555实现RTSP直播
一.简单实验 首先先简单的实验了一下. 运行 FFmpeg 将 MP4文件转成 264 文件 ffmpeg -i Tai.mp4 test.264 执行 testOnDemandRTSPServer ...
- LIVE555再学习 -- testH264VideoStreamer 源码分析
上一篇文章我们已经讲了一部分: testH264VideoStreamer 重复从 H.264 基本流视频文件(名为"test.264")中读取,并使用 RTP 多播进行流式传输. ...
- LIVE555再学习 -- testRTSPClient 实例
上一篇文章简单看了一遍 testRTSPClient 的源码,接下来举几个应用实例加深一下. 首先什么都不做修改,先执行一遍,看一下. 一.执行 testRTSPClient 特么,上面的东西我没看 ...
- LIVE555再学习 -- DM368/Hi3516A 交叉编译
接着上篇文章来讲,参看:LIVE555再学习 -- Linux 下编译 下载源码.文件介绍部分不再介绍.主要看配置编译部分. 三.配置编译 DM368 的交叉编译器为 arm-none-linux-g ...
- LIVE555再学习 -- 初识
之前用过 LIVE555,资料什么的都是有的但是并没有系统的总结.现在有时间可以再看一下. 一.LIVE555 初识 首先要了解一下什么是 LIVE555. 参看:LIVE555 官网 参看:LIVE ...
- LIVE555再学习 -- 单播、多播、广播、直播、点播 都是个啥?
转自:https://blog.csdn.net/qq_29350001/article/details/78086800 一.单播 简介 Unicast,是客户端与服务器之间的点到点连接." ...
最新文章
- SOCKET是调用操作系统通信服务的一种机制
- shell定时执行java,shell学习之定时运行作业
- Task5:第五回:样式色彩秀芳华
- 马化腾的马氏建议:“小步快跑 快速迭代”
- 从菜鸟到架构师(六)
- python长度单位换算用def_【每天学点Python】案例一:汇率换算
- Python实现批量修改图片名称并存入新文件夹
- 天津理工大学计算机学院绩点,天津理工大学花宇杰:平均绩点4.0你该这般青春昂扬...
- react钩子_了解用户的React钩子
- Photoshop液化工具塑造完美的脸型
- 响铃:“新品牌计划”出炉,但拼多多要的不只是C2M
- html中visibility属性,(CSS) 不同浏览器对table中visibility属性显示的不同
- 竣达技术丨电池巡检微信云监控系统
- R语言如何向向量中追加一个元素?
- 【Linux】树莓派控制光强传感器(C、python手把手教学)
- Android模拟器系统应用卸载办法
- html怎么做左侧广告,利用DIV+CSS制作浮动广告
- forest种树未能连接到服务器,今天,你种树了吗?
- 初学php做的有关php有关知识的了解
- 自我探索:2022年,拼命找到自己的使命