目录

对问题的分析

我在刚接触TURN时的一些疑问

搭建TURN服务器

如何测试我的TURN服务器是否成功运行?

解决ICE问题过程中遇到的另一个问题


最近使用WebRTC传输媒体流时,接收端已经成功收到了发送端发来的offer,并且传回的answer也已经发送方被接收,之后接收端的ontrack/onaddstream成功触发,收到了媒体流并且能够打印出来,但是既不能得到画面,也不能得到声音。

先说结论:

原因在于ice候选,在本机测试时和局域网测试时我只使用了谷歌的免费STUN服务器,是否成功视网络情况而不同。

本地测试和局域网测试即便没有ice候选也能成功连接传输媒体流,但是一旦部署到服务器上,ice就非常重要了

-----2020更新------

有很多朋友看了之后跟我说有相同的问题,接收端也得到了,也成功打印出来了,但是黑屏没有画面。配置了turn服务器之后也没能解决,不知道是turn服务器的问题还是其他的问题。说一下我的想法:也有可能是MIMEType的问题,建议两端用同一个浏览器同一个MIMEType来测试,因为MIMEType还蛮刁钻的,我当时发送方是Chrome,接收方是FireFox,尽管双方设置的MIMEType相同但接收方黑屏。以后有机会再研究一下MIMEType吧

对问题的分析

我找不到思路的地方,在于我"能收到媒体流"(ontrack/onaddstream会触发),但是无法播放,

发送端的ice状态:new -> checking -> close,无法达到connected或者completed,也就无法传输媒体流(onaddstream/ontrack是在RTCPeerConnection的对方挂载媒体流时触发的,并不一定开始传输流)

接收端的RTCPeerConnection

IceConnectionState:new

IceGatheringState:completed

IceConnectionState:checking

IceGatheringState:completed

==========================

发送端的RTCPeerConnection则是

IceConnectionState:new

IceGatheringState:completed

IceConnectionState:checking

IceGatheringState:completed

IceConnectionState:closed

IceGatheringState:completed

也就是说双方都能完成ice候选的收集工作,但是无法连接。

从stackoverflow上摘了一段:

The ice gathering state is not so important, as the application logic does not care usually about those (the application might monitor the candidates and know if the gathering is done when a null candidate surfaces), the ice connection states are VERY important to know if a connection was established and your application should focus on that. The peer connection state can be stable, and all the handshake done, without media flowing if the ICE connection state is failed.

也就是说iceConnectionState说明连接是否建立,即便websocket的握手完成,倘若iceConnectionState连接失败(状态不是connected),那么就不会有媒体流传输

考虑到自己在创建RTCPeerConnection时只使用了STUN服务器,是不是需要TURN服务器?

我在刚接触TURN时的一些疑问

Q:TURN和STUN的区别

A:百度:“TURN和STUN的区别”,我只是使用了STUN和TURN,并没有对其背后的原理进一步深入了解,就在这里不丢人了。

Q:需要两台服务器吗?TURN服务器可不可以和信令服务器是同一台服务器?

A:一台就够,TURN服务可以和信令转发服务配置在同一台服务器上,只要确保其使用的端口不冲突就可以了,我已经试过并成功了

Q:自己搭TURN服务器感觉好麻烦啊,可以只使用STUN服务器吗?有免费的TURN服务器吗?

A:网上一搜有很多“国内免费的STUN服务器”,具体是否能用你可以用我下面提到的Trickle ICE来检测;

这个网站提供了免费的STUN/TURN服务器(需要注册)http://numb.viagenie.ca/

但是但是但是!尽管我在Trickle ICE中能够成功得到ice候选,如下图。而且在使用时RTCPeerConnection的iceConnectionState属性也显示为connected,但我仍然没能成功传输媒体流。在我的整个WebRTC项目完成后我回过头来测试这个仍然不行...

注册后成功后你的邮箱会收到邮件(注册时验证码可能要多刷新几次)

最终我还是搭建了自己的TURN服务器

搭建TURN服务器

参考:

Centos6 安装 stun/turn服务  https://yq.aliyun.com/articles/138462

搭建ICE(TURN、STUN)服务  https://blog.csdn.net/qq_41345773/article/details/88965707

我服务器是CentOS 7.3.x

1.安装必须的文件

yum install -y make gcc cc gcc-c++ wget

yum install -y openssl-devel libevent libevent-devel mysql-devel mysql-server

2.下载并安装 LibEvent modules

下载

wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

解压

tar zxvf libevent-2.0.21-stable.tar.gz

进入解压生成的文件夹:

cd libevent-2.0.21-stable 

生成makefile文件

./configure

执行make

sudo make  

安装

sudo make install

退回上一级目录

cd ..

3.下载并安装 TURN modules

和上面一样

wget http://turnserver.open-sys.org/downloads/v4.4.5.2/turnserver-4.4.5.2.tar.gz
tar -zxvf turnserver-4.4.5.2.tar.gz
cd turnserver-4.4.5.2 
./configure
sudo make
sudo make install

4.turnserver安装成功后会出现如下信息

告知相关使用事项,需要一直看完(我还以为卡掉了....)

1) If you system supports automatic start-up system daemon services,

the, to enable the turnserver as an automatically started system

service, you have to:

a) Create and edit /etc/turnserver.conf or

/usr/local/etc/turnserver.conf .

Use /usr/local/etc/turnserver.conf.default as an example.

b) For user accounts settings: set up SQLite or PostgreSQL or

MySQL or MongoDB or Redis database for user accounts.

Use /usr/local/share/turnserver/schema.sql as SQL database schema,

or use /usr/local/share/turnserver/schema.userdb.redis as Redis

database schema description and/or

/usr/local/share/turnserver/schema.stats.redis

as Redis status & statistics database schema description.

If you are using SQLite, the default database location is in

/var/db/turndb or in /usr/local/var/db/turndb or in /var/lib/turn/turndb.

c) add whatever is necessary to enable start-up daemon for the

/usr/local/bin/turnserver.

2) If you do not want the turnserver to be a system service,

then you can start/stop it "manually", using the "turnserver"

executable with appropriate options (see the documentation).

3) To create database schema, use schema in file

/usr/local/share/turnserver/schema.sql.

4) For additional information, run:

$ man turnserver

$ man turnadmin

$ man turnutils

5.配置conf文件

找到以下目录的文件,注意!这个default文件只是个示例!!

/usr/local/etc/turnserver.conf.default

使用cp命令将其复制到/etc/turnserver.conf/usr/local/etc/turnserver.conf

即执行命令

cp /usr/local/etc/turnserver.conf.default /etc/turnserver.conf

cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf

我使用的是第一条命令,第二条命令没有测试

6.修改turnserver.conf的内容

turnserver.conf文件中有对设置内容的详细描述,学好英语或善用翻译软件

需要设置的主要有以下几点:

内网IP:

listening-ip=172.16.0.13

端口listening-port不设置默认为3478

外网IP:
external-ip=106.52.27.49

长时验证
lt-cred-mech

登录用户名&密码(假如我的是winka9587,密码是123)
user=winka9587:123

其他的都用默认值

未解决的问题:

很奇怪的一点,我在conf文件中同时设置两个静态用户就无法成功获得候选

user=user:pwd

user=user2:pwd2

但是如果只设置一个,那么就可以成功获得候选(没搞明白为什么)

7.启动turnserver

假设你在conf文件中设置的

外网ip为106.52.27.49

端口为3478

记得去服务器控制台配置好安全组规则,开放3478端口

你的conf路径为/etc/turnserver.conf

执行命令turnserver -v -r 106.52.27.49:3478 -a -o -c /etc/turnserver.conf

8.关闭turnserver

ps -ef|grep turnserver
kill -9 [序号]

如何测试我的TURN服务器是否成功运行?

浏览器访问 http://【 TURN服务器iIP地址 】:【 端口 】

出现下图 表示TURN服务器已经成功运行

此外,你可能会想看看是否能够成功通过你的TURN服务器获得ICE候选

可以使用Trickle ICE,这是WebRTC官方部署在github上的一个示例,可以用它来检测通过STUN/TURN服务器获得的ICE候选

默认的是Google的一个免费STUN服务器:stun.l.google.com:19302

单击Gather candidates即可通过你输入的所有STUN/TURN服务器收集候选

比如我自己的TURN服务器ip及端口为106.52.27.49:3478

因为测试的是TURN服务器,所以前面加上turn:(如果测试STUN服务器就加stun,就像上面的Google服务器是stun.l.google.com:19302,前面要加上stun:

turn:106.52.27.49:3478

用户名xxx

密码xxx

添加之后收集候选

Component Type 为 relay 的就是通过TURN服务器得到的候选

解决ICE问题过程中遇到的另一个问题

在尝试解决上面问题的途中我遇到了另一个问题,在使用node-wrtc的过程中我无法SetRemoteDescription,会抛出异常,查看之后发现原因是服务器端的RTCPeerConnection的signalingState在构造函数完成后状态变为closed,而客户端的初始状态为stable(PeerConnection刚刚建立还未开始协商或者已经协商完成,参考:signalingState的官方文档)

参考问题:https://github.com/feross/simple-peer/issues/426

因为在RTCPeerConnection的构造函数中参数有turn服务器和stun服务器的地址,问题出在其中的url和urls上

WebRTC的最新标准已经抛弃了url,使用urls

这里说一下我因为绕了一些弯路的原因,在服务器端需要使用WebRTC,所以使用了nodejs的node-wrtc模块,这个模块严格遵守了最新的WebRTC标准,很多官方最新标准中被废弃的功能在这里面“非常及时”地被删除了...而在浏览器上仍然可用,比如onaddstream、url

var iceOption= { iceServers: [//stun服务器{urls:"stun:stun.l.google.com:19302"},//turn服务器&登录用户名&密码{urls: "turn:106.52.27.49:3478",username:"用户名",credential:"密码"}]};var pc = new RTCPeerConnection(iceOption);

见iceServer的官方文档

https://developer.mozilla.org/en-US/docs/Web/API/RTCIceServer

解决方案:将url修改为urls

配置TURN服务器实现NAT穿透相关推荐

  1. UE4.26像素流送之公网部署(自建TURN服务器)

    像素流送(Pixel Streaming),是UE4力推的网站部署方案.官方从UE4.24开始,默认取消了对HTML5打包的支持,转而使用这种新颖的方式.这种方式的最大好处是,对客户的电脑性能基本没有 ...

  2. NAT穿透之STUN和TURN技术浅析

    出自:http://blog.csdn.net/zqf_office/article/details/25338567 在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有 ...

  3. Freeswitch在阿里云服务器语音不通问题小记(FS的NAT 穿透)

    我原来都是在公司的服务器或自己的开发环境安装FS,这次必须在阿里云上安装,自己觉得没问题,但安装好就就发现问题出来了.. 语音不通,压根就没声音! 本地PC上抓包一看,怎么回事,所有RTP包都发给了阿 ...

  4. 华为防火墙USG6000V---内网访问外网---外网访问内网服务器(NAT服务器)示例配置

    目录 一.配置要求 二.配置步骤 1. ping通防火墙接口IP地址的条件 2. 内网ping通外网终端的条件 3. 内网ping通DMZ(内网服务器)的条件 三.命令解析 一.配置要求 内网可以pi ...

  5. 思科nat配置实例_思科3750交换机配置DHCP服务器实例网络环境

    思科3750交换机配置DHCP服务器实例网络环境: 一台3750交换机,划分三个vlan, vlan2 为服务器所在网络,命名为server.IP地址段为192.168.2.0,子网掩码:255.25 ...

  6. (转)NAT与NAT穿透 原理

    原文:http://blog.csdn.net/ustcgy/article/details/5655050 5. NAT穿透 5.1 转发      最可靠但又是最低效的点对点通信方法,莫过于将p2 ...

  7. webrtc笔记(1): 基于coturn项目的stun/turn服务器搭建

    webrtc是google推出的基于浏览器的实时语音-视频通讯架构.其典型的应用场景为:浏览器之间端到端(p2p)实时视频对话,但由于网络环境的复杂性(比如:路由器/交换机/防火墙等),浏览器与浏览器 ...

  8. NAT 穿透是如何工作的

    来自:入门小站 译者序 设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台 ...

  9. NAT与NAT穿透(二)

    5. NAT穿透 5.1 转发     最可靠但又是最低效的点对点通信方法,莫过于将p2p网络通信看作一个C/S结构,通过服务器来转发信息.如下图,两个客户端A和B,均与服务器S初始化了一个TCP或U ...

  10. CentOS下配置webrtc服务器

    主要参考:Ubuntu下配置webrtc服务器 ------------------------------------------------ 原理介绍:<以下文字copy自上文> 房间 ...

最新文章

  1. 02-dispatch_barrier
  2. spring tx:advice 和 aop:config 配置事务
  3. Arduino--二维码显示
  4. VTK:Filtering之ImplicitBoolean
  5. HTML表格和HTML表单
  6. 计算机支持的游戏化教学,初中信息技术教学中游戏化教学的应用探究
  7. 【转】对路径**的访问被拒绝
  8. linux 标准函数注释,Linux 驱动程序中相关函数注释汇总(跟新中)
  9. 45. Use member function templates to accept all compatible types.
  10. 计算机网络技术期末应用试卷,中专学校2016年《计算机网络技术与应用》期末考试题(考试卷与答案)...
  11. 缠论108课_缠论108课学习顺序
  12. App Store 隐私政策网址(URL)
  13. Excel ActiveX组合框项目选择宏
  14. Unity3D 第一人称视角摄像机旋转控制
  15. Upgraded Edition
  16. Aspose.word设置页眉
  17. SSM整合步骤(超详细)
  18. 莫言领取诺贝尔文学奖演讲稿(中英文)----讲故事的人
  19. 事务前沿研究 | 隔离级别的追溯与究明,带你读懂 TiDB 的隔离级别(下篇)
  20. matlab 残差plot,residualplot分析

热门文章

  1. 一道金蝶校园招聘试题数据库笔试题
  2. 用Python实现一个动物识别专家系统--人工智能
  3. Tomcat 日志配置与优化
  4. endnotex8与9的区别_下载安装EndnoteX8或EndnoteX9,建立数据库并以自己的名字命名。...
  5. 安卓手机管理软件_超强手机磁力搜索+播放+下载软件,满速下载,一键播放!...
  6. 如何自己搭建测试环境
  7. C语言求1000后面有多少个0,c语言题目计算1000!的末尾有多少个零
  8. iweboffice2015库文件WebOffice.js中新增删除两个书签之间的内容实现
  9. oracle bitmap btree 索引,oracle之bitmap索引
  10. 关于ASCII码和机内码