注:如果你已经实现了基于 coturn 的 P2P 模式通话,而现在正在努力实现 Turn 转发模式的音视频通话的话,请直接查看第三节;
一、源码下载编译
1、编译安装 coturn
coturn 依赖 libevent2,通过 apt-get 直接安装 libevent2
github 下载 coturn 源码
git clone https://github.com/coturn/coturn
2 、编译安装
cd coturn
./configure
make
sudo make install
二、 coturn 配置
1、拷贝默认配置
coturn 源码的 example/etc 目录中,有提供 coturn 的默认配置文件,以供我们使用,我们需要分别拷贝 turnserver 所需要的三个配置文件:
-
首先在 /etc 目录下创建 turnserver 配置的存放目录:
sudo mkdir /etc/turnserver/
注: 这一步 并不是必须的,因为 turnserver 启动时可以指定任意目录的配置文件;
-
拷贝 conf 配置脚本
进入 coturn 目录
cd coturn sudo cp ./examples/etc/turnserver.conf /etc/turnserver/
注: 在 examples 目录下的此配置文件,每个配置项均有说明,这样可以明白具体的参数含义;
此配置文件自己也可以新建,然后将后面章节中的内容直接粘贴进去;
-
拷贝 pem 秘钥文件
为了做些明显的区分,我们将 *.pem 秘钥文件也拷贝到 /etc/turnserver/ 目录下(也可由 openssl 命令生成,这里我们偷个懒,直接用默认的):
sudo cp ./examples/turn_server_*.pem /etc/turnserver/
这里我们拷贝的秘钥文件,将在上一步的 turnserver.conf 配置文件中指定;
2、生成 coturn 用户
通过 turnadmin 执行简单的命令,指定相应的用户名、密码、域名,既可将此账号添加到 coturn 的数据库中;
如下:
sudo turnadmin -a -u 用户名 -p 密码 -r 域名
执行成功后,通过 turnadmin -l 既可查看新创建的用户名及域名:
sudo turnadmin -a -u gobert -p 12345678 -r qiniu.com
turnadmin -l
gobert[qiniu.com]
创建成功!
其实这里我们指定的密码和域名暂时都是无关紧要的,因为后面我们在启动 turnserver 时,可以通过相关参数,给其指定固定的域名和密码;
3、配置 turnserver.conf
建议:将之前拷贝的 turnserver.conf 文件备份,并新建一个 turnserver.conf 文件,将一下内容拷贝进入:
#本地监听的网卡设备,这里根据自己的实际情况填写
listening-device=eth1
listening-port=3478
#本地用于转发的网卡设备,这里根据自己的实际情况填写
relay-device=eth1
#指定的转发端口的分配范围,测试时,可以将防火墙全部关闭,防止 UDP 端口被屏蔽
min-port=3480
max-port=3500
#日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出
Verbose
#消息验证,WebRTC 的消息里会用到
fingerprint
#webrtc 通过 turn 中继,必须使用长验证方式
lt-cred-mech
# ICE REST API 认证需要
use-auth-secret
# REST API 加密所需的 KEY
# 这里我们使用“静态”的 KEY,Google 自己也用的这个
static-auth-secret=4080218913
#用户登录域,下面的写法可以不改变它,因为再启动 turnserver 时,可以通过指定参数覆盖它
realm=<填写你自己的域名>
#可为 TURN 服务提供更安全的访问
stale-nonce
# SSL 需要用到的, 生成命令:
# sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
#这里我们使用刚才拷贝到 /etc/examples/目录下秘钥文件
cert=/etc/turnserver/turn_server_cert.pem
pkey=/etc/turnserver/turn_server_pkey.pem
#屏蔽 loopback, multicast IP地址的 relay
no-loopback-peers
no-multicast-peers
#启用 Mobility ICE 支持(不懂)
mobility
#禁用本地 telnet cli 管理接口
no-cli
注:以上配置内容中,有许多的参数并没有配置,turnserver 启动时将使用其默认值,已配置的参数,也可以在 turnserver 启动时加上相应的参数覆盖它;
以上配置项目中,只要 listening-device 和 relay-device 需要根据自己 server 的实际情况进行修改,其它均使用默认值既可。
三、启动 turnserver
通过 turnserver 实现 Peers 默认通过 turn 中继转发媒体数据流,进行音视频通话,其中一个关键点是 coturn 需要布置到一个同时连接到两个网络的服务器(公网)上,如网卡一:公网,网卡二:私网(暂且还用不到),且需要同时联通网络,否则会出现两个 Peers 只要开始连接,turnserver 就会报 Allocation timeout 的错误,目前原因需要通过跟踪代码去分析,暂时还未明确具体原因。
启动 turnserver 可以通过如下命令进行启动:
启动 turnserver 可以通过如下命令进行启动:
sudo ./turnserver -v -L 222.73.202.228 -a -f -r 222.73.202.228 -c /etc/turnserver/turnserver.conf
以上命令:通过 -v 指定日志输出级别; -L 指定用于绑定的网卡 IP 地址;-a 指定使用长期凭证机制,turn中继转发模式,必须使用长期凭证机制;-f 指定 turn 消息使用 fingerprint;-r 指定使用的域名,将覆盖 turnserver.conf 文件中的配置;-C 指定配置文件路径。
四、通话测试
让 Peers 默认通过 turn server 转发的模式进行音视频通话,通过修改 Clients 端的代码或者配置既可实现,我们首先实现浏览器之间 SFU 模式的音视频通话,后面再实现 Mobile App Demo 之间的通话。
1、实现浏览器之间 turn 转发通话
进入 apprtc 源码中(Room Server),修改其 out/app_engine/apprtc.py 文件,找到 get_room_parameters 方法,修改如下的一段代码,默认是:
# Which ICE candidates to allow. This is useful for forcing a call to run
# over TURN, by setting it=relay.
ice_transports = request.get('it')
注释已经说得很清楚了,ice_transports 可以通过设置成 relay,以强制会话通过 TURN 进行转发,修改后如下:
# Which ICE candidates to allow. This is useful for forcing a call to run
# over TURN, by setting it=relay.
ice_transports = request.get('it')
ice_transports = 'relay'
重启房间服务器,以及刷新下浏览器页面,以重新加载修改后的 Python 代码,通过 wireshark 抓包或者浏览器控制台的日志输出,我们已经可以看到,WebRtc 的 candidates 交换,已经只有 relay type 的了,不会再去交互 host 和 srflx 类型的 candidates 了。
打开火狐浏览器(暂未实现 https 加密访问),输入 RoomServer 地址,进入同一个房间,既可开启 TURN 转发模式的视频通话了。
2、实现 App 之间 turn 转发通话
实验中
网友评论