简单的流媒体服务器

本文描述的代码位于https://github.com/greenjim301/pmedia

一直以来都希望能把自己平时工作中积累的东西分享出来,这个简单的流媒体服务器算是一次重要的尝试。这个流媒体服务器支持RTSP发流,收流协议支持RTSP、GB28181和RTMP。下面对这个流媒体服务器的实现做一个简要的介绍。

整个服务器的基座是一个多线程网络、消息通信框架。之前写的几个项目我也封装了一个类似的框架,而且是跨平台的,支持Windows、Linux和Android。但我对这个跨平台的框架不是太满意,为了跨平台做了太多妥协。所以在写这个服务器的时候,把这个框架做了精简与优化,只支持Linux,我对这个框架满意多了。

RTSP发流与收流都是我自己实现的,之前写过RTSP的服务器和客户端,这次做了一个整合。RTP的解析与构建都是用ffmpeg的代码实现的。

GB28181的实现借助了osip2和tinyxml2。osip2用于SIP消息的解析与构建,tinyxml2用于XML消息体的解析。国标实现最大的难点在于PS流解析提取ES流,这部分代码挪用了ffmpeg的PS解析代码。由于应用场景不一样,ffmpeg的PS解析代码并不是直接拿过来就能用,期间调试校订了好久才能正确工作。得到ES流后,从ES流提取NALU、拆分RTP包的代码基本都是照搬ffmpeg的代码。GB28181协议内容很多,我只实现了注册和取流部分,满足这个服务器的基本要求。网上我见比较多写GB28181协议的可能是要付费才给看代码的,每个人的选择不一样,我是倾向于分享的,但受限于时间和精力,我也很难去补全GB28181的实现。唯希望我的代码能起到抛砖引玉的作用,为想实现国标的人提供一个思路。

RTMP的实现基于LIBRTMP,从LIBRTMP读到的媒体流是FLV封装的,所以难点就是FLV的解析。我还是借用了ffmpeg的FLV解析代码。相较于移植PS流解析的代码,FLV解析代码的移植容易了许多。其中有2处解析在ffmpeg中没有找到明确的实现,我是自己实现的。AVCDecoderConfigurationRecord解析参照规范14496-15实现,AudioSpecificConfig解析参照规范14496-3实现。特别要提到AudioSpecificConfig解析的实现,网上能搜索到一些实现,但大多只给出了代码,没有讲出AudioSpecificConfig的具体定义,这样的代码我是不敢用的。我去看了14496-3规范定义后发现网上有的实现是不对,没有考虑到所有的分支。所以在实现协议之前一定要读一下协议规范文档,要知其然,更要知其所以然。

我写的这几个项目,都大量引用到了ffmpeg和webrtc的代码。做流媒体很难避开这2个项目,学习这2个项目的代码是有助于流媒体开发的。开发中遇到的问题,很可能从这2个项目的代码中能找到答案。
 

你可能感兴趣的:(简单的流媒体服务器)