crtmpserver简介

我们在第一章的时候已经简要说明了crtmpserver,crtmpserver是一个由C++语言编写的开源的RTMP流媒体服务器,与其对应的商业产品自然是Adobe公司的FMS。与FMS相比,从功能上来说crtmpserver只能称为FMS的简化版本,其功能并没有FMS那么完善甚至是远远没有达到。其与flash player的兼容性自然也比不上官方的FMS了。但是crtmpserver提供了最常见的RTMP实现。作为开源的高性能RTMP流媒体服务器,不仅可以用在x86平台的linux服务器,windows服务器,还可以被用在arm等嵌入式平台上。crtmpserver的代码结构良好,类的继承体系清楚,代码效率高。是学习RTMP协议和服务器端编程的好例子。

crtmpserver的官方网站是www.rtmpd.com 但是目前该网站好像是出了问题,并不能打开,crtmpserver的google论坛上有网友说crtmpserver的源码暂时移动到github上了,具体地址是https://github.com/shiretu/crtmpserver 如果大家想要下载到最新的crtmpserver源码,可以到该git页面上下载。后续还请关注crtmpserver的官方网站。

本系列文章并不打算使用该git上下载的代码,由于之前工作中使用的crtmpserver代码是基于717的版本,所以该系列也将基于此版本作为讲解。请在这里下载crtmpserver-717.tar.gz 代码包,其关联的openssl代码为 openssl-1.0.1c.tar.gz

linux下编译与运行crtmpserver

本次linux使用的发行版是Ubuntu 10.10,各个编译工具版本如下:
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
cmake version 2.8.7

crtmpserver源码依赖openssl,所以我们需要先编译openssl库,并安装相关的头文件。另外crtmpserver使用的cmake工具进行源代码的编译管理,所以也需要安装cmake。

openssl的编译:本次使用的是openssl-1.0.1c.tar.gz 解压之后在源码根目录直接运行:
$ ./config
$ make
$ make test
$ make install

crtmpserver的编译:解压上面下载到的gz压缩包,运行下面命令:
cd crtmpserver-717/builders/cmake/
cmake .
make

在make的时候报告下面的错误:

在文件tinyxmlparser.cpp中有一个变量ptrdiff_t没有定义,我们打开该文件,在第407行将变量ptrdiff_t加上std的前缀即可,改为 std::ptrdiff_t,之后继续make

之后出现下面的错误:

说有一个变量objectEncoding定义之后没有使用,而警告被当作错误处理。我们只需要修改一下CMakeFileLists.txt 找到如下这一行,注释掉即可,其实主要是去掉-Werror选项:

修改CMakeFileLists.txt之后需要重新cmake 这样会重新生成Makefile文件,然后再make直到完成,最后完成之后的信息是这样的:

运行crtmpserver,编译完成之后此时的目录还在crtmpserver-717/builders/cmake/目录下,直接运行下面的命令:
./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua

程序成功运行之后的显示如下,表示成功运行:

windows下编译与运行crtmpserver

首先在windows下编译crtmpserver也需要windows版本的openssl,所以我们需要先编译windows版本的openssl。

编译windows版本的openssl:将openssl解压之后,有一个INSTALL.W32或者INSTALL.W64,里面有如何编译windows版本的openssl的说明,我们以win32为例子。

编译openssl需要perl的支持,我们先安装windows环境下的perl工具,其下载地址为:http://www.activestate.com/activeperl 我的电脑是64位的,所以我下载的是 ActivePerl-5.24.0.2400-MSWin32-x64-300558.exe 直接安装,在安装的下一步中选择 “Typical”就可以。

安装完成之后,我们就可以开始编译windows版本的openssl了,步骤如下:

<1>. 我用的是VS2010。其他的版本应该差不太多,打开“开始”---“程序”---“Microsoft Visual Studio 2010”---“Visual Studio Tools”---“Visual Studio 命令提示(2010)”,注意这里要从菜单中打开VS 2010的命令行,会自动设置一些环境变量的,如果直接运行“开始”---“运行”--cmd.exe这个命令行的话,可能编译的时候找不到头文件等。
<2>. 在上面打开的VS2010的命令行中,cd到openssl源码根目录,然后运行下面的命令:
perl Configure VC-WIN32 no-asm --prefix=c:/openssl-1.0.1c  
指定配置,并设置openssl的安装目录
<3>. ms\do_ms
<4>. 将nmake.exe所在的路径添加到系统环境变量,例如我找到nmake.exe是在D:\Program Files\Microsoft Visual Studio 10.0\VC\bin下面
<5>. 将D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE添加到环境变量,因为cl.exe需要的mspdb100.dll在这个目录下,否则会返回0x80错误。同样你也应该在你自己的VS2010的相关安装目录下找。
<6>. nmake -f ms\ntdll.mak
<7>. nmake -f ms\ntdll.mak test 这一步是编译测试,可以不做,仅仅是为了测试上面的是否编译好了
<8>. nmake -f ms\ntdll.mak install  这一步是安装,会安装到我们的第4步指定的 --prefix=c:/openssl-1.0.1c 目录中也就是拷贝相关的库文件到这里

windows下的openssl编译完成的界面如下:

安装完成的界面如下:

现在开始编译windows版本的crtmpserver,打开crtmpserver的源码目录中的builders\VS2010\VS2010.sln 工程,直接在解决方案上面右键,生成解决方案。会出现错误提示找不到openssl的头文件:

在VS2010中crtmpserver的各个模块被单独做为项目工程,很多工程都用到了openssl,所以我们需要设置一个全局的openssl的头文件和库文件的路径。在VS2010中设置全局包含没有VC那么方便,首先打开属性管理器窗口:

再打开面板中随便选择一个项目,展开如图的界面,双击如图所示指定的项目文件,并在弹出的界面中指定包含目录路径:

用同样的方法指定库文件的路径:

继续编译,发现报错如下:

将上图中所示的两处地方,0值改成(uint32_t)0; 继续编译,报告一个链接错误,并且还有一些intellisense错误,如下:

在crtmpserver官方源码提供的VS2010.sln解决方案中有两个源文件没有添加到工程中来,我们手工添加进来,如下图,打开thelib工程,展开如下图的rtp目录,右键添加现有项目:

选择头文件nattraversalprotocol.h 该文件在源码目录的sources/thelib/include/protocols/rtp/目录下:

同样的方法添加cpp文件,cpp文件所在的目录为sources/thelib/src/protocols/rtp/目录:

添加完成之后继续生成解决方案,解决方案生成成功,我们需要设置一下运行的命令行参数:--use-implicit-console-appender crtmpserver.lua 表示打印控制台日志,并且使用工作目录下的crtmpserver.lua作为配置文件,将工作目录设置成$(OutDir)该变量对应的目录实际上是crtmpserver-717\builders\VS2010\Debug,我们的程序最终编译之后的执行文件和库文件就放在这个目录下:

我们可以打开编译成功之后文件生成的目录中的文件如下,目录为builders/VS2010/Debug/目录:

直接点击VS2010的菜单的“开始执行(不调试)”,这样cmd输出窗口最后输出完成之后,会输出一行“请按任意键继续…”否则一闪而过出错也看不清楚。

运行之后干脆报下面的错误:

程序直接崩溃,原来openssl的相关dll没有拷贝到我们的程序目录下,我们拷贝过来:

继续运行,发现报错如下:

我们去掉配置文件中的ssl权限验证相关的内容:

注释掉相关节点之后,继续运行,仍然报错:

错误显示配置中指定的log的路径设置有问题,继续修改配置如下:

再次运行,显示运行成功,界面如下:

推流到crtmpserver

编译成功crtmpserver之后,我们试着将直播流推送到服务器上,然后直播。没有摄像头,我们可以使用开源的obs软件推送直播流,下载安装就不说了,相信做过游戏直播的都多少了解。下面是obs打开之后的界面:

设置视频捕获源:

点击主界面右下角的“设置”按钮进入推流的参数设置,我们主要是设置“串流”选项卡中的内容,crtmpserver的配置文件中默认配置有live这个推流点,所以我们的推流路径是rtmp://127.0.0.1/live/ 随便设置一个直播流名,例如这里设置的是test,设置好之后如下图,点击确定即可。

然后点击主界面上的“开始串流”按钮开始 推流,可以看到推流成功之后,在我们的crtmpserver运行的控制台窗口中会有一些日志打印出来:

从最后两行的日志中我们可以看到流test已经成功注册。

从crtmpserver播放直播流

如何播放刚才推送的流呢,我们找一个支持rtmp协议的播放器,vlc的最新版本应该是支持rtmp协议的播放的。另外flash播放器也是一个很好的选择,在播放器中输入地址和流名:

播放效果如下,截的是电脑桌面:

到此,我们整个crtmpserver源码的windows平台的编译,linux平台的编译,推流,播放就算完整了。可以看到windows的编译要比linux复杂的多,其实很多开源软件对linux要更加友好一点,包括编译运行的过程都要顺利一点。后面的章节中,我们将开始分析crtmpserver的架构、RTMP协议的细节,MP4文件的格式,最后我们将实现HLS功能(原生的crtmpserver是没有HLS的)。

如果本文对您有所帮助,您的赞,会让我有更大的信心写好后面的文章呢。

crtmpserver系列(二):搭建简易流媒体直播系统的更多相关文章

  1. 利用red5搭建一个简单的流媒体直播系统

    http://blog.sina.com.cn/s/blog_51396f890102exmz.html 一.red5安装.设置. 这个过程就不多说了,参见http://blog.csdn.net/l ...

  2. 优秀开源项目之二:流媒体直播系统Open Broadcaster Software

    Open Broadcaster Software(OBS)是一款用于音视频录制和直播的免费开源软件.可以轻松部署到多种平台,目前支持Windows.MAC和Linux. 特性: 1.高性能的实时视频 ...

  3. IdentityServer4系列 | 快速搭建简易项目

    一 .前言 从上一篇关于 常见术语说明中,主要是对IdentityServer4的说明,以及其中涉及常见的术语的表述说明,包括对身份认证服务器.用户.客户端.资源以及各个令牌等进行对比区别说明. 而在 ...

  4. springcloud系列二 搭建注册中心启动

    创建modul 然后就创建完成了 添加yml文件: server: port: eureka: client: register-with-eureka: false #单机版建议设置为false,设 ...

  5. window 平台搭建简单的直播点播系统

    Windows平台如何搭建简单的直播系统前文已经有介绍,今天介绍下如何搭建简单的点播系统. 同样还是利用crtmpServer,crtmpServer可以从github中下载,可以从群里下载(群里有修 ...

  6. 分布式流媒体直播服务器系统 For Linux

    在之前的一篇<基于Darwin实现的分布式流媒体直播服务器系统>中,我们配置了在Win32下面的流媒体直播系统,今天我们分享一下在Linux下面EasyDSS分布式直播服务器系统的配置. ...

  7. 搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3

    Web GIS系列: 搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 使用GeoServer+QGIS发布WMTS服务 使用GeoSe ...

  8. 用Qt写软件系列三:一个简单的系统工具(上)

    导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...

  9. windows平台简易直播系统搭建

    最近做直播系统的朋友很多,正好前端时间也在做这一块,写片文章分享下开发心得,以为后用. 直播系统我将它分为前堆推流,后台服务,客户端播放三大部分.前端推流基于ffmpeg,后台服务 使用crtmp服务 ...

随机推荐

  1. npm 加速方案

    使用npm install 包,是见比较头疼的事情,比较慢,很难等,经过探索,还是发现有办法加速的,方法有两个,让我一一道来: 1. 在npm 后添加参数 --registry=... 指定镜像源地址 ...

  2. hdu 5876 (补图BFS) Sparse Graph

    题目:这里 题意: 相当于一开始给一个初始好了的无向完全图给你,然后给让你删除m条边,再给你一个点v,最后问你在剩下的图里从这个点v出发能到达所有边点的最小路径是多少? 一看是所有点的最小路径,一看就 ...

  3. ng animate

    要在angular中加入动画必须引入angular.animate.js插件,然后就可以在module中引入ngAnimate模块.如: var module1 = angular.module('m ...

  4. GPU高性能计算-CUDA

    前段时间有个同学的毕设是搞并行计算的,他基本不懂编程把我拉过去帮忙,我之前也没弄过,帮着搞了2天.先把代码贴上去,等有时间在把详细补充一些内容. CUDA编程主要是利用了显卡优越的并行计算能力,把一个 ...

  5. <停车位>version1.0

    <停车卫> 产品需求说明书 文档版本号: Version 1.0 文档编号: xxxx 文档密级: 归属部门/项目: 产品名: 停车卫 子系统名: 编写人: kina 编写日期: 2015 ...

  6. PHP的继承方法如何获取子类名

    http://blog.csdn.net/zls986992484/article/details/53154097 PHP后期静态绑定问题:例如 <?php class A { functio ...

  7. Bootstrap组件

    1.Bootstrap组件——Glyphicons图标字体 图标字体:可以表示的文字不是abcd或1234,而是一个又一个图形符号,比直接使用图片好处:可以任意放大不会失真:所有能使用文字的地方都可以 ...

  8. ifmodule

    <IfModule>   指令   说明  封装指令并根据指定的模块是否启用为条件而决定是否进行处理  语法   <IfModule [!]module-file|module-id ...

  9. NOIP2010 题解

    机器翻译 题解:模拟 #include <cstdio> #include <cstring> ; ], ]; int main(){ memset(, sizeof(in)) ...

  10. redis命令总结

     Redis命令总结 redis 127.0.0.1:6379> info  #查看server版本内存使用连接等信息 redis 127.0.0.1:6379> client list  ...