webrtc音视频通话(一)搭建turn服务器

news/2024/4/26 0:04:02/文章来源:https://blog.csdn.net/yinshipin007/article/details/129250631

全球定位:

webrtc音视频通话(一)搭建turn服务器

webrtc音视频通话(二)简单音视频通话

webrtc音视频通话(三)整合websocket

在学习webrtc之前呢,需要对websocket有一定基础,如果还不会websocket的同学,请转到

springboot整合websocket(一)简单聊天室

将前两部分看下就能使用websocket了。

git地址

chr_demo/web-rtc

温馨提示

本文通过其他参考资料(其他博客、官网等)实践并分享。在安装一些文件的时候,版本请尽量和我保持一致。

第一章其实就是搭建环境,暂不需要写代码。

我因版本问题搞了一下午,最后降了版本才成功的。

另外,我们需要一台服务器,外网能访问的那种,可以在阿里云或者腾讯云租一台。

一、webrtc的简单概念


上述序列中,WebRTC并不提供Stun服务器和Signal服务器,服务器端需要自己实现。Stun服务器可以用google提供的实现stun协议的测试服务器(stun:http://stun.l.google.com:19302),Signal服务器则完全需要自己实现了,它需要在ClientA和ClientB之间传送彼此的SDP信息和candidate信息,ClientA和ClientB通过这些信息建立P2P连接来传送音视频数据。由于网络环境的复杂性,并不是所有的客户端之间都能够建立P2P连接,这种情况下就需要有个relay服务器做音视频数据的中转。

而Signal服务器其实就是我们的websocket,stun服务器其实就是webrtc啦。

图中的流程如下(比较长哈,大家粗略看下,有个概念,之后还有简化版的)

  • ClientA首先创建PeerConnection对象,然后打开本地音视频设备,将音视频数据封装成MediaStream添加到PeerConnection中。

  • ClientA调用PeerConnection的CreateOffer方法创建一个用于offer的SDP对象,SDP对象中保存当前音视频的相关参数。ClientA通过PeerConnection的SetLocalDescription方法将该SDP对象保存起来,并通过Signal服务器发送给ClientB。

  • ClientB接收到ClientA发送过的offer SDP对象,通过PeerConnection的SetRemoteDescription方法将其保存起来,并调用PeerConnection的CreateAnswer方法创建一个应答的SDP对象,通过PeerConnection的SetLocalDescription的方法保存该应答SDP对象并将它通过Signal服务器发送给ClientA。

  • ClientA接收到ClientB发送过来的应答SDP对象,将其通过PeerConnection的SetRemoteDescription方法保存起来。

  • 在SDP信息的offer/answer流程中,ClientA和ClientB已经根据SDP信息创建好相应的音频Channel和视频Channel并开启Candidate数据的收集,Candidate数据可以简单地理解成Client端的IP地址信息(本地IP地址、公网IP地址、Relay服务端分配的地址)。

  • 当ClientA收集到Candidate信息后,PeerConnection会通过OnIceCandidate接口给ClientA发送通知,ClientA将收到的Candidate信息通过Signal服务器发送给ClientB,ClientB通过PeerConnection的AddIceCandidate方法保存起来。同样的操作ClientB对ClientA再来一次。

  • 这样ClientA和ClientB就已经建立了音视频传输的P2P通道,ClientB接收到ClientA传送过来的音视频流,会通过PeerConnection的OnAddStream回调接口返回一个标识ClientA端音视频流的MediaStream对象,在ClientB端渲染出来即可。同样操作也适应ClientB到ClientA的音视频流的传输。

二、搭建turn服务器(正文开始)


对了,记得使用root用户登录!!!

1.安装gcc环境

由于服务器基本上都会默认安装gcc,所以这里不说咋装。

可以通过以下命令检测是否安装了gcc环境

which gcc

2. 使用yum安装

yum -y install openssl-devel

3.生成签名

openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes

执行后一直按回车就行了,结果是

意思是:

生成了key,并保存再 /etc/turn_server_pkey.pem;生成了cert,并保存再 /etc/turn_server_cert.pem;有效期99999天。

4. 安装libevent

2.3.1 下载安装包

这是一个c的扩展库,

可以使用下面命令直接安装

wget --no-check-certificate https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz

也可以进入官网安装最新版的https://libevent.org/,下载到本地,再上传的服务器即可。

2.3.2 执行安装命令

下载下来后会有一个libevent-2.1.12-stable.tar.gz的包依次执行以下命令

tar -zxvf libevent-2.1.12-stable.tar.gz

cd libevent-2.1.12-stable/

./configure

make

make install

5.看看是否安装成功

由于这是个扩展库,没有执行命令,我从网上找了一个代码,如果能执行就是安装成功。

6.安装coturn(turn服务器)

以下内容参考自 coturn GitHub

7. 下载安装包

wget --no-check-certificate https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz

8.执行安装命令

下载下来后会有一个4.5.1.1.tar.gz的包依次执行以下命令

tar -zxvf 4.5.1.1.tar.gz

cd coturn-4.5.1.1

./configure

make

make install

9. 生成用户

turnadmin -a -u chr -p 11111 -r xxx.com

上面的命令,将创建用户chr,密码为11111 ,同时指定realmhttp://xxx.com,大家根据实际情况修改(包括那个http://xxx.com都是随便写

10. 修改配置文件

cd /usr/local/etc

里面有一个turnserver.conf.default的文件

cp turnserver.conf.default turnserver.conf

查看ip地址

ifconfig

记住这两个东西

编辑

vim turnserver.conf

里面都是注释,直接再最下面插入

#与前ifconfig查到的网卡名称一致

relay-device=eth0

#内网IP

listening-ip=10.0.16.7

#公网IP

external-ip=159.75.239.36

#用户名密码,创建IceServer时用

user=chr:123456

#一般与turnadmin创建用户时指定的realm一致

realm=chr.com

#端口号

listening-port=3478

#不开启会报CONFIG ERROR: Empty cli-password, and so telnet cli interface is disabled! Please set a non empty cli-password!错误

cli-password=qwerty

cert=/etc/turn_server_cert.pem

pkey=/etc/turn_server_pkey.pem

11.开启3478的tcp和udp端口

如果使用的云服务器,建议去阿里云控制台/腾讯云控制台开启。

也可以使用下面命令开启:

firewall-cmd --zone=public --add-port=3478/udp --permanent

firewall-cmd --zone=public --add-port=3478/tcp --permanent

firewall-cmd --reload

查看端口是否开放

firewall-cmd --zone=public --query-port=3478/tcp

firewall-cmd --zone=public --query-port=3478/udp

12. 开启服务

需要注意的是,-r参数后面是上一步的-r的值

turnserver -a -f -r xxx.com

如果看到下面的图,那就是成功了

然后ctrl+C退出,使用-o参数后台启动

turnserver -a -o -f -r xxx.com

13.测试turn服务器

webrtc-samples官网提供了一个测试用的地址https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

添加turn服务器

同理,添加两个,一个stun,一个turn,如图

测试

End

全球定位:webrtc音视频通话(一)搭建turn服务器webrtc音视频通话(二)简单音视频通话webrtc音视频通话(三)整合websocket

原文链接:webrtc音视频通话(一)搭建turn服务器QQ两个人的博客-CSDN博客turn服务器

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

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

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

相关文章

腾讯云卖向“有币”区块链

曾经坚决“不涉币”的腾讯云将业务延伸向“有币区块链”。 在首届 Web3 全球峰会“腾讯云Web3构建日”上,腾讯云宣布进军Web3,并公开了与Ankr、Avalanche、Scroll和Sui 四个原生区块链项目的合作,其中前两个项目都发行了加密货币&#xff0c…

比特数据结构与算法(第四章_中_续②)堆解决Topk问题(最小的k个数)

TopK问题介绍:在N个数中找出最大/小的前K个 (比如在1000个数中找出最大/小的前10个)以前的方法:冒泡排序。时间复杂度: O(N^2)现在找最大的k个数的方法:方法1:堆排序降序,前N个就是最…

使用非对称加密(RSA) 实现前端加密后端解密

数据加密方式有: 单向加密、对称加密、非对称加密、加密盐、散列函数、数字签名。 1、单向加密 单向加密通过对数据进行摘要计算生成密文,密文不可逆推还原。只能加密,不能解密,常用于提取数据的指纹信息以此来验证数据的完整性…

JVM内存溢出与内存泄露

1. 什么是内存溢出? 当前创建的对象的大小大于可用的内存容量大小,发生内存溢出。2. 什么是内存泄露? 该回收的垃圾对象没有被回收,发生了内存泄露,垃圾对象越堆越多, 可用内存越来越少,若可用内存无法存放新的垃圾…

Tcpdump抓包验证zookeeper的心跳机制

一、背景 在分布式系统中,zookeeper可以作为服务注册中心,所有提供服务的节点都可以在zookeeper上面注册,并作为一个node被组织起来,如下图: 在RPC框架中,这些服务提供者就是RPC服务的提供者。zookeeper注…

185、【栈与队列】leetcode ——496. 下一个更大元素 I:单调栈-哈希表(C++版本)

题目描述 原题链接:496. 下一个更大元素 I 解题思路 本题与 739. 每日温度 的区别在于,需要先通过让nums1与nums2判定出为想等元素后,再去找nums2中更大的数。 因此,第一步需要找到想等数,第二步需要找到大于的数。…

c++之引用

目录 引用的概念 引用做函数参数 引用的本质 常引用 引用的概念 在c中新增加了引用的概念,引用可以看作一个已定义变量的别名。 引用的语法:Type &name var; int main() {int a 10;int &b a;printf("b%d\n", b);printf(&quo…

第四阶段02-酷鲨商城项目Mybatis相关的配置

14. 添加与Mybatis相关的配置 在每个项目中,当需要使用Mybatis实现数据库编程时,都需要添加2项一次性配置:配置Mapper接口所在的包(package)、配置XML文件在哪里。 关于配置Mapper接口所在的包,可以&…

【一】kubernetes集群部署

一、docker环境搭建 1、移除以前docker相关包 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine2、配置yam源 sudo yum install -y yum-utilssudo yum-config-manager --ad…

C++进阶--二叉树编程题

文章目录力扣606. 根据二叉树创建字符串力扣102. 二叉树的层序遍历力扣236. 二叉树的最近公共祖先JZ36 二叉搜索树与双向链表力扣105--通过前序和中序遍历构造二叉树力扣144--二叉树的前序遍历(非递归)力扣94--二叉树的中序遍历(非递归&#…

虹科新闻|虹科与iX systems正式建立合作伙伴关系

近日,虹科与美国iXsystems公司达成战略合作,虹科正式成为iXsystems公司在中国区域的认证授权代理商。未来,虹科将携手iXsystems,共同致力于提供企业级存储解决方案。虹科及iXsystems双方的高层领导人员都对彼此的合作有很大的信心…

操作系统基础教程

目录 第二章:处理器管理 概览 进程调度的层次 进程的调度方式: 调度的评价标准: 典型的调度算法: 第三章:同步、通信和死锁 什么是进程同步? 什么是进程互斥? 进程同步的实现方式 进程…

JVM总结

1. 内存结构 线程私有区 程序计算器 作用:是一块较小的内存空间,存储的是当前线程所执行的字节码文件的序号特点:线程私有,不会出现内存空间溢出 虚拟机栈 虚拟机栈是管理JAVA方法执行的内存模型,每个方法执行时都…

贴吧顶贴软件《今日/更新》

贴吧顶贴软件《今日/更新》百收贴吧工具箱,贴吧顶帖软件,贴吧推广引流神器#贴吧顶帖#贴吧推广 hello,大家好,我是软件的作者百收编辑狂潮老师。本次的视频讲解是作为一个百度顶贴的自动化脚本的视频安装教程和使用教程。你作为新…

SpringCloud(五)MQ消息队列

MQ概念常见消息模型helloworld案例实现实现spring AMQP发送消息实现spring AMQP接收消息工作消息队列实现发布订阅模型Fanout Exchange实现DirectExchange实现TopicExchange实现DirectExchange 和FanoutExchange的差异DirectExchange 和TopicExchange的差异基于RabbitListener注…

钉钉产品体验报告

一、调研的目的了解企业社交软件,借写竞品分析来帮助自己整理思路,看清市场的发展趋势;体验这类企业设计软件,掌握产品核心业务流程和产品结构,把握需求对应的功能点和界面结构,并侧面了解用户习惯&#xf…

用Python做数据分析有哪些优势?

众所周知,可以用作数据分析的语言有很多,包含Python、R语言等,而且Python被誉为数据分析的一大利器,更是该领域的首选语言,那么用Python做数据分析有哪些优势呢?跟着蛋糕往下看。 第一、Python语言自身的优势 Pytho…

ShardingSphere水平、垂直分库、分表和公共表

目录一、ShardingSphere简介二、ShardingSphere-分库分表1、垂直拆分(1)垂直分库(2)垂直分表2、水平拆分(1)水平分库(2)水平分表三、水平分库操作1、创建数据库和表2、配置分片的规则…

BigGAN

1、BIGGAN 解读1.1、作者 Andrew Brock、Jeff Donahue、Karen Simonyan 1.2、摘要 尽管最近在生成图像建模方面取得了进展,但从 ImageNet 等复杂数据集中 成功生成高分辨率、多样化的样本仍然是一个难以实现的目标。为此,我们以迄 今为止最大的规模训练生…

fastadmin:在新增页面,打开弹窗单选,参数回传

样式:核心代码:一、弹窗的控制器中:// 定义一个公共函数select(),如果这个请求是Ajax,则返回index()函数,否则返回view对象的fetch()函数。 public function select() {if ($this->request->isAjax(…