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. Gradle笔记系列(一)

    1.Gradle概述 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的 ...

  2. 文件上传——servlet实现

    自己对照别的博主的博客实现的,记录用. 整个上传的结构如下: 上传的页面:unload.jsp <%@ page language="java" import="j ...

  3. 【如何快速的开发一个完整的iOS直播app】(原理篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...

  4. IOS中无缓存的图片载入

    在IOS中,我们常用[UIImage imageNamed]方法获取图像,这种方法简便,容易理解.但是有个缺点,就是有缓存.这种方式 传人的图像的就是通过文件名方式文件名.如果,我们内存有限,我们就必 ...

  5. [转]protobuf-2.5.0.tar.gz的下载与安装

    protobuf-2.5.0.tar.gz的下载与安装 原文地址:http://blog.csdn.net/tdmyl/article/details/31811317 版权声明:本文为博主原创文章, ...

  6. 建站阿里云、amh主机面版

    阿里云 Nginx+tomcat7+Mencached负载均衡集群配置 http://blog.csdn.net/zht666/article/details/38515147 apache2.2.1 ...

  7. 即时通讯 TCP UDP

    TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  8. python第一天基础1-2

    python入门 1 第一个python代码: 在linux上创建第一个.py脚本 #!/usr/bin/env python #-*- coding:utf-8 -*- print "He ...

  9. WCF 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的

    一个项目需要用到推送的功能,就是服务器主动推送数据给多台客户机.于是采用了WCF的双工通讯netTcpBinding 写好的项目,在本机测试都没有问题. 如果放在局域网内测试,问题出来了:先是安全性问 ...

  10. 优化后的 google提供的汉字转拼音类(针对某些htc等手机的不兼容情况)

    /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Versi ...