专栏首页HBStream流媒体与音视频技术RTSP协议转换RTMP直播协议

RTSP协议转换RTMP直播协议

RTSP协议转换RTMP直播协议

  RTSP协议也是广泛使用的直播/点播流媒体协议,以前的项目里实现了一个RTSP协议转换RTMP直播协议的程序,为的是可以接收远端设备或服务器的多路RTSP直播数据,实时转换为RTMP直播协议,推送到NginxRtmp等RTMP服务器,可以在PC上实现flash观看RTSP直播源(比如IPCAM)的需求,也能通过Nginx的HLS协议转换,在手机上观看。实现的思路分享如下。

要点分析

  首先,程序的主要目的,是从多路RTSP输入源中提取AAC编码的音频和H.264编码视频数据,并生成RTMP数据包,然后组装RTMP推送协议,并发往RTMP服务器。在发送的过程中,要求可以从RTSP数据源切换到具有相同h.264和aac编码的FLV文件中,并不影响RTMP直播。因此,本程序的关键点有以下部分:

  1. RTSP直播流的读取
  2. H.264和AAC编码数据的分析、处理
  3. FLV文件数据的提取及与RTSP直接的切换和衔接
  4. RTMP数据包封装
  5. RTMP推送协议

  有了关键点,就可以一项一项的去分析。

设计思路

  根据上面分析的要点,首先要选择RTSP直播协议的读取。我们不需要从零做起,网络上有很多和RTSP相关的开源项目可以使用或借鉴,我选择了Live555。(后来我也做了通过ffmpeg接口来读取RTSP数据的项目,也很不错,各有优缺点)

Live555是一个跨平台的流媒体解决方案,主要支持RTSP协议,好像也支持SIP(这个也是我马上研究的重点,之后会写文章研究SIP相关的技术实现)。Live555实现了RTSP包括服务器-客户端的整套结构,是很知名的一个开源项目。网上有很多关于Live555学习和使用的文章,我就不具体介绍了。

  H.264和AAC数据的分析处理,这个对于从没做过相关项目开发的人来说,应该是一个难点,主要是相关概念的理解。好在我一直在做这块,也比较好弄。

  第4和第5点,可以参照我之前的文章“RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播”的技术方法,来加以实现。因此,主要需要处理的就是RTSP直播流数据的获取,以及对其中H.264和AAC编码数据的处理。

  于是可以画出大体结构如下:

逻辑与实现

1. 程序框架和模块说明

2. 主要接口

  RtspCapture是我的程序里管理RTSP直播数据流和分析处理的类,接口很重要,基本上这个设计就可以。(当然,全部代码是不会放上来的,有兴趣的可以和我谈,这里只罗列关键的地方。)

  他所使用的live555变量,这里ourRTSPClient实际就是RTSPClient的简单继承

3.RtspCapture调用live555的主要流程

  1. 首先,在RtspCapture构造函数初始化

  2. 在StartRtsp函数中,创建RtspClient,并发送"describe"命令,开始获取sdp。回调函数就是continueAfterDESCRIBE。在这里创建MediaSession,之后再发送"setup"命令,等,这些都可以在live555的例子以及网上的说明中看到。

  3. 还有一个关键点,就是要在自己的线程循环中,调用live555 environment的事件循环,就像这样

4. 对rtsp回调h264数据的分析处理

  这里演示了,如何从rtsp回调的h264数据中,提取sps和pps信息。里面的parse函数,是live555自带的。

调用方式


haibindev.cnblogs.com,合作请联系QQ。(转载请注明作者和出处~)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 抛开flash,自己开发实现C++ RTMP直播流播放器

    众所周知,RTMP是以flash为客户端播放器的直播协议,主要应用在B/S形式的场景中。本人研究并用C++开发实现了RTMP直播流协议的播放器,结合之前做的R...

    hbstream
  • HTTP Live Streaming直播(iOS直播)技术分析与实现

       不经意间发现,大半年没写博客了,自觉汗颜。实则2012后半年,家中的事一样接着一样发生,实在是没有时间。快过年了,总算忙里偷闲,把最近的一些技术成果,总结...

    hbstream
  • 一个RtspServer的设计与实现和RTSP2.0简介

      前段时间着手实现了一个RTSP Server,能够正常实现多路RTSP流的直播播放,因项目需要,只做了对H.264和AAC编码的支持,但是相信其他编码的实现...

    hbstream
  • UILabel、UIImageView和UIButton

    第一个是lineBreakMode属性,该属性设置了当文字内容大于label所能承载的内容的时候该如何展示,也就是说,当文字超长的时候如何截断。

    拉维
  • 什么是类?什么又是对象?

    面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。

    以谁为师
  • Java的Instrumentation类原理分析

    利用 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrume...

    JavaEdge
  • Java漫谈1

    对于接触编程的人来说,Java更多地代表了一门编程语言。 Java是一门通用的计算机编程语言,它是并行的,基于类的,面向对象的,可以一次编写到处运行的一门语言。...

    用户1335799
  • Java 的对象和类 原

    Java 是一种面向对象的语言。作为一个面向的语言,Java 具有面向对象的特性,Java 能够支持下面的一些基本概念 −

    HoneyMoose
  • 单字母域名O.com进入流通市场

    近日有消息称,单字母域名o.com被威瑞信拍卖。这一消息顿时引起域名行业众多大佬的期待。

    躲在树上的域小名
  • 速读原著-Java核心技术(安装Java开发工具包)

    本章主要介绍如何安装 Java 开发工具包( JDK ) 以及如何编译和运行不同类型的程序:控制台程序、 图形化应用程序以及 applet。运行 JDK 工具的...

    cwl_java

扫码关注云+社区

领取腾讯云代金券