基于ZLMediaKit的webrtc实时视频传输demo搭建

环境

ubuntu 20.04
​
gcc version 9.4.0
​
cmake version 3.16.3

部署ZLMediaKit流媒体服务器

安装openssl

首先可以检查一下自己的openssl的版本如果是1.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
安装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

其中初始化配置的时候可能会报错,如果报错换成./configure --enable-openssl即可

对于一些比较新的编译环境(如GCC 10+),编译 libsrtp-2.3.0 可能会存在问题,可以考虑切换到 2.5.0 版本,即

wget https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz
tar -xvzf libsrtp-2.5.0.tar.gz
cd libsrtp-2.5.0

另外可以安装ffmpeg进行推流测试

sudo apt-get install ffmpeg
编译ZLMediaKit
#国内用户推荐从同步镜像网站gitee下载 
git clone --depth 1 https://gitee.com/xia-chu/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

使用上面命令之后就不用make && make install了,会在release/debug下生成可执行文件

部署完成

img

官方文档:

zlm启用webrtc编译指南 · ZLMediaKit/ZLMediaKit Wiki (github.com)

按照官方文档走基本不会出什么问题

修改配置文件

webrtc启动后,还需要修改配置文件,需要在填写rtc.externip,webrtc协议需要告知播放器服务器的ip,不过如果是内网环境的话可以不用修改此配置,因为如果为空,会自动读取内网的网卡信息,这样做的话将无法实现跨域NAT使用

[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

至此基于ZLMediaKit的webrtc流媒体服务器搭建完成

测试

在流量器访问服务器的ip就可以访问流媒体服务器,这里直接使用https,因为http无法调用摄像头

开两个不同的窗口,一个选择push推流,一个选择play拉流,校园网环境下延迟在120ms左右✔

img

通过域名访问

ZLMediaKit自带有效证书,在debug目录下的default.pem,这个证书默认是解析到127.0.0.1的,这里我尝试修改解析到内网的服务器ip上

如果是linux机器则可以通过修改/etc/hosts文件修改地址解析

127.0.0.1 localhost
127.0.1.1 connect_class
​
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.14.2.7 default.zlmediakit.com

如果是windows机器则在C:\Windows\System32\drivers\etc\hosts目录下,修改hosts文件需要管理员权限,可以以管理员身份打开记事本修改

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host
​
# localhost name resolution is handled within DNS itself.
#   127.0.0.1       localhost
#   ::1             localhost
10.14.2.7 default.zlmediakit.com

修改后可以ping一下测试

img

接下来重启流媒体服务,使用自带证书启动./MediaServer -s default.pem

在浏览器上输入https://default.zlmediakit.com/即可访问

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【新论文】【模型攻击】DiffAttack 针对基于扩散的对抗性净化的逃避攻击

DiffAttack: Evasion Attacks Against Diffusion-Based Adversarial Purification 作者: Mintong Kang; Dawn Song; Bo Li 链接: http://arxiv.org/pdf/2311.16124v1 备注: Accepted to NeurIPS 2023 摘要: 基于扩散的净化防御利用扩散模型去除对抗样本的精心设计的扰动&#…

酷开科技 | 酷开系统,让家庭娱乐方式焕然一新!

在这个快节奏的社会,家庭娱乐已成为我们日常生活中不可或缺的一部分,为了给家庭带来更多欢笑与感动,酷开科技发力研发出拥有丰富内容和技术的智能电视操作系统——酷开系统,它集合了电影、电视剧、综艺、游戏、音乐等海量内容&…

我的2023年12月02日对文章发送的一个测试

1 Markdown.com.cn 简介 支持自定义样式的 Markdown 编辑器支持微信公众号、知乎和稀土掘金点击右上方对应图标,一键复制到各平台 2 Markdown语法教程 2.1 标题 不同数量的#可以完成不同的标题,如下: 一级标题 二级标题 三级标题 2.2…

C语言-指针_01

指针基础 1. 概述 地址编号:计算机为了存储数据,每一个程序在 32位 机中 占4G,最小操作单位 是 一个字节,每一个字节都有其对应的地址,该地址就是 地址编号。 指针:地址编号这个数据 的 数据类型。 指针变…

Java数组与List互换

asList():将数组转成list //将数组转换为listint[][] nums {{7,0},{4,4},{7,1},{5,0},{6,1},{5,2}};List<int[]> list new LinkedList<>(Arrays.asList(nums));for (int[] ints :list) {System.out.println(ints[0] " " ints[1]); //遍历list}toAr…

TPC通信-BS架构

BS架构-基本原理 BS框架基本原理 使用线程池对BS架构进行优化

docker部署typecho博客

文章目录 1.安装git2.安装compose3.拉取仓库4.创建目录5.配置文件修改6.启动容器7.修改MYSQL数据库8.安装成功9.参考GitHub文档 1.安装git 安装git yum -y install git2.安装compose &#xff08;docker安装参考&#xff1a;docker基本知识&#xff09; 确保已经安装了 Doc…

爬虫学习-基础(HTTP原理)

目录 一、URL和URI 二、HTTP和HTTPS &#xff08;1&#xff09;HTTP &#xff08;2&#xff09;HTTPS &#xff08;3&#xff09;HTTP与HTTPS区别 &#xff08;4&#xff09;HTTPS对HTTP的改进&#xff1a;双问的身份认证 三、TCP协议 &#xff08;1&#xff09;TCP三次握手…

⭐ Unity 里让 Shader 动画在 Scene 面板被持续刷新

写 Unity Shader的时候&#xff0c;只有播放状态下的 Game 面板能看到Shader 顺畅的动态效果&#xff0c;不方便。 想要带有动态效果的 Shader 在 Scene 面板持续更新动画&#xff0c;只需要打开一个开关就能让 Scene 持续刷新动画了。 感谢大家的观看&#xff0c;您的点赞和关…

android 13.0 launcher3中workspace app列表页不显示某个app图标

1.概述 在13.0的系统ROM定制化开发中,Launcher3 workspace的app列表页 会负责加载系统中app的所有图标 但针对某个不需要显示在桌面的app图标需要过滤掉 所以需要在加载和更新的时候过滤 需要更改两处地方, 一处是 加在列表时 一处是安装卸载app 更新app列表时,接下来具体分…

learn2learn环境配置(2023年12月)

learn2learn是元学习方向的一个非常实用的库&#xff0c;但其发布时间较早&#xff0c;与最新版本的pytorch可能存在一些兼容性问题&#xff0c;在2023年12月这个时间进行安装时会遇到一些问题&#xff0c;以下是我遇到的问题及解决的方法。 1. 在我第一次直接配置“pip instal…

Cpp之旅(学习笔记)第9章 标准库

C之旅&#xff08;学习笔记&#xff09;第9章 标准库 当无知稍纵即逝时&#xff0c;又何必浪费时间学习呢&#xff1f; ——霍布斯 9.1 引言 第9~18章将对重要的标准库工具和方法给出一个概要性的介绍。如&#xff1a;string、ostream、variant、vector、map、path、unique_p…

在oracle中的scn技术

SCN可以说是Oracle中一个很基础的部分&#xff0c;但同时它也是一个很重要的。它是系统中维持数据的一致性和顺序恢复的重要标志&#xff0c;是数据库非常重要的一种数据结构。 转载&#xff1a;深入剖析 - Oracle SCN机制详细解读 - 知乎 (zhihu.com)https://zhuanlan.zhihu.…

跟我学c++高级篇——动态反射之一遍历

一、动态反射 前面讲一篇静态反射&#xff0c;今天在这个基础上对动态反射进行一下入门。动态反射前面提到过&#xff0c;一般是指在运行时动态获取类型或者生成实例。那么如何才能动态获得类型呢&#xff1f;方法有很多种&#xff0c;下面从最简单的开始。 二、入门程序 动…

基于运算放大器的电压采集电路

一、运算放大器 运放推导的两个重要概念&#xff1a;虚短、虚断。 1、差分放大器 以差分放大器为例进行推导分析。 虚断–运放的"-“端、”“端的引脚电流接近为0&#xff1b; 根据基尔霍夫电流定律可知&#xff1a;iR1iRF&#xff0c;iR2iR3&#xff1b; iR1(Ui1-(V-…

C语言结构体详解(一)(能看懂文字就能明白系列)

&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;个人主页&#xff1a; 古德猫宁- &#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;…

简单聊聊更快、更稳、更高效的 QUIC 协议

目录 QUIC的起源和发展 QUIC 与 TCP 和 UDP 的比较 QUIC 的主要特性 QUIC 的工作原理 QUIC 的应用场景 小结 QUIC&#xff08;Quick UDP Internet Connections&#xff0c;快速 UDP 互联网连接&#xff09;是一种基于 UDP 协议的传输层协议&#xff0c;由 Google 首次提出…

上个班而已

习惯性刷CSDN&#xff0c;发现了这么个主题&#xff0c;有意思。在我的字典里&#xff0c;“养生”这个条目已经被我删了。看过了太多的伪科学、贩卖焦虑、带货、自以为是&#xff0c;干脆眼不见为净。但程序员人均亚健康这句话真未必是个玩笑&#xff0c;所以还是凑个热闹聊上…

XML Schema中的elementFormDefault

XML Schema中的elementFormDefault&#xff0c;用以指明xml的元素是否必须有命名空间的前缀。 它的取值可以为qualified、或者unqualified。默认值为unqualified。 当取值为qualified时&#xff0c;xml元素前必须有命名空间作为前缀&#xff1b; 当取值为unqualified时&#x…

04.PostgreSQL是如何实现隔离级别的?

PostgreSQL是如何实现隔离级别的&#xff1f; 事务有哪些特性&#xff1f; 事务看起来感觉简单&#xff0c;但是要实现事务必须要遵守 4 个特性&#xff0c;分别如下&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;一个事务中的所有操作&#xff0c;要么…