EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源“拉”到服务器,再通过转发协议转发给多个客户端,或者通过EasyDarwin的本地存储功能进行存储。国内大多摄像机都支持RTSP协议,通过拉转推可将第三方摄像机接入到EasyDarwin服务器。


IPCEasyDarwin第三方RTSP源本地存储Client1Client2Client3拉流拉流ffmpeg转发转发转发IPCEasyDarwin第三方RTSP源本地存储Client1Client2Client3

拉转推需要服务器不仅实现服务端,还要实现客户端。这里我们介绍下拉流功能的实现。

RTSP的客户端拉流流程为:

  1. 发送RTSP命令
  2. 接收RTP媒体流

发送RTSP命令,又有如下几步:

  • OPTIONS 获取Server端支持的REQUEST请求集合
  • DESCRIBE 获取码流的SDP
  • SETUP 根据SDP信息,配置单个媒体流的传输方式
  • PLAY 启动播放

我们结合代码分析下拉流是如何实现的。RTSP的拉流实现在rtsp-client.go文件里,我们定义了一个结构体RTSPClient,实现了两个方法StartStop

在Start函数里面,主要有两部分,RTSP命令交互部分,即requestStream和媒体流收发部分,即stream

先看requestStream

  • 解析URL的host和port,建立TCP链接,准备进行命令交互

  • 发送OPTION和DESCRIBE请求,这里的Request接口,是封装的一个进行RTSP命令交互的接口,该接口发送报文,并接受响应,解析响应信息。返回值分别是RTSP的响应和错误。在代码里,每一个请求都判断了错误,如果错误了则直接返回。

  • 解析DESCRIBE返回的SDP信息,并针对每一个Stream,发送SETUP命令。这里使用了开源的SDP解析类go-sdp来解析SDP,其地址为https://github.com/pixelbender/go-sdp 在代码可以看出SDP解析出来后,遍历每一个stream,如果是video或者audio那就分别发送SETUP信息

  • 发送PLAY命令,向服务器端申请流



    发送了PLAY命令后,requestStream结束,然后整个流程进入stream部分.

    stream部分主要是持续接收媒体流或者Server端发来的RTSP命令报文(包括请求和响应),必要的情况下再发送心跳包给服务器。
  1. 初始化,这里根据OptionIntervalMillis参数是否大于0来判断是否需要发送心跳包给服务器端。如果需要,那以该值为周期,定期发送OPTIONS请求。注意这里的OPTIONS不能阻塞接收响应,这是因为此刻服务器端也在不断地发送着RTP数据,这种情况下阻塞接受响应的话,可能会受到RTP数据。响应报文由后续的持续接收数据部分进行处理。

  2. 接收RTP数据。根据RTP数据格式,我们先读一个字节的头,如果这个头的值为0x24,则其为RTP数据。否则就是RTSP命令数据。对于RTP数据,接下来我们的工作,就是将其完全接收,然后放到队列里面。

  3. 这里是RTP包的解析过程,可以看到,首先收取一个包的长度,然后根据这个长度,接收完成所有的一整包。再去解析包的内容,最后将包回调出去。RTP包有四种类型,VIDEO、AUDIO、VIDEOCONTROL、AUDIOCONTROL,这些类型通过channel来区分开来。channel是在SETUP的时候指定的。

  4. 非RTP数据包的接收,就比较简单了。由于RTSP是文本协议,逐行读取文本,直到读出一个长度为0的行。同时判断是否包括Content-Length?如果有的话,再读取Content-Length长度的数据包。否则接收完成。完全接收到一个整包后,这里单纯打印出来,不做后续操作。但是我们还是要把它完全接收,不然会导致数据包的解析完全乱套。

接收到的RTP数据包,我们在这里仅仅将其回调给上层处理。上层要维护一个队列,并将RTP数据包入队了。当有Client连接时,从队列里面去除RTP包,分发给Client,便实现了拉流转发功能。

资源链接

EasyDarwin官网:www.easydarwin.org

EasyDarwin Github:https://github.com/easydarwin

EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法的更多相关文章

  1. EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布

    EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...

  2. EasyDarwin开源流媒体服务器如何实现按需推送直播的

    --本文转自EasyDarwin开源团队成员邵帅的博客:http://blog.csdn.net/ss00_2012/article/details/51441753 我们使用EasyDarwin的推 ...

  3. vs2015编译EasyDarwin开源流媒体服务器Linux版本调研

    本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/51843196 之前InfoQ的一篇文章提到用vs ...

  4. EasyDarwin开源流媒体服务器提供的RTMP直播推送库

    EasyRTMP EasyRTMP是什么? EasyRTMP是一个EasyDarwin配套使用,也可以单独使用的RTMP推送库,通过EasyRTMP我们就可以避免接触到稍显复杂的RTMP推送流程,只需 ...

  5. NodeJS版本EasyDarwin开源流媒体服务器开发心得

    title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...

  6. EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路

    背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...

  7. EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...

  8. EasyDarwin开源流媒体服务器将select改为epoll的方法

    本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...

  9. 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题

    最近在开发EasyDarwin开源流媒体服务器HLS直播的时候发现一个现象:在PC上用flash player播放HLS和在ios上面播放HLS时,效果明显不同,在ios上播放非常稳定,而在flash ...

随机推荐

  1. [转载] K3漏油器全紫铜替换原硅胶垫教程。标准姿势

    首先感谢坛友的支持,全铜套件已经完成了.有的坛友希望有个教程.在这里大体说一下技巧吧.下面步入正题. 声明:本教程图片大部分均来源于给坛友改装时所拍.如有雷同,概不负责!!!声明:本教程图片大部分均来 ...

  2. Redis源代码分析(十三)--- redis-benchmark性能測试

    今天讲的这个是用来给redis数据库做性能測试的,说到性能測试,感觉这必定是高大上的操作了.redis性能測试.測的究竟是哪方面的性能,怎样測试,通过什么指标反映此次測试的性能好坏呢.以下我通过源代码 ...

  3. Tomcat 启动或者发布项目时提示Publishing failed:Resource /xxxx does not exist

    解决方法: 刷新一下项目,有可能是磁盘文件和Eclipse项目中文件不一致造成的. 重新启动eclipse 删除tomcat server 重新发布下即可

  4. Web 目录枚举与遍历漏洞解决

    "目录枚举漏洞"解决方法 一.名词解释 网站目录枚举漏洞:指黑客利用非法攻击手段扫描符合"8.3"命名原则的目录与文件. 二.验证工具:scanner-comp ...

  5. hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作

    Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generate ...

  6. pugixml 的常见读写操作

    pugixml github地址 : https://github.com/zeux/pugixml pugixml 可以在github上直接下载到源码,包括两个头文件(pugixml.hpp  pu ...

  7. ecplise内存配置

    -server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256m -XX:+UseG1GC

  8. LoadRunner调用md5方法

    LoadRunner调用md5方法 上一篇 / 下一篇  2011-04-29 11:25:12 / 个人分类:Loadrunner 查看( 958 ) / 评论( 0 ) / 评分( 0 / 0 ) ...

  9. Hive命令行经常使用操作(数据库操作,表操作)

    数据库操作 查看全部的数据库 hive> show databases ; 使用数据库default hive> use default; 查看数据库信息 hive > descri ...

  10. 【SpringMVC学习05】SpringMVC中的参数绑定总结——较乱后期准备加入 同一篇幅他人的参数绑定

    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...