EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路 - Go语言中文社区

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


背景

近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够很好滴满足当下日益火热的互联网直播/录播的需求,我们计划在当前节点EasyDarwin-v7.3.17.0325基础上继续扩展几个功能:

  1. EasyDarwin服务器端直播存储功能;
  2. 对RTSP直播推流同步输出RTMP、HLS直播功能;
  3. 直接接入RTSP IPCamera输出RTMP、HLS直播功能;

实现思路

在未实现之前,我们仅仅来讨论一个实现的思路,相信经过时间和实践的推移,技术问题都能够得到很好的解决!

我们考虑使用EasyDarwin集成ffmpeg的方案,实现上述功能,在之前的EasyDarwin版本(EasyDarwin-7.0.5-Build16.0518)中,我们也实现过类似于同步输出HLS的功能,当时实现同步输出的方法是,在EasyDarwin中另起一个Module,然后采用每一个同步输出的Session都通过请求当前直播RTSP流,再转换成HLS流输出的方式进行的,也就是服务器内部自己请求自己的网络流(走127.0.0.1),这种方式对音视频流的流转过于复杂,这里就不再赘述;

新的实现思路,我们希望直接在EasyDarwin内部将EasyPusher等推流工具推送来的直播流,不用再次经过网络流,而是服务器内部直接memory copy的方式将SDP+RTP数据递交给ffmpeg进行处理,直接就输出文件、RTMP、HLS;

EasyDarwin_HLS

按照上图所示,EasyDarwin内部的各个Module之间数据交互,直接就可以通过内存的形式将SDP+RTP数据,传递给各个模块进行各自对应的处理,那么关键问题就是这个sdp+RTP由QTSSReflectorModule传递给EasyRTMPModule、EasyHLSModule、EasyRecordModule这些模块如何进行处理,如何调用ffmpeg相关接口才能达到输出我们需要的数据的目的,那么这个过程,其实我们可以参考ffmpeg中关于ffmpeg获取RTSP/RTP流转换成各种output的调用流程,ffmpeg.exe获取RTSP的主要基本流程是:

DESCRIBE:获取到直播流的sdp描述信息;
SETUP、PLAY:建立RTP直播流数据传输通道;
RTP:不同track的音视频直播RTP包;

那么这整个流程对比我们EasyDarwin中的sdp和RTP数据处理流程,也就是EasyDarwin中免去了SETUP、PLAY流程,以及网络读取RTP数据的流程,直接就可以将EasyDarwin收到推送端的sdp信息和源源不断的RTP数据提交给ffmpeg处理,进行不同的输出(Record、RTMP、HLS),而这个过程中,如果视频流是H.264,音频流是AAC,那么我们就直接vcodec copy、acodec copy就行了,如果不是,那么我们就需要调用ffmpeg进行一次转码,将音视频流转成H.264&AAC;

相信模仿ffmpeg.c中的实现流程,可以满足EasyDarwin后续的功能迭代的需求!

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2017

EasyDarwin

转载于:https://www.cnblogs.com/babosa/p/7348779.html

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_30823001/article/details/97686498
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 16:39:23
  • 阅读 ( 1424 )
  • 分类:Go开源项目

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢