今天我们搭建这个 rtsp 服务器的名称叫做:ZLMediaKit,它是一个基于 C++11 的高性能运营级流媒体服务框架,类似我之前给大家搭建的 rtmp 服务器(srs 流媒体服务器),当然它两者肯定是有区别的,这里我们就不做比较。
它也是一个开源项目,该开源项目的介绍,大家可以看官网介绍,在 github 和 gitee 都有:
github 网址:
https://github.com/xia-chu/ZLMediaKit
复制代码
gitee 网址:
https://gitee.com/xia-chu/ZLMediaKit
复制代码
官网上有介绍该项目的特点:
基于 C++11 开发,避免使用裸指针,代码稳定可靠,性能优越。
支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181/HTTP-TS/WebSocket-TS/HTTP-fMP4/WebSocket-fMP4/MP4/WebRTC),支持协议互转。
使用多路复用/多线程/异步网络 IO 模式开发,并发性能优越,支持海量客户端连接。
代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。
支持 linux、macos、ios、android、windows 全平台。
支持画面秒开、极低延时(500 毫秒内,最低可达 100 毫秒)。
提供完善的标准 C API,可以作 SDK 用,或供其他语言调用。
提供完整的 MediaServer 服务器,可以免开发直接部署为商用服务器。
提供完善的 restful api 以及 web hook,支持丰富的业务逻辑。
打通了视频监控协议栈与直播协议栈,对 RTSP/RTMP 支持都很完善。
全面支持 H265/H264/AAC/G711/OPUS。

功能图
如果你想了解更多关于这个服务器的功能和代码,可以去官网查看,这里我就不多说了,下面开始基于此搭建这个服务器;首先说明的是,我这里使用的环境是 ubuntu16.04,其实也可以用其它的环境搭建,在官网的 wiki 教程中有详细的介绍:
https://github.com/xia-chu/ZLMediaKit/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
复制代码
rtsp 服务器搭建视频文档资料地址:https://docs.qq.com/doc/DWHhNTlVtaFJId0ht
国内⽤户推荐从同步镜像⽹站 gitee 下载:
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
root@txp-virtual-machine:/home/txp/share# mkdir rtsp
root@txp-virtual-machine:/home/txp/share# cd rtsp/
root@txp-virtual-machine:/home/txp/share/rtsp# ls
root@txp-virtual-machine:/home/txp/share/rtsp# git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit.git
Cloning into 'ZLMediaKit'...
remote: Enumerating objects: 548, done.
remote: Counting objects: 100% (548/548), done.
remote: Compressing objects: 100% (499/499), done.
remote: Total 548 (delta 60), reused 213 (delta 21), pack-reused 0
Receiving objects: 100% (548/548), 6.81 MiB | 132.00 KiB/s, done.
Resolving deltas: 100% (60/60), done.
Checking connectivity... done.
然后切换到 ZLMediaKit 目录下,记得执行下面这条语句:
root@txp-virtual-machine:/home/txp/share/rtsp# cd ZLMediaKit/
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit# ls
3rdpart AUTHORS build_for_linux.sh CMakeLists.txt docker postman server www
Android benchmark.md build_for_mac.sh conf LICENSE README_en.md src
api build_docker_images.sh cmake _config.yml package README.md tests
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit# git submodule update --init
Submodule 'ZLToolKit' (https://gitee.com/xia-chu/ZLToolKit) registered for path '3rdpart/ZLToolKit'
Submodule '3rdpart/media-server' (https://gitee.com/xia-chu/media-server) registered for path '3rdpart/media-server'
Cloning into '3rdpart/ZLToolKit'...
remote: Enumerating objects: 1203, done.
remote: Counting objects: 100% (1203/1203), done.
remote: Compressing objects: 100% (1081/1081), done.
remote: Total 5951 (delta 884), reused 161 (delta 120), pack-reused 4748
Receiving objects: 100% (5951/5951), 31.25 MiB | 120.00 KiB/s, done.
Resolving deltas: 100% (4406/4406), done.
Checking connectivity... done.
Submodule path '3rdpart/ZLToolKit': checked out '1df5d6823fc48598c23fd425c5187b0c417a734f'
Cloning into '3rdpart/media-server'...
remote: Enumerating objects: 10370, done.
remote: Counting objects: 100% (10370/10370), done.
remote: Compressing objects: 100% (3708/3708), done.
remote: Total 10370 (delta 7635), reused 9114 (delta 6544), pack-reused 0
Receiving objects: 100% (10370/10370), 2.78 MiB | 144.00 KiB/s, done.
Resolving deltas: 100% (7635/7635), done.
Checking connectivity... done.
Submodule path '3rdpart/media-server': checked out 'ec171caa4b28db0f6ea47bca2c0c9530f345698a'
注意:在编译这个代码之前,你的安装环境一定要安装 cmake 和 gcc 版本在 4.8 以上,不然的话,可能会出现问题。
关注+私信我,领取2022最新最全学习提升资料,内容包括(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)

2、安装依赖库:
ZLMediaKit 可选依赖一些第三方库,这些库都不是必选的;在构建 ZLMediaKit 时,cmake 能查找系统路径中的这些库,并根据安装情况选择是否开启相关特性,你可以选择安装这些依赖并启用相关特性:
openssl
flash player 在播放 rtmp 时,采用的是复杂握手模式,如果不安装该库,flash player 将播放不了 zlmediakit 提供的 rtmp url.
同时 ZLMediaKit 的 https/rtsps 相关功能需要使用 openssl 才能开启。
ffmpeg
zlmediakit 可以通过 fork ffmpeg 进程的方式实现多种协议的拉流,编译时不需要安装 FFmpeg。
sdl、avcodec、avutil
这 3 个库供 ZLMediaKit 的 test_player 测试程序使用,你通常不需要安装这 3 个库。
#除了openssl,其他其实都可以不安装sudo apt-get install libssl-devsudo apt-get install libsdl-devsudo apt-get install libavcodec-devsudo apt-get install libavutil-devsudo apt-get install ffmpeg
先建立一个 build 目录,然后切换到该目录下去:
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit# mkdir buildroot@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit# cd build
cmake
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Debug版本
-- found library:/usr/lib/x86_64-linux-gnu/libssl.so;/usr/lib/x86_64-linux-gnu/libcrypto.so,ENABLE_OPENSSL defined
-- Performing Test HAVE_MYSQL_OPT_EMBEDDED_CONNECTION
-- Performing Test HAVE_MYSQL_OPT_EMBEDDED_CONNECTION - Failed
-- MySQL not found.
-- ENABLE_HLS defined
-- ENABLE_MP4 defined
开始正式编译:make -j4:

编译过程
ZLMediaKit 工程主要生成 3 种二进制目标文件,他们的生成的路径在 release 目录下,这些目标文件主要分为(这里我只介绍一种,另外一种感兴趣的朋友可以查看官网介绍哈!):
MediaServer 进程:
这是 ZLMediaKit 作为服务器的主进程,该进程可以在免去开发的情况下直接作为测试流媒体服务器使用,如果你需要更复杂的业务逻辑,可以通过 Web HOOK 和 RESTful API 实现,同时你可以通过配置文件控制其参数。
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit/release# cd linux/Debug/
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit/release/linux/Debug# ls
api_tester_pusher libflv.a libmpeg.a tab test_httpApi test_rtcp test_wsClient
api_tester_server libjsoncpp.a libzlmediakit.a test_bench_proxy test_httpClient test_rtp test_wsServer
api_tester_websocket libmk_api.so libzltoolkit.a test_bench_pull test_pusher test_server
bom libmov.a MediaServer test_bench_push test_pusherMp4 test_sortor
我们可以通过./MediaServer -h 了解启动参数:
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit/release/linux/Debug# ./MediaServer -h
-h --help 无参 默认:null 选填 打印此信息
-d --daemon 无参 默认:null 选填 是否以Daemon方式启动
-l --level 有参 默认:0 选填 日志等级,LTrace~LError(0~4)
-m --max_day 有参 默认:7 选填 日志最多保存天数
-c --config 有参 默认:/home/txp/share/rtsp/ZLMediaKit/release/linux/Debug/config.ini 选填 配置文件路径
-s --ssl 有参 默认:/home/txp/share/rtsp/ZLMediaKit/release/linux/Debug/ssl.p12 选填 ssl证书文件或文件夹,支持p12/pem类型
-t --threads 有参 默认:2 选填 启动事件触发线程数
-v --version 无参 默认:null 选填 显示版本号
开始运行:
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit/release/linux/Debug# ./MediaServer -d &
[1] 57310
root@txp-virtual-machine:/home/txp/share/rtsp/ZLMediaKit/release/linux/Debug# 2021-04-18 21:41:11.260 D MediaServer[57310-139825250957120] System.cpp:100 startDaemon | 启动子进程:57313
2021-04-18 21:41:11.260 I MediaServer[57313-139825250957120] System.cpp:130 systemSetup | core文件大小设置为:18446744073709551615
2021-04-18 21:41:11.269 I MediaServer[57313-139825250957120] System.cpp:139 systemSetup | 文件最大描述符个数设置为:1048576
2021-04-18 21:41:11.270 I MediaServer[57313-139825250957120] config.cpp:34 loadIniConfig | dump ini file to:/home/txp/share/rtsp/ZLMediaKit/release/linux/Debug/config.ini
2021-04-18 21:41:11.438 W MediaServer[57313-139825250957120] SSLUtil.cpp:98 loadPublicKey | error:02001002:system library:fopen:No such file or directory
2021-04-18 21:41:11.438 W MediaServer[57313-139825250957120] SSLUtil.cpp:126 loadPrivateKey | error:2006D080:BIO routines:BIO_new_file:no such file
2021-04-18 21:41:11.440 D MediaServer[57313-139825143346944] util.cpp:340 operator() | Stamp thread started!
2021-04-18 21:41:11.442 I MediaServer[57313-139825250957120] EventPoller.cpp:467 EventPollerPool | 创建EventPoller个数:2
2021-04-18 21:41:11.445 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:554
2021-04-18 21:41:11.456 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:332
2021-04-18 21:41:11.457 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:1935
2021-04-18 21:41:11.458 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:19350
2021-04-18 21:41:11.458 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:80
2021-04-18 21:41:11.459 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:443
2021-04-18 21:41:11.459 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:9000
2021-04-18 21:41:11.461 I MediaServer[57313-139825250957120] TcpServer.h:320 start_l | TCP Server listening on 0.0.0.0:10000
2021-04-18 21:41:11.462 I MediaServer[57313-139825250957120] main.cpp:339 start_main | 已启动http api 接口
2021-04-18 21:41:11.463 I MediaServer[57313-139825250957120] main.cpp:341 start_main | 已启动http hook 接口
注意:上面的两条报错,没有关系,我们现在已经真正开启了 rtsp 服务器了。
(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)最全学习提升资料地址:https://docs.qq.com/doc/DWHhNTlVtaFJId0ht
我们现在来把本地媒体文件推流到这个服务器上,然后再进行拉流播放试试,你可以使用 obs 或者 ffmpeg 命令来进行,这里我使用了 ffmpeg 来进行推流,我电脑本地的媒体文件 test.mp4 路径如下:

本地的 test.mp4 媒体文件
开始使用 ffmpeg 进行推流:
ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.32.128/live/test
注意:后面的 ip 地址是你 ubuntu 搭建服务器的 ip 地址,这个千万不要弄错了,不然试验不会成功的哈!

推流过程
现在我来开始拉流播放,这里使用 ffplay 进行拉流播放:
ffplay -rtsp_transport tcp rtsp://192.168.32.128/live/test
复制代码


拉流播放成功
上面是基于 rtsp 协议进行拉流的,我们也可以用 rtmp 来进行拉流播放;
ffplay rtmp:://192.168.32.128/live/test

rtmp 协议拉流播放
接着我们使用 udp 的方式来进行拉流,你会发现速度非常快:
ffplay -rtsp_transport udp rtsp://192.168.32.128/live/test

udp 方式拉流
更多测试实验也可以参考官方手册:
https://github.com/xia-chu/ZLMediaKit/wiki/ZLMediaKit%E6%8E%A8%E6%B5%81%E6%B5%8B%E8%AF%95
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我将以下代码放在一起用于一个简单的RubyTFTP服务器。它工作正常,因为它监听端口69并且我的TFTP客户端连接到它,我能够将数据包写入test.txt,但我不只是写入数据包,我希望能够从我的客户端通过TFTP传输文件到/temp目录。预先感谢您的帮助!require'socket.so'classTFTPServerdefinitialize(port)@port=portenddefstart@socket=UDPSocket.new@socket.bind('',@port)whiletruepacket=@socket.recvfrom(1024)putspacketFile