webrtc服务器搭建

2023-11-16

两年前写的笔记,可能有些链接和方式已经不对了,自己评估!

名词解释

  • realm: 用于描述服务器或服务器中的上下文的字符串。realm告诉客户端使用哪个用户名和密码组合来认证请求用于描述服务器或服务器内的上下文的字符串。
  • allocation: 客户端向服务端申请分配授予中继传输地址,以及相关状态,例如权限和到期定时器。它要求不能重复allocate申请,没有释放请求协议,而在在一段时间内自动失效(在turnserver中配置)。而如果希望一直使用,则需要定时使用refresh请求保持allocate的资源。在成功的allocate之后,发送数据之前,需要有一个createPermission的请求,这个请求目的是对通信的两端进行授权,否则中继不会转发收到的包到对端,而是丢弃。这个授权与allocate类似,也没有释放请求协议,并且会在一段时间内自动失效。如果希望一直使用,则需要定时再次使用相同的请求参数发送createPermission请求。
  • peer: 被转发的对象,turn客户端发送数据给turn服务,服务再把数据转发到peers,peers回复服务,服务把转发给turn客户端。peer就是被转发的对象。
  • Transport Address: 一个ip地址和一个port的组合
  • Server-Reflexive Transport Address: NAT的“公共端”上的传输地址。该地址由NAT分配以对应于特定主机传输地址。
  • Long-Term Credential: 简单来说就是,使用hmac对realm、key、username的组合进行加密,并取base64的值;详情请看rfc5389#section-15.4
  • candidate:candidate是一个ip端口对(ip地址和端口号),在ICE中它有3类组合{Local Address:子网传输地址,Server Reflexive Address:NAT上传输地址,Relayed Address:TURN上转发地址(存在TURN的情况才有)}

概要

用一张图片来说明客户端A向客户端B发起通话这个过程中,信令服务和STUN服务承担怎样的角色
WebRTC单向呼叫的流程图

  • 房间服务
    房间服务用于创建和管理通话会话的状态。Google搭建了一个可用的房间服务appr.tc,而且Google也给出这个房间服务的源码,我们可以依据它的代码去搭建我们自己的房间服务用于本地测试以及项目使用。

  • 信令服务
    信令服务主要工作是会话控制,网络和媒体信息交换。具体阅读WebRTC的一篇官方文章Getting Started with WebRTC,找到Signaling: session control, network and media information

  • 会话控制消息:初始化或者关闭通信并报告错误

  • 网络配置:获取NAT外的ip和port

  • 媒体能力:获取当前终端和其他终端{浏览器、Android、IOS}支持的编码解码器{格式、能力}、采集分辨率、采样率、位宽等信息。

  • ICE服务
    ICE服务是对STUN和TURN服务的整合,用于处理peers间的打洞和打洞不通的情况下的转发。

房间服务、信令服务、ICE(STUN、TURN)服务、Web服务的安装与配置

Google推荐的服务安装平台是ubuntu,所以我们需要准备一个ubuntu版本为14.04及以上的系统。

房间服务 安装与配置

房间服务是负责房间的创建于管理,也负责整合其他的服务。

这里采用webrtc提供的apprtc项目去架设我们自己的房间服务,此项目依赖Google_App_Engine_SDK_for_PythonGrunt

安装

依据官方的说明能很快就能装好房间服务

  • 安装依赖
    依赖nodejs、npm、pip这三个执行程序
~/webrtc_server$ sudo apt install nodejs nodejs-legacy npm pip
  • 下载代码
~/webrtc_server$ git clone https://github.com/webrtc/apprtc.git
  • 编译
    此服务是基于js编写的,所以需要配置一下js环境;更新js包管理工具npm,安装js构建工具grunt-g安装到全局目录下,默认全局目录为/usr/local/lib/node_modules
    安装依赖工具
~/webrtc_server/apprtc$ sudo npm install -g npm grunt-cli

安装依赖包;安装在当前目录的node_modules目录

~/webrtc_server/apprtc$ npm install

编译apprtc;生成的文件在再当前目录下的out目录

~/webrtc_server/apprtc$ grunt build

下载运行apprtc工具-GAE
此房间服务需要依赖Google的应用引擎(Google APP Engine)来执行;用浏览器打开GAE仓库,把网页拉到最后,找到最新的版本号,然后把刚刚的参考地址+版本号去下载;例如google_appengine_1.9.49.zip

~/webrtc_server/apprtc$ wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.49.zip
~/webrtc_server/apprtc$ unzip google_appengine_1.9.49.zip
  • 配置
    每一个peer都会连接房间服务,房间服务需要提供信令服务、打洞/转发服务的访问地址,所以此配置需要依据其他两个服务的配置而定。

constants.py修改如下:

-TURN_BASE_URL = 'https://computeengineondemand.appspot.com'
-TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'
-CEOD_KEY = '4080218913'
+TURN_BASE_URL = 'http://192.168.201.64:2016' #Web服务地址
+TURN_URL_TEMPLATE = '%s/turn/%s/%s' # web服务的地址,rest样式
+CEOD_KEY = 'boyaa_media' # key,这个需要与coturn的配置相同

 WSS_INSTANCES = [{
-    WSS_INSTANCE_HOST_KEY: 'apprtc-ws.webrtc.org:443',
+    WSS_INSTANCE_HOST_KEY: '192.168.201.64:8089', #信令服务器
     WSS_INSTANCE_NAME_KEY: 'wsserver-std',
     WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
 }, {
-    WSS_INSTANCE_HOST_KEY: 'apprtc-ws-2.webrtc.org:443',
+    WSS_INSTANCE_HOST_KEY: '192.168.201.64:8089', #信令服务器
     WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
     WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
 }]

apprtc.py修改如下:

-    wss_url = 'wss://' + wss_host_port_pair + '/ws'
-    wss_post_url = 'https://' + wss_host_port_pair
+    wss_url = 'ws://' + wss_host_port_pair + '/ws'
+    wss_post_url = 'http://' + wss_host_port_pair
  • 启动房间服务
    配置GAE环境
~/webrtc_server/apprtc$ export PAHT=$PATH:${PWD}/google_appengine

启动服务
选项--host房间服务监听地址,选项--port房间服务监听端口;选项--admin_host后台管理监听地址,选项--admin_port后台管理监听端口;选项--log_level打印级别{debug,info,warning,critical,error};选项--skip_sdk_update_check运行dev_appserver.py命令时不检查更新;

~/webrtc_server/apprtc$ dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --storage_path=/home/stone/mywork/webrtc_server/log --logs_path=apprtc.log out/app_engine/ --log_level debug

信令服务

房间服务apprtc里自带了一个信令服务[Collider](https://github.com/webrtc/apprtc/blob/master/src/collider),是一个Go语言编写的基于WebSocket实现的一个信令服务器。

  • 安装依赖
~/webrtc_server$ sudo apt install go
  • 创建collider安装目录
    我会把信令服务当作一个单独的服务处理,所以会为它创建一个单独的目,并命名为collider;由于go的语言的安装会从环境变量GOPATH寻找可安装的目录,所以需要把创建的目录collider加入到环境变量GOPATH中。
~/webrtc_server$ mkdir -p collider/src && export GOPATH=${PWD}/collider
  • “下载”代码
    代码已经存放在房间服务里面,只需要建立软连接或者进行一次拷贝,建议是通过软连接的方式(源目录需要绝对路径),这样下次升级房间服务的时候可以直接升级信令服务,只需要重新编译就可以了。
~/webrtc_server/apprtc$ ln -s ${PWD}/src/collider/collider $GOPATH/src
~/webrtc_server/apprtc$ ln -s ${PWD}/src/collider/collidermain $GOPATH/src
~/webrtc_server/apprtc$ ln -s ${PWD}/src/collider/collidertest $GOPATH/src
  • 下载相关依赖与编译
    选项get下载指定包以及相关依赖资源;选项install编译指定包,编译后的文件存放在$GOPATH/bin目录下;如果get失败,请检查下环境变量GOPATH
~/webrtc_server/apprtc$ go get collidermain
~/webrtc_server/apprtc$ go install collidermain
  • 修改配置
    需要与房间服务关联起来,这样信令服务才知道要服务那个房间服务;需要修改的地方是:监听端口、房间服务地址、tls模式;从安全角度考虑,后期我们上线以后应该还是需要支持tls模式的,目前测试阶段暂时不做支持,因为需要一个认证的证书。每次修改配置文件都需要重新执行一次安装的动作go install collidermain
    修改如下:
-var tls = flag.Bool("tls", true, "whether TLS is used")
-var port = flag.Int("port", 443, "The TCP port that the server listens on")
-var roomSrv = flag.String("room-server", "https://appr.tc", "The origin of the room server")
+var tls = flag.Bool("tls", false, "whether TLS is used")
+var port = flag.Int("port", 8089, "The TCP port that the server listens on")
+var roomSrv = flag.String("room-server", "http://192.168.201.64:8080", "The origin of the room server")
  • 启动信令服务
    collider信令服务支持命令行配置和文件形式配置,命令行配置会覆盖文件配置;配置文件是GOPATH/src/collidermain/main.go;命令行参数:-port指定监听端口,-tls设置是否采用tls模式,-room-server设定房间服务地址。
$ $GOPATH/bin/collidermain

turn服务

Google实现的

  • 安装依赖
    coturn的“瞬时认证”需要依赖数据库,目前我采用最简单的sqlite3,如果我们的用户量较大可以考虑采用其他数据库;它还依赖openssl做认证、加解密,依赖libevent2做监听;
$ sudo apt install openssl libevent-core-2.0-5 libevent-dev sqlite sqlite3
  • 下载
    它提供了两种安装方式,源码安装和deb包安装,由于我需要简单阅读源码,所以选择源码安装方式。
~/webrtc_server$ git clone https://github.com/coturn/coturn.git
  • 编译
~/webrtc_server/coturn$ ./configure && make -j && sudo make install
  • 默认配置
    配置文件/usr/local/etc/turnserver.conf
    认证证书: 私钥/usr/local/etc/turn_server_pkey.pem,公钥/usr/local/etc/turn_server_cert.pem
    Log文件/var/tmp/turn.log
    数据库文件/usr/local/var/db/turndb

  • 配置
    初始化数据库,我们采用sqlite3,利用coturn的配置创建数据库文件并创建相应的表

~/webrtc_server/coturn$ sudo rm -f /usr/local/var/db/turndb
~/webrtc_server/coturn$ cat turndb/schema.sql | sudo sqlite3 /usr/local/var/db/turndb

创建证书,并拷贝到默认目录,此证书用到的密码应该与配置文件turnserver.confstatic-auth-secret的一样

~/webrtc_server/coturn$ openssl req -new -x509 -newkey rsa:4096 -days 3650 -keyout privkey.pem -out server.pem
~/webrtc_server/coturn$ openssl rsa -in privkey.pem -out privkey.pem
~/webrtc_server/coturn$ sudo mv privkey.pem /usr/local/etc/turn_server_pkey.pem
~/webrtc_server/coturn$ sudo mv server.pem /usr/local/etc/turn_server_cert.pem

配置文件,由于项目需求,我们暂时不考虑stun,所以会去掉stun的监听以减轻服务器监听负担(占用的资源感觉可以忽略不计),采用REST API方式认证;创建一个空配置文件\/usr\/local\/etc\/turnserver.conf,配置文件内容如下:

listening-device=ens32 #监听设备名字,通过ifconfig查看
listening-port=3478 #stun/turn共用的监听端口,根据看到的文档没有发现分离方式
listening-ip=192.168.201.64 #监听的ip,如果不设置会默认监听ipv4/v6的本地地址以及host地址,我只需要监听ipv4的host地址,所以需要指定它;可以存在多个监听地址,写多个listening-ip即可
relay-device=ens32 #转发设备名字
relay-ip=192.168.201.64 #转发地址,我也仅仅需要ipv4的host地址,所以手动指定,也可以多个
verbose #开启普通打印
fingerprint #取设备server的fingerprint给到client
use-auth-secret #使用瞬时认证
static-auth-secret=boyaa_media #瞬时认证的key
realm=boyaa.com #域名,一定需要设置的
no-dtls #不支持dtls模式
no-stdout-log #不在终端输出日志
log-file=/var/log/turnserver.log #指定log存放位置及名字类型,最后的文件名字会是turnserver_日期.log
no-stun #不支持stun,我们只需要转发
no-loopback-peers #不支持perr使用loopback地址(127.0.0.1 和 ::1)
no-multicast-peers #不支持使用广播地址(224.0.0.0及以上地址)
mobility #移动ICE规范支持,我也不懂啥意思
cli-ip=192.168.201.64 #command-line-interface地址,也就是telnet登陆地址,一般调试用,我需要用它看turnserver的状态
cli-password=coturn #telnet登陆密码
  • 启动coturn服务
    服务的配置有两种形式{配置文件、命令行配置},可以同时使用两种形式的配置,命令行配置会覆盖文件配置;-o选项以守护进程方式启动;-c指定配置文件;-n仅仅采用命令行方式配置;-v普通模式的Log输出;-V很啰嗦的打印,官方都不建议打开;-S仅仅使用stun服务。
$ sudo turnserver
  • 查看监听端口
    netstat选项说明:-l仅显示监听的socket;-n显示数字地址和端口(192.168.1.102:3487这类地址);-p显示socket所属的pid和进程名;-t显示tcp协议的socket;-u显示udp协议的socket。
    这些ip和端口REST-API使用的。
$ sudo netstat -lnptu | grep turnserver | uniq | grep tcp
  • 配置REST API
    我们需要一个Web服务用于给webrtc提供“瞬时密码”,依据coturn REST API规范去编写这个Web服务,提供一个GET方法;这个Web服务还需要向turn服务写入这个“瞬时密码”。
    客户端和服务端的验证过程如下图:
    在这里插入图片描述

python实现如下:

import web
import json
import hmac
import sqlite3
from hashlib import sha1
import time, datetime

urls = ('/turn/([^/]+)/[^/]+','turn')

class turn:
    def GET(self,username):
        ttl = 86400
        end_time = int(time.time()) + ttl
        turn_username = str(end_time)+":"+username
        key = 'boyaa_media'
        hashed = hmac.new(key, turn_username, sha1)
        credential = hashed.digest().encode("base64").rstrip('\n')
        data = {
          'ttl': ttl,
          'iceServers': [
              {
                  'urls': [
                      "turn:192.168.201.64:3478?transport=udp",
                      "turn:192.168.201.64:3478?transport=tcp",
                      "turn:192.168.201.64:5349?transport=tcp",
                      "turn:192.168.201.64:5766?transport=tcp",
                      ],
                  'username': turn_username,
                  'credential': credential
              },
           ],
        }

        conn = sqlite3.connect('/usr/local/var/db/turndb')
        conn.execute("insert into turn_secret (realm,value) values (?,?)",(realm,credential));
        conn.commit()
        conn.close()
        return json.dumps(data)

if __name__=="__main__":
    app = web.application(urls, globals())
    app.run()
  • 启动Web服务
    在后面指定监听端口号,我使用2016,由于需要访问到需要root权限的数据库,所以使用sudo执行
$ sudo python webrtc_restapi_server.py 2016
  • 配置文件其他选项说明
选项 说明
listening-device 监听的网络设备名字,通过命令ifconfig查看
listening-port TURN的监听端口
tls-listening-port TURN TLS监听端口
listening-ip 转发服务器监听ip,可以有多个(设置多个listening-ip即可),同时支持IPv4 IPv6,默认使用本ip
aux-server 辅助服务,用于stun/turn
relay-device 转发服务器的设备名字
relay-ip 转发ip,默认采用本地ip地址作为转发地址,端口号为服务器自动分配
external-ip turn server共有地址和私有地址的隐射,书写形式: external-ip=60.70.80.91 或者 external-ip=60.70.80.91/172.17.19.101
relay-threads 单个连接的最大并发数,如果不设置这个字段默认为当前设备的CPU个数
min-port 最小分配端口号,转发服务器申请的最小端口号
max-port 最大分配端口号,转发服务器申请的最大端口号
verbose 详细日志,默认关闭,调试的时候或许可以用到
Verbose 这个是verbose的扩展,会输出更加详细的日志,官方都推荐打开
fingerprint 指纹,默认关闭,TODO
lt-cred-mech long-term认证,可以通过turnadmin -k -u user -p pass -r realm获取key
no-auth 和lt-cred-mech的作用是相反的,允许匿名访问turn server,如果没有定义任何用户并且没有定义定义此选择,那么默认是开启的,如果存在一个用户或者开启lt-cred-mech,那么默认是关闭的
use-auth-secret 静态认证密码,这是一种较安全的做法,客户端通过http向服务器请求一组加密后的密码,客户端返回一个lt认证过的密码,用户可以使用这组密码与turn server通信。具体查看TURN REST API
static-auth-secret TURN REST API使用的静态密码,否则动态生成一个秘密
server-name 认证服务器
oauth 开启认证
user 设置用户以及密码,这个和use-auth-secret是对立存在的。客户端可以直接通过这个用户名和密码来访问turn server,使用形式:user=username1:key1 user=username1:password1,存在多个用户就使用使用多次;key通过turnadmin生成
userdb SQLite数据库文件的位置,使用形式:userdb=/var/db/turndb
psql-userdb PostgreSQL数据库的连接配置,使用形式:psql-userdb="host=<host> dbname=<database-name> user=<database-user> password=<database-user-password> connect_timeout=30"
mysql-userdb MySQL数据库的连接配置,使用形式:mysql-userdb="host=<host> dbname=<database-name> user=<database-user> password=<database-user-password> port=<port> connect_timeout=<seconds> read_timeout=<seconds>"
mongo-userdb MongoDB数据库的连接配置,使用形式:mongo-userdb="mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]"
redis-statsdb Redis数据库的连接配置,使用形式:redis-statsdb="ip=<ip-address> dbname=<database-number> password=<database-user-password> port=<port> connect_timeout=<seconds>"
realm 域名,任意字符串,例如boyaa.com
user-quota 每一个用户可以申请的名额个数
total-quota 总共可以申请的名额个数
max-bps 输入和输出的最大码率
bps-capacity 总吞吐量
no-udp 不监听upd客户端,默认监听
no-tcp 不监听tcp客户端,默认监听
no-tls 不监听tls客户端,默认监听
no-dtls 不监听dtls客户端,默认监听
no-udp-relay 不转发到upd peer,默认转发
no-tcp-relay 不转发到tcp peer,默认转发
max-allocate-lifetime allocate失效时间,默认是3600秒
channel-lifetime channel通道失效时间,默认是600秒
permission-lifetime 权限失效时间,默认死300秒
cert 证书位置
pkey 私钥位置
no-stdout-log 日志不输出到终端,默认输出
log-file 日志输出位置,如果设定,默认情况会同时输出到终端和log文件内
simple-log 日志的输出格式(without PID and date appendage)
alternate-server 交替server,用户轮流接收客户端的ALLOCATE requests请求,存在多个server就定义多次
stun-only 只提供stun功能
no-stun 不提供stun功能
rest-api-separator 设置TURN REST API的分隔符号
no-loopback-peers 不允许peer使用loopback地址(127.x.x.x and ::1)
no-multicast-peers 不允许peer使用广播地址(224.0.0.0 and above, and FFXX:*)
max-allocate-timeout 设置allocate超时时间,单位是秒,使用形式:max-allocate-timeout=60
denied-peer-ip 不允许访问的ip范围
allowed-peer-ip 允许访问的ip范围
no-cli 关闭telnet支持
cli-ip 设置telnet登陆ip
cli-port 设置telnet端口号

参考

扩展阅读

  • NAT,了解NAT是什么,以及NAT类型{完全圆锥型NAT、受限圆锥型NAT、端口受限圆锥型NAT、对称NAT}
  • ICE,了解ICE是啥
  • STUN,知道啥是STUN(是一种网络协议,允许客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口);了解STUN 流程是如何通过stun协议判断client的NAT类型的
  • TURN,了解TURN的是干啥的
  • SDP for the WebRTC,在创建本地媒体之后需要把这些信息按照SDP规范封装起来(音视频编码格式、采样率、位宽、分辨率等),peer端接收到这些信息以后创建指定类型的解码器,与代码结合起来看规范会容易理解一些;sessiondescription.h包含了对SDP的拆分的封装;此文档主要以例子为主
  • SDP-RFC4145,如果不想阅读RFC文档,想快速了解SDP可以看看wiki-SDP对SDP字段的解释
  • 路由形式,了解路由形式,特别是单播和多播{任播广播多播单播geocase}
  • webrtcstats,了解webrtc的一些统计

other

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webrtc服务器搭建 的相关文章

  • Android WebRTC 中的本地视频渲染器

    我正在使用这个库 https bintray com google webrtc google webrtc https bintray com google webrtc google webrtc 我想要实现的目标 至少在我的项目开始时
  • iceConnectionState 已断开连接(通过互联网使用时)

    这个问题以前曾被问过 但我还没有找到答案 我基本上遇到了与描述相同的问题here https stackoverflow com questions 34405816 peerjs webrtc iceconnectionstate fai
  • WebRTC:对多个对等连接使用相同的 SDP?

    是否可以在多个对等连接中使用相同的 SDP 我正在使用 WebRTC 构建视频会议 这个想法是 呼叫者使用某种信令机制 使用其 SDP 每个用户相同的 SDP 向所有其他用户发送广播消息 然后用户将使用其 SDP 进行响应 当用户收到某人的
  • 使用 django 通道将 webRTC 视频流发送到服务器

    我正在尝试创建一个用 django 编写的人脸检测 Web 应用程序 该应用程序是这样工作的 用户导航到该 url 相机在客户端计算机上启动 然后将每一帧发送到服务器进行人脸检测 然后将处理后的帧显示在网页上 我知道我无法使用 opencv
  • 从 MediaStream 对象获取媒体详细信息(分辨率和帧速率)

    我正在捕获用户的相机 我想以尽可能最佳的分辨率捕获图片 所以我的代码类似于下面的代码片段 我想从传入流中读取分辨率详细信息 因此我可以将其设置为视频高度和宽度 我将用它来单击快照 我希望快照具有流提供的最佳质量 这可能吗 读取分辨率详细信息
  • 使用媒体流扩展 (MSE) 显示 getUserMedia Stream 实时视频

    我正在尝试使用 getUserMedia 显示从网络摄像头获取的 MediaStream 并使用任何可能播放的机制将其中继到远程对等点 作为实验 我没有直接使用 webRTC 因为我想控制原始数据 我遇到的问题是我的视频元素不显示任何内容
  • 在 Heroku 上部署 PeerJS 服务器

    我的 PeerJS 服务器有问题 我从这里使用了 部署到 Heroku 按钮 https github com peers peerjs server https github com peers peerjs server 我不知道如何连
  • 我们可以为 webrtc 视频设置的最小分辨率是多少?

    我正在使用 webrtc 测试一个点对点视频聊天应用程序 当我将视频限制设置为 var video constraints mandatory maxHeight 120 maxWidth 160 optional window navig
  • SignalR WebRTC WebSocket 已处于 CLOSING 或 CLOSED 状态

    我想测试运行 SignalR 和 WebRTC 的最简单实现 我将代码托管在https github com foyzulkarim WebRtc https github com foyzulkarim WebRtc 我制作了两个不同的文
  • 为Windows应用程序实现webrtc数据通道[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有谁知道如何向用 C 构建的 Windows 应用程序实现 WebRTC DataChannel API 以便在 NAT 后面的客户端
  • Node教程一对多无加载远程服务器Stream Spinner动不停

    我对在项目中使用所需的 Kurrento 很陌生 但是当我克隆 git hub 上为 Kurento 提供的教程并遵循 one2Many 调用的说明时 首先 adapter js 的软件包损坏了 因为我成功解决了它们 但之后出现了一个问题
  • 具有 3 个用户连接的 WebRTC

    我现在正在实施源代码WebRTC 示例 https github com webrtc samples tree gh pages src content peerconnection audio通过使用网状拓扑成为 3 个用户连接 但是
  • Android WebRtc 本地视频流无法在棉花糖上显示,但可以在棒棒糖上显示

    添加的库 libjingle peerconnection jar Version 1 7 0 101 libjingle peerconnection so so 等级依赖性 fi vtt nubomedia utilities andr
  • WebRTC 与 python

    我想用 python twisted 制作一个流服务器 它接收 WebRTC 视频流 然后对其应用一些 OpenCV 算法 但是我找不到 WebRTC 的 python 模块 如何使用 python twisted 发送和接收 WebRTC
  • 如何在webRTC android中将视频流数据录制为mp4?

    请帮我 我在中使用了这个例子https github com pcab AndroidRTC https github com pchab AndroidRTC将视频和音频从 Android 设备流式传输到其他 Android 设备 在这个
  • 我可以简化同一专用网络上计算机的 WebRTC 信号传输吗?

    WebRTC 信号让我发疯 我的用例非常简单 信息亭和控制室网络应用程序之间的双向音频对讲 两台计算机都在同一网络上 两者都无法访问互联网 所有机器都有已知的静态 IP 我读到的所有内容都希望我使用 STUN TURN ICE 服务器 这个
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • 通过 Websockets 进行 WebRTC 视频聊天

    我正在尝试使用 webRTC 和 WebSockets 进行信号发送来开发视频聊天应用程序 我的问题是 我不知道创建 RTCPeerConnection 并通过 webSocket 连接两个对等点 2 个浏览器 的过程是什么 至少在本地 我
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • WebRTC、getDisplayMedia() 不捕获远程流中的声音

    我有一个自己的网络应用程序 它基于peerjs库 它是一个视频会议 我正在尝试使用 MediaRecorder 进行录制 但我遇到了一个非常不愉快的情况 捕获我的桌面流的代码如下 let chooseScreen document quer

随机推荐

  • 链家网页爬虫_爬虫实战1-----链家二手房信息爬取

    经过一段机器学习之后 发现实在是太枯燥了 为了增添一些趣味性以及熟练爬虫 在之后会不定时的爬取一些网站 旨在熟悉网页结构 尤其是HTML的元素 ajax存储 json 熟练使用pyspider scrapy两大框架 掌握基本的request
  • Java-向下转型-instanceof 关键词

    Java 向下转型 instanceof 关键词 1 父类对象转型为子类 package com lmwei p10 public class PersonTest public static void main String args 多
  • [刷题记录]牛客面试笔刷TOP101(二)

    一 传送门 刷题记录 牛客面试笔刷TOP101 一 HY PIGIE的博客 CSDN博客 目录 1 合并二叉树 2 二叉树的镜像 3 判断是否为二叉搜索树 4 判断是不是完全二叉树 1 合并二叉树 合并二叉树 牛客题霸 牛客网 nowcod
  • cpolar 内网穿透FTP Server

    由于FTP协议是个多端口协议 它需要侦听本地TCP 21端口和一个数据传输端口段 1024 65535 所以通常难以穿透 以下为cpolar给出的解决方案 1 创建FTP隧道 在本地安装配置cpolar内网穿透后 创建隧道 cpolar f
  • 关于32单片机IO口8种状态的理解

    最近接触了32单片机 关于对于IO口的学习想记录下来 有什么不对的地方 希望能指出来 进行改正 32单片机IO口共有八种状态 分别是 输入 1 输入浮空 2 输入上拉 3 输入下拉 4 模拟输入 输出 1 开漏输出 2 推挽输出 3 推挽复
  • ElasticSearch第十二讲 ES 集群脑裂问题

    ES集群出现脑裂 脑裂这个词 我们肯定不会陌生 在zk集群 mq集群搭建就考虑过这个问题 为保证部署在不同机房的集群始终保证任何时候只会有一个Leader来协调处理问题 当集群其他机器或者主节点出现故障时 保证重新选举出主节点不影响整个系统
  • vue三种常用获取input值写法

    1 v model 表单输入绑定 使用v model创建双向数据绑定 用来监听用户的输入事件以更新数据 并对一些极端场景进行一些特殊处理
  • 【数据处理】 python 常用操作整理

    python 数据分析常用操作 这是本人在数据分析中 记不住 反复查询的一些命令汇总 在此做个归纳汇总 并不定期更新 Dataframe import pandas as pd 合并DF 需求 有的时候需要将多个列相同的数据集 如别人的训练
  • Python调用OpenAI接口的简单封装

    1 注册OpenAI账号 获取OpenAI API key 网上有很多资料 这里就不再叙述了 科学上网 懂得都懂 一个小坑 在生成API key之后需立刻复制下来 否则将无法再次打开 当然如果错过复制了 也可以再重新生成一个key 2 安装
  • FinalShell 介绍

    官网 http www hostbuf com FinalShell是一体化的的服务器 网络管理软件 不仅是ssh客户端 还是功能强大的开发 运维工具 充分满足开发 运维需求 特色功能 免费海外服务器远程桌面加速 ssh加速 双边tcp加速
  • 设置linux ip命令

    设置linux ip命令 http hi baidu com BD F1 C8 D5 C8 C8 B5 E3 blog item 0b7256308902e19da9018e11 html ifconfig eth0 192 168 168
  • pytorch 自学笔记@_@

    课程 dataset 类 from torch utils data import Dataset from PIL import Image import os class MyData Dataset def init self roo
  • java处理跨域处理

    经常遇到加了跨域但是前端访问还是会跨域 很有可能是没有走你写的跨域的流程 这时候加一个优先级就可以解决这个问题了 一般都是用这个方法 Bean public CorsFilter corsFilter UrlBasedCorsConfigu
  • 用C语言表白

    int day for day 0 day lt Mylife day printf i love you 我们相遇的那一刻起 我愿用一辈子 每天爱你
  • 整十粉丝庆祝文章系列内容征集建议

    亲爱的读者们 大家好 作为一名文章作者 我深知没有读者的支持和喜爱 我的文字就只是无意义的文字堆积 因此 为了庆祝与感谢大家长久以来的支持 我准备举办一场特别的活动 粉丝庆祝文章系列内容征集建议 我想听听你们的声音 了解你们对我写作的喜好
  • 堆和栈的区别以及联系

    堆与栈的区别有 栈内存存储的是局部变量而堆内存是实体 栈内存的更新速度高于堆内存 栈内存的生命周期一结束就会被释放而堆内存会被垃圾回收机制不定时回收 栈中存放的是对象的引用及对象方法中的局部变量的值 参数的值 堆中存放的是实例对象及成员变量
  • 树状结构数据的数据库表设计及使用 - 4. 嵌套集(Nested Set)模型

    本文以 MySQL 为例 文档比较长 故分为5部分发出 邻接表 Adjacency List 模型 路径枚举 Path Enumeration 模型 闭包表 Closure Table 模型 嵌套集 Nested Set 模型 性能比较与分
  • Mac快速打开terminal终端快捷键操作

    Command 空格键跳出搜索框 输入ter 按 enter即可打开
  • 调试osgEarth(33)分页瓦片卸载器子节点的作用-(3)渲染遍历的帧号和时间设置-_真正的terrain使用TerrainCuller---水平方向剔除

    如果还记得来自于何方 看看一个月前如何引入TerrainCuller的 如何判断是否该cull呢 在这里先打个断点 用的包围球 可见 通过VIEW FRUSTUM CULLING SMALL FEATURE CULLING SHADOW O
  • webrtc服务器搭建

    两年前写的笔记 可能有些链接和方式已经不对了 自己评估 文章目录 名词解释 概要 房间服务 信令服务 ICE STUN TURN 服务 Web服务的安装与配置 房间服务 安装与配置 安装 信令服务 turn服务 参考 扩展阅读 other