https://www.cnblogs.com/wangqiguo/p/6014519.html

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的时候报告下面的错误:
1

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

之后出现下面的错误:
2

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

3

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

4

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

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

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编译完成的界面如下:
6

安装完成的界面如下:

7

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

9

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

9

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

1

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

1

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

1

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

1

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

 1

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

1

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

11

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

1

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

1

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

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

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

1

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

1

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

1

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

1

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

1

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

1

推流到crtmpserver

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

1

设置视频捕获源:

1

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

1

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

1

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

从crtmpserver播放直播流

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

1

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

1

 

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

 

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

 

 

 

#1楼 2016-10-31 08:38 吉他爱好者  

     
 

辛苦了,真心不错

 
     

#2楼[楼主] 2016-10-31 09:08 薰衣草的旋律  

     
 

@ 吉他爱好者
谢谢,写一篇文章真的要花费很大的精力,包括截图,排版,还要校对文字错误。所以都不是一天完成的。不过好像园子里对这类文章的热度不是很大,感觉大家对手把手教做项目类型的文章更感兴趣。如果觉得还不错,帮忙推荐下啦,谢啦。

 
     

#3楼 2017-02-06 15:32 Jacky..xu  

     
 


我配置后的错误

 
     

#4楼[楼主] 2017-02-06 15:49 薰衣草的旋律  

     
 

@ Jacky..xu
看看appselector这个项目是否编译成功,报错显示你这个dll没有生成

 
     

#5楼 2017-02-06 16:10 Jacky..xu  

     
 

@ 薰衣草的旋律
我是生成了这个dll的,位置和程序实在一起的

 
     

#6楼[楼主] 2017-02-06 16:14 薰衣草的旋律  

     
 

@ Jacky..xu
你看看报错信息呀,哥,启动的时候加载这个dll的路径不是跟crtmpserver程序在一个目录的,你看看报错信息是说 applications\appselector\appselector.dll 找不到。 你最好是用VS工具直接运行,否则你要自己拷贝到相应的目录。

不要动不动就加QQ,都在工作,哪里有时间帮你单独辅导呀

 
     

#7楼[楼主] 2017-02-06 16:40 薰衣草的旋律  

     
 

@ Jacky..xu
感觉还是你的路径的问题,不应该找不到dll,我现在公司电脑没有这个项目,要晚上回家才能看

 
     

#8楼 2017-02-06 16:42 Jacky..xu  

     
 

@ 薰衣草的旋律
嗯,晚上再交流,你忙你先忙吧,也不急一时,谢谢了。

 
     

#9楼 2017-02-06 19:54 Jacky..xu  

     
 

@ 薰衣草的旋律
用家里的电脑竟然配好了,,额,一样的操作,,

 
     

#10楼 2017-02-06 19:58 Jacky..xu  

     
 

@ 薰衣草的旋律
不过配置成功了怎么点击这个打不开出现上面成功的界面,打开闪一下就没了,到时候用的时候服务怎么开,不会还是VS开始执行(不调试才可以吧)。。。

 
     

#11楼[楼主] 2017-02-07 13:18 薰衣草的旋律  

     
 

@ Jacky..xu
当然不用每次都在VS中打开,可以自己发布到一个文件夹的,把applications整个拷贝过来,dll也都拷贝过来。但是即使没问题, 手工双击运行也会出现cmd控制台的这个黑界面。 windows里面后台运行crtmpserver我还没试过,我不在windows下面工作这个教程也仅仅是希望更加全面一点,建议服务器用linux,我之前的crtmpserver服务器都是使用的linux服务器。 后台运行有一个daemon参数。

 
     

#12楼 2017-02-07 14:08 Jacky..xu  

     
 

@ 薰衣草的旋律
暂时没有Linux系统,可以用虚拟机代替?

 
     

#13楼[楼主] 2017-02-08 11:49 薰衣草的旋律  

     
 

@ Jacky..xu
可以,只要你能访问到虚拟机的ip,跟用普通机器一样的

 
     

#14楼 2017-02-09 16:31 Jacky..xu  

     
 

@ 薰衣草的旋律
嗯,谢谢!

 
     

#15楼 2017-07-12 05:20 ccx0307  

     
 


你好:
昨晚通过博客园给我转发的邮件收到,感谢博客园和你百忙中的回答,现在还有些问题咨询:
原理拓扑图见图片,我们流媒体设备都是通过互联网推送到内网服务器,再从内网服务器远程播放。你请帮忙分析下,谢谢。另外流媒体端口只开放1935就可以了吗?

谢谢!

 
     

#16楼[楼主] 2017-07-14 11:17 薰衣草的旋律  

     
 

@ ccx0307
我给出一些建议,如果是我我大概会这么找问题:
1. 内网是不是通的,首先 排除这么复杂的网络环境,搭建一个比较单纯的网络环境,比如在一个小局域网里面测试是否有问题,先要保证服务器这边没有问题是可用的,然后再排除网络问题。否则这么多问题绞在一起,哪里都有怀疑,那怎么定位问题呢。
2.如果内网没问题,证明服务器这块没有问题至少是保证内网的推流播放是OK的,也就是你的crtmpserver本身架设的没问题。这个确定之后,再放到你的网络环境中测试。
3.关于你的网络环境,我的想法是做端口映射应该是可以的,我之前在局域网中搭建过web服务,通过端口映射,然后在外面访问那个局域网的对外ip地址,通过端口映射访问到局域网中搭建的web服务是没问题的,流媒体服务无非就是换了一个端口而已应该没问题。一般只需要1935就可以了。 这种方式要注意的是,你的路由器对应的外网ip会不会变化。
4.可以用通过下面的方法来检测你这个网络环境问题:
<1> 你可以搭建一个简单的web服务,输出一个Hellworld即可,映射到80或者其他端口,然后在外面访问看能否访问到里面的web服务。这个都不行,那流媒体自然也不行了,证明你的网络还是有问题的。
<2> 使用wireshark抓包

 
     

#17楼 2017-08-08 17:28 big_hand  

     
 

我想请问下我编译成功了,也用OBS推流了,抓包也能看到有流送到服务这边来,但是用vlc播放就不成功,播放地址应该是rtmp: //127.0.0.1/live/test 对吧,但是老是提示
TCPCarrier::OnEvent:Unable to read data. 127.0.0.1:1989 -> 127.0.0.1:1935 错误,不知道是什么原因,您有遇到过这种情况吗?请教一下!谢谢!

 
     

#18楼 2017-08-22 14:31 ok_boy  

     
 

@ big_hand
我也是这样,请问你解决了吗

 
     

#19楼[楼主] 2017-09-06 20:21 薰衣草的旋律  

     
 

@ ok_boy
@big_hand
不好意思,很久没有登录。有几个办法可以验证。
1.用ffmpeg拉流看能否成功
2.确定vlc版本是否有问题,你的vlc版本拉别的rtmp可以吗
3.用flash播放器

 
     

#20楼 2017-09-06 20:32 ok_boy  

     
 

@ 薰衣草的旋律
博主知道怎么设置crtmpserver延时为0吗,就是配置一个直播服务器,没有延时

 
     

#21楼 2017-10-10 17:30 ok_boy  

     
 

楼主,为啥我编译成功后打开工程在调试状态下运行是可以跑的,但是如果我直接双击Debug目录下的crtmpserver.exe却运行不起来,直接闪退了

 
     

#22楼[楼主] 2017-10-12 19:24 薰衣草的旋律  

     
 

@ ok_boy
直接双击是肯定跑不了的,认真看博客,都有说。你要打包成独立的程序双击跑起来,你就要把相关的dll拷贝到一个目录下面,否则crtmpserver.exe怎么去加载那些dll呢?调试状态下可以起来是因为编译器做了这个工作了。

 
     

#23楼[楼主] 2017-10-12 19:26 薰衣草的旋律  

     
 

@ ok_boy
openssl的相关dll有没有拷贝到程序目录下?你这个问题基本上跟运行是加载dll有关系,编译环境可以跑起来说明编译没问题。

 
     

版权声明:本文为jukan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jukan/p/9229095.html