草庐IT

ZLMediaKit启用webrtc编译

音视频开发老舅 2023-04-20 原文

一、centos7 环境

编译机器: centos 7.9.2009

gcc version 5.4.0 (GCC)

cmake version 3.20.5

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

gcc安装

gcc -v查看是否已安装旧版本gcc 如果有 删除;

yum remove gcc

 解压 .tar.bz2 依赖库

yum -y install bzip2

编译 gcc 5.4.0依赖库

yum install gcc-c++
# 如果下载慢 可以浏览器输入地址下载
curl https://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.bz2 -O
 
# j对应bz2编码 J对应gz编码
tar xvfj gcc-5.4.0.tar.bz2
 
yum install gmp-devel mpfr-devel libmpc-devel
 
mkdir gcc-5.4.0-build
 
cd gcc-5.4.0-build
 
../gcc-5.4.0/configure --enable-languages=c,c++ --disable-multilib
 
make -j$(nproc) && make install # note: nproc is the number of threads (e.g.2or 4 or 8 )

cmake安装 

步骤一、安装gcc等必备程序包(已安装则略过此步)上面已安装gcc

$ yum install -y gcc gcc-c++ make automake 

步骤二、安装wget (已安装则略过此步)

$ yum install -y wget

步骤三、获取CMake源码包

$ wget https://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5.tar.gz

步骤四、解压CMake源码包

$ tar -zxvf cmake-3.20.5.tar.gz

步骤五、进入目录

$ cd cmake-3.20.5

步骤六 编译安装

$ ./bootstrap && make -j4 && sudo make install

到此 CMake 命令安装完成。

version `GLIBCXX_3.4.20‘ not found 解决方法

su root
cd /usr/local/lib64
# 下载最新版本的libstdc.so_.6.0.26
sudo wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
unzip libstdc.so_.6.0.26.zip
# 将下载的最新版本拷贝到 /usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64
cd  /usr/lib64
# 查看 /usr/lib64下libstdc++.so.6链接的版本
ls -l | grep libstdc++
libstdc++.so.6 ->libstdc++.so.6.0.19
# 删除/usr/lib64原来的软连接libstdc++.so.6,删除之前先备份一份
sudo rm libstdc++.so.6
# 链接新的版本
sudo ln -s libstdc++.so.6.0.26 libstdc++.so.6
# 查看新版本,成功
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
...
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_DEBUG_MESSAGE_LENGTH

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

依赖准备

openssl 安装 (openssl版本要求1.1以上)

$ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz

$ tar -xvzf openssl-1.1.1k.tar.gz

$ yum install -y zlib zlib-devel perl-CPAN

$ ./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl

$ make && make install

$ echo "/usr/local/lib64/" >> /etc/ld.so.conf

$ echo "/usr/local/openssl/lib" >> /etc/ld.so.conf

$ ldconfig

$ ln -s /usr/local/openssl/bin/openssl /usr/local/bin/openssl # 替换系统openssl,非必须

$ openssl version -a

注意:.

/config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl 不能和解压缩目录一致 此处为指定安装地址。 否则报错 cp: './include/openssl/aes.h' and '/opt/openssl/openssl-1.1.1o/include/openssl/aes.h' are the same file

libsrtp安装

$ tar -xvzf libsrtp-2.3.0.tar.gz

$ cd libsrtp-2.3.0

$ ./configure --enable-openssl --with-openssl-dir=/usr/local/openssl

$ make -j8 && make install

编译

下载zlm源码

#如果没安装git 那么安装

yum install -y git

#国内用户推荐从同步镜像网站gitee下载

git clone --depth 1 夏楚/ZLMediaKit

cd ZLMediaKit

#千万不要忘记执行这句命令

git submodule update --init

编译

$ mkdir build

$ cd build

$ cmake .. -DENABLE_WEBRTC=true -DOPENSSL_ROOT_DIR=/usr/local/openssl -DOPENSSL_LIBRARIES=/usr/local/openssl/lib

$ cmake --build . --target MediaServer

# 最终输出

[ 96%] Built target test_rtcp_fci

[ 96%] Building CXX object tests/CMakeFiles/test_rtp.dir/test_rtp.cpp.o

[ 97%] Linking CXX executable ../../release/linux/Debug/test_rtp

[ 97%] Built target test_rtp

[ 97%] Building CXX object tests/CMakeFiles/test_wsServer.dir/test_wsServer.cpp.o

[ 97%] Linking CXX executable ../../release/linux/Debug/test_wsServer

[ 97%] Built target test_wsServer

[ 97%] Building CXX object tests/CMakeFiles/test_server.dir/test_server.cpp.o

[ 97%] Linking CXX executable ../../release/linux/Debug/test_server

[ 97%] Built target test_server

[ 98%] Built target jsoncpp

[ 98%] Linking CXX executable ../../release/linux/Debug/MediaServer

[100%] Built target MediaServer

修改配置文件

(1)由于webrtc协议需要告知播放器服务器所在ip,如果该ip对播放器不可见,会导致webrtc无法联通。请修改配置文件中rtc.externIP为播放器可见ip,如果不设置该配置项,zlmediakit将获取网卡ip(一般是内网ip),那么将无法跨域nat使用webrtc。

[rtc]

#rtc播放推流、播放超时时间

timeoutSec=15

#本机对rtc客户端的可见ip,作为服务器时一般为公网ip,置空时,会自动获取网卡ip

externIP=

#rtc udp服务器监听端口号,所有rtc客户端将通过该端口传输stun/dtls/srtp/srtcp数据,

#该端口是多线程的,同时支持客户端网络切换导致的连接迁移

#需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致

port=8000

#设置remb比特率,非0时关闭twcc并开启remb。该设置在rtc推流时有效,可以控制推流画质

rembBitRate=1000000

(2)config.ini 配置文件

注意,如果用不到hook,不要开启。开启后,所有的推拉流都会进行鉴权。

测试webrtc

最新的zlmediakit源码自带有效的ssl证书default.pem,对应的域名是default.zlmediakit.com,该域名解析到的ip为127.0.0.1,用户在浏览器中打开 https://default.zlmediakit.com/webrtc/即可开始测试。如果ZLMediaKit部署在其他主机,地址为 http://192.168.41.252:8091/webrtc/ 。8091为config.ini文件中http配置的port。

请先推流后,再测试播放。如果webrtc无法播放, 请参考此issue。推流可以使用ffmpeg推流rtmp rtsp都行。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

测试推拉流

        ffmpeg推流 ,vlc或ffplay播放流。

ffmpeg推流

ffmpeg -re -i "./sample.flv" -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test 如果ffmpeg不支持h264编码 那么需要安装此编码
 
ffmpeg -re -i "./sample.flv" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test

播放url规则

查看ZLMediaKit wiki 播放url规则 · ZLMediaKit/ZLMediaKit Wiki · GitHub 。一般而言,下面url在ZLMediaKit都有效,都可以使用播放器播放,因为ZLMediaKit默认转换流媒体源。

​rtsp://192.168.41.252/live/test
rtmp://192.168.41.252/live/test
http://192.168.41.252/live/test.live.flv
ws://192.168.41.252/live/test.live.flv
http://192.168.41.252/live/test/hls.m3u8
http://192.168.41.252/live/test.live.ts
http://192.168.41.252/live/test.live.mp4
http://192.168.41.252:8091/index/api/webrtc?app=live&stream=test&type=play

webrtc播放

http://192.168.41.252:8091/webrtc/ 可以播放webrtc流 播放url: http://192.168.41.252:8091/index/api/webrtc?app=live&stream=test&type=push

点播url

首先使用/index/api/startRecord 接口启用 mp4录制 可以max_second参数设置mp4录制文件的长度。接口wiki MediaServer支持的HTTP API · ZLMediaKit/ZLMediaKit Wiki

拼接播放地址。找到ZLMediaKit/release/linux/Debug/www/record/ 目录下的视频,然后拼接即可得到播放地址。示例如下图:

下图对应播放地址可为

rtsp://192.168.41.252/record/live/test/2022-05-24/06-15-46.mp4、rtmp://192.168.41.252/record/live/test/2022-05-24/06-15-46.mp4等多个协议的播放url。具体参考"播放url规则"的wiki

 

 centos7安装ffmpeg

1.官网下载 ffmpeg source code,或者download页面下拉查找对应版本tar压缩包下载

2.使用finalshell将源码包ffmpeg-4.1.tar.xz上传至linux主机(本教程上传至/soft/ffmpeg目录)

3、解压压缩包

cd /soft/ffmpeg

tar xvJf ffmpeg-4.1.tar.xz

4、安装gcc和yasm编译器

cd ffmpeg-4.1

yum install gcc

yum install yasm

5、指定安装目录/soft/ffmpeg

./configure --enable-shared --prefix=/soft/ffmpeg 注意:此处prefix指定的安装目录不是下载的目录,需要是不同文件夹。

6、执行make

make

7、执行make install

make install

8、修改文件/etc/ld.so.conf

echo " /soft/ffmpeg/lib/" >> /etc/ld.so.conf

9、使修改的文件/etc/ld.so.conf生效

ldconfig

10、查看版本

./ffmpeg -version

11、配置环境变量

vim /etc/profile

export PATH=$PATH:/soft/ffmpeg/bin

12、使环境变量生效

source /etc/profile

13、查看ffmpeg版本

ffmpeg -version

安装ffmpeg h264编码

如果报错不支持h264 ,那么需要安装x264

下载并安装x264

git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --help
# 报缺少asm 时 可加入--disable-asm
./configure --enable-shared --enable-static --disable-asm
 make
# x264将会安装到 :/usr/local/ 目录下
sudo make install

重新编译 ffmpeg

# 下载ffmpeg
wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 --no-check-certificate
 
tar xjf ffmpeg-snapshot.tar.bz2
 
cd ffmpeg/
 
./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/x264/include --extra-ldflags=-L/usr/local/x264/lib
 
make && make install
 
# 将下面两行添加到 /etc/ld.so.conf  的最后
echo /usr/local/ffmpeg/lib/ >> /etc/ld.so.conf
/usr/local/lib/ >> /etc/ld.so.conf
sudo ldconfig 

ffmpeg -formats | grep h26 可以查看支持的编码

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

问题解决

  • 提示 gmake[3]: *** No rule to make target /usr/lib64/libssl.so', needed by ../release/linux/Debug/MediaServer'. Stop.

  • cd /usr/local/openssl/lib
    cp -r ./* /usr/lib64/

    Q And A(播放问题) ?

  • obs 推流 rtc 播放一卡一卡?

    web的rtc h264 不支持B帧,需要去掉B帧

  • rtsp 推流,rtc 播放不成功?

    rtsp 推流需要把zlm的配置文件中的directProxy 设置为0

ZLMediaKit推拉流

1.下载源码,编译。运行。如果要启动webrtc,需要编译时指定开启。编译后,config.init 和启动程序生成在ZLMediaKit/release/linux/Debug目录。编译参考上面的章节。

2.设置config.ini配置文件。如果不使用hook,不要开启,开启后所有推拉流都需要鉴权,会导致推拉流都报错权限不够。wvp只要连接了ZLMediaKit,就会修改配置文件开启hook。

3. ./MediaServer启动程序

4.ffmpeg推流 vlc、ffplay播放流。

ffmpeg -re -i "./sample.flv" -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test 如果ffmpeg不支持h264编码 那么需要安装此编码,安装参考我的csdn博客。

一般而言,下面url在ZLMediaKit都有效,因为ZLMediaKit默认转换流媒体源,包括gb28181。zlm中gb28181可以使用ffmpeg推rtp流到ZLMediaKit模拟,也可以使用wvp实现。

​
rtsp://192.168.41.252/live/test
rtmp://192.168.41.252/live/test
http://192.168.41.252/live/test.live.flv
ws://192.168.41.252/live/test.live.flv
http://192.168.41.252/live/test/hls.m3u8
 
http://192.168.41.252/live/test.live.ts
http://192.168.41.252/live/test.live.mp4
http://192.168.41.252:8091/index/api/webrtc?app=live&stream=test&type=play
 
 
http://192.168.41.252:8091/webrtc/ 可以播放webrtc流

6.点播url 首先使用

ffmpeg推流或者通讯终端推流。

/index/api/startRecord 接口启用 mp4录制 可以max_second参数设置mp4录制文件的长度。

拼接播放地址。找到www目录下的播放地址,然后拼接即可。例如: rtsp://192.168.41.252/record/live/test/2022-05-24/06-15-46.mp4

ZLMediaKit转推直播流到其他服务器接口 

推流

可以在部署了ZLMediaKit的虚拟机上推流

ffmpeg -stream_loop -1 -re -i "./sample.flv" -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test

调用ZLMediaKit转推接口转推流到指定地址 /index/api/addStreamPusherProxy

vlc播放转推到流媒体服务器的地址即可播放。

验证:如果推流下线,然后重新上线推流,此时转推不会重连。

WVP+ZLMediaKit转推gb28181到指定服务器

  1. GbtDevice推gb流到wvp。然后登录wvp页面,点击播放,国标设备--播放。点击播放后才会注册流信息到zlm

  2. 此时可以通过查看zlm日志 拼接播放地址

3.比如rtmp rtmp://192.168.41.252:8091/rtp/99000000801320000008_99000000801310000008?vhost=__defaultVhost__ 注意 vhost必须加,否则找不到流

4.比如http-flv http://192.168.41.252:8091/rtp/99000000801320000008_99000000801310000008.live.mp4

 5.调用ZLMediaKit转推接口转推流到指定地址 /index/api/addStreamPusherProxy,其中app固定为rtp,stream_id为下图红圈。

 

6.vlc播放转推到流媒体服务器的地址即可播放。

验证:

(1)gb28181如果推流下线,然后重新上线推流,此时转推不会重连。

(2)gb28181推流,也会自动转为其他格式流。比如rtmp、rtsp等。ZLMediaKit中所有格式的推流,都会被转成多种格式,拉流时可以拉任何格式的流,按照ZLMediaKit wiki中的 播放url规则来播放即可。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

有关ZLMediaKit启用webrtc编译的更多相关文章

  1. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  2. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. .net - 是否有 Ruby .NET 编译器? - 2

    是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/

  5. python - 使用 Python、Ruby 和 Perl 重新编译 MacPort 版本的 MacVim - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。ImprovethisquestionLinux专家正在转向Mac(10.8)。因为我懒...我使用MacPorts安装MacVim。它似乎安装没有错误。我只需要mvim中的python、ruby和perl支持。$/opt/local/bin/mvim--version|egrep'patches|python|ruby|perl'Includedpatches:1-244,246-646+multi_lang-mzscheme+

  6. ruby - 为什么 `middleman serve` 有效,但是 `middleman build` 编译这个 Sass 失败? - 2

    当我刚刚运行middleman时服务,all.css编译得很好,只包含对+box-shadow(none)的调用:/*line1,/home/yang/asdf/source/stylesheets/content.css.sass*/div{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}但是当我构建网站时,我得到了这个Sass/Compass错误:$middlemanbuildSlim::EmbeddedEngineisdeprecated,itiscalledSlim::EmbeddedinSlim2.0

  7. ruby - 有没有办法在 Ruby 中执行编译时类型检查? - 2

    我知道Ruby是动态和强类型的,但据我所知,由于每个参数缺少显式类型表示法(或契约),当前语法不允许在编译时检查参数类型。如果我想执行编译时类型检查,我有哪些(实际成熟的)选项?更新我的意思是类型检查类似于典型的静态类型语言。比如C。例如,C函数表示每个参数的类型,编译器检查传入的参数是否正确。voidfunc1(structAAAaaa){structBBBbbb;func1(bbb);//Wrongtype.Compiletimeerror.}作为另一个例子,Objective-C通过放置显式类型信息来做到这一点。-(id)method1:(AAA*)aaa{BBB*bbb=[[A

  8. ruby - Ruby 将来可以编译并更快吗? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭7年前。ImprovethisquestionC、Java、C#和Python都是从头编译的。感谢Facebook,PHP现在也可以编译并可以在HHVM上运行,从而提高程序的性能。Ruby不可编译并且比上述语言慢。Ruby有没有可能在未来被编译(就像PHP和HHVM一样)?或者可能有一些原因不能做到?

  9. ruby - 有没有办法让文件夹包含在生产构建中但不让 jekyll 编译它? - 2

    我认为最好的例子是images/文件夹或node_modules/用于将图像和依赖项包含在最终构建中,而无需花费很长时间编译。编辑:抱歉没有具体说明,但我很清楚keep_files和exclude两者都对我的情况没有帮助。exclude从编译和站点构建中排除文件夹和文件,并且每次都需要额外的流水线工具来手动移动它们。keep_files要求文件首先存在于最终构建中,这对于某些生产环境(GitHub的gh-pages等)是不可能的 最佳答案 你可能想看看这个:ExcludingadirectoryfromJekyllwatchP.S.

  10. ruby - 我如何将 Ripper 的 AST 重新编译回 Ruby 代码? - 2

    Ripper是Ruby1.9附带的解析库。它将Ruby代码转换为AST,如下所示:ppRipper.sexp("deffoo;yield:a;return1end")#=>[:program,[[:def,[:@ident,"foo",[1,4]],[:params,nil,nil,nil,nil,nil],[:bodystmt,[[:yield,[:args_add_block,[[:symbol_literal,[:symbol,[:@ident,"a",[1,16]]]]],false]],[:return,[:args_add_block,[[:@int,"1",[1,26]]

随机推荐