RTSP协议转换RTMP直播协议
2015-07-28 14:23
232 查看
RTSP协议转换RTMP直播协议
RTSP协议也是广泛使用的直播/点播流媒体协议,最近实现了一个RTSP协议转换RTMP直播协议的程序,为的是可以接收远端设备或服务器的多路RTSP直播数据,实时转换为RTMP直播协议,推送到FMS、Red5、wowza server等RTMP服务器,以实现flash观看RTSP直播源的需求。程序同时也具备从FLV文件获取输入数据并转换RTMP直播。实现的思路分享如下。要点分析
首先,程序的主要目的,是从多路RTSP输入源中提取AAC编码的音频和H.264编码视频数据,并生成RTMP数据包,然后组装RTMP推送协议,并发往RTMP服务器。在发送的过程中,要求可以从RTSP数据源切换到具有相同h.264和aac编码的FLV文件中,并不影响RTMP直播。因此,本程序的关键点有以下部分:RTSP直播流的读取
H.264和AAC编码数据的分析、处理
FLV文件数据的提取及与RTSP直接的切换和衔接
RTMP数据包封装
RTMP推送协议
有了关键点,就可以一项一项的去分析。
设计思路
根据上面分析的要点,首先要选择RTSP直播协议的读取。我们不需要从零做起,网络上有很多和RTSP相关的开源项目可以使用或借鉴,我选择了Live555。Live555是一个跨平台的流媒体解决方案,主要支持RTSP协议,好像也支持SIP(这个也是我马上研究的重点,之后会写文章研究SIP相关的技术实现)。Live555实现了RTSP包括服务器-客户端的整套结构,是很知名的一个开源项目。网上有很多关于Live555学习和使用的文章,我就不具体介绍了。
H.264和AAC数据的分析处理,这个对于从没做过相关项目开发的人来说,应该是一个难点,主要是相关概念的理解。好在我一直在做这块,也比较好弄。
第4和第5点,可以参照我之前的文章“RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播”的技术方法,来加以实现。因此,主要需要处理的就是RTSP直播流数据的获取,以及对其中H.264和AAC编码数据的处理。
于是可以画出大体结构如下:
![](http://images.cnitblog.com/blog/254714/201311/21092235-4dd211ee2a7d49e0a349b633248ab00c.jpg)
逻辑与实现
1. 程序框架和模块说明
![](http://images.cnitblog.com/blog/254714/201311/21092349-c7bb9208ed394018b0e23316928c844a.jpg)
2. 主要接口
![](http://images.cnitblog.com/blog/254714/201311/21091319-da178e8906844fcab64c191d01453a72.jpg)
RtspCapture是我的程序里管理RTSP直播数据流和分析处理的类,接口很重要,基本上这个设计就可以。(当然,全部代码是不会放上来的,有兴趣的可以和我谈,这里只罗列关键的地方。)
![](http://images.cnitblog.com/blog/254714/201311/21091416-af13af2e682842e0bd1410a96fee0db8.jpg)
他所使用的live555变量,这里ourRTSPClient实际就是RTSPClient的简单继承
![](http://images.cnitblog.com/blog/254714/201311/20130418-12a14f4534a542d0a377082ea4a56696.jpg)
3.RtspCapture调用live555的主要流程
1. 首先,在RtspCapture构造函数初始化![](http://images.cnitblog.com/blog/254714/201311/20130611-73a2ff6b629347c4b19403e57024e70f.jpg)
2. 在StartRtsp函数中,创建RtspClient,并发送"describe"命令,开始获取sdp。回调函数就是continueAfterDESCRIBE。在这里创建MediaSession,之后再发送"setup"命令,等,这些都可以在live555的例子以及网上的说明中看到。
![](http://images.cnitblog.com/blog/254714/201311/20130710-2fc1a19293c5495980e587f386035f52.jpg)
3. 还有一个关键点,就是要在自己的线程循环中,调用live555 environment的事件循环,就像这样
![](http://images.cnitblog.com/blog/254714/201311/20131032-383a790306ab40fdb95487317e5169ac.jpg)
4. 对rtsp回调h264数据的分析处理
这里演示了,如何从rtsp回调的h264数据中,提取sps和pps信息。里面的parse函数,是live555自带的。![](http://images.cnitblog.com/blog/254714/201311/20131548-4bf09d10b8bc4626abeea75dc095bc82.jpg)
调用方式
![](http://images.cnitblog.com/blog/254714/201311/21094340-5680ade1dfbe4b199e140e63a4c8aead.jpg)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
![](http://images.cnitblog.com/blog/254714/201311/20133655-bcaa799b72a742698c79471475e62d95.png)
haibindev.cnblogs.com,合作请联系QQ。(转载请注明作者和出处~)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
相关文章推荐
- string类中使用CriticalSection类
- android常用UI使用案例:SeekBar
- FineUI初学手册-部分JS整理
- ANDROID展示HTML图文混排--实现图片缩小并点击放大
- C++学习问题NO.1
- redis的安装(windows and linux)
- 关于百度地图坐标转换接口的研究
- Android Studio配置SVN服务器
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- SQlite字段类型升级
- hdu1874
- UITableiView
- GridView支持加载更多
- hdoj 1509 Windows Message Queue 【STL 优先队列】
- iOS编程——Swift实现一个3D圆型旋转菜单
- 套接字选项setsockopt中参数之SO_REUSEADDR
- Linux显示中文乱码解决方法
- [原]JSON和JS对象
- 九度oj 1163
- Windows GDI、GDI+ 绘图 闪烁问题