精华内容
下载资源
问答
  • AppRTC

    2020-11-30 11:57:39
    <div><p>How can I stream video using this library to werbRTC for android, I am able to run both AppRTC and UVCCamera examples successfully but i am not sure how to stream from UVCCamera library to ...
  • apprtc源码

    2018-03-16 16:27:02
    apprtc源代码apprtc源代码apprtc源代码apprtc源代码apprtc源代码apprtc源代码apprtc源代码
  • AppRTC 实践

    2021-01-07 23:29:43
    appr.tc 是 WebRTC 官方推荐的 Demo,非常适合通过亲手搭建来理解 RTC 的通信机制,本文简要叙述了 AppRTC 的实践过程。

    0x00 环境说明

    appr.tc 是 WebRTC 官方推荐的 Demo,非常适合通过亲手搭建来理解 RTC 的通信机制,本文简要叙述了 AppRTC 的实践过程。

    需要提前搭建的环境:

    • Ubuntu 18.04
    • Node.js 开发环境
    • Golang 开发环境
    • Python3 开发环境
    • Java 开发环境
    • 科学上网环境
    • 域名和对应的证书

    上述环境的搭建过程这里不进行讲解,通常都有标准化的操作流程,下文中假设上述环境已经具备。

    因隐私需要,本文中提到的域名都使用 <your-realm> 来代替,其他敏感信息也是使用 <xxx> 格式来代替,请自行替换。


    0x01 服务配置

    AppRTC 依赖 3 个 服务

    • Collider | WebSocket 服务,提供信令交互能力
    • Coturn | Stun/Turn 服务,提供 P2P 转发能力
    • AppRTC | Web 服务,提供 MVC 能力

    本文对官方推荐的配置方式做了一些修改,通过 Nginx 反向代理的方式对外暴露服务,这样更贴近于真实环境,结构如下图所示:

    apprtc_diagram
    所以我们一共需要配置 4 个服务 Collider / Coturn / AppRTC / Nginx ,下面简述配置过程。

    1. Collider

    git clone https://github.com/webrtc/apprtc.git
    mkdir -p gopath_collider
    export GOPATH=`pwd`/gopath_collider
    mkdir -p $GOPATH/src
    ln -s `pwd`/apprtc/src/collider/collider $GOPATH/src
    ln -s `pwd`/apprtc/src/collider/collidermain $GOPATH/src
    ln -s `pwd`/apprtc/src/collider/collidertest $GOPATH/src
    go get -v collidermain
    go install collidermain
    
    $GOPATH/bin/collidermain -port=8089 -tls=false -room-server="https://<your-realm>:8443"
    
    

    2. Coturn

    sudo apt-get install libevent-dev
    https://github.com/coturn/coturn.git
    cd coturn
    ./configure 
    make 
    sudo ./bin/turnserver -L 0.0.0.0 -a -u test:test -v -n -f -r <your-realm>
    
    
    参数 说明
    -L 绑定 IP
    -a 使用长期凭证机制,turn中继转发模式,WebRTC 中必须使用长期凭证机制
    -u 用户名密码 -u user:password
    -v 日志输出级别
    -n 不使用配置文件
    -f 指定 turn 消息使用 fingerprint
    -r 指定域名
    -c 指定配置文件,否则使用默认配置文件/etc/turnserver.conf

    备注: 因为 coturn 默认需要在系统文件夹创建文件 /var/run/turnserver.pid/usr/local/var/db/turndb 所以需要 sudo 运行。

    3. AppRTC

    修改 apprtc/src/app_engine/constants.py 配置文件如下:

    # Copyright 2015 Google Inc. All Rights Reserved.
    
    """AppRTC Constants.
    
    This module contains the constants used in AppRTC Python modules.
    """
    import os
    
    # Deprecated domains which we should to redirect to REDIRECT_URL.
    REDIRECT_DOMAINS =  [
      'apprtc.appspot.com', 'apprtc.webrtc.org', 'www.appr.tc'
    ]
    # URL which we should redirect to if matching in REDIRECT_DOMAINS.
    REDIRECT_URL = 'https://appr.tc'
    
    ROOM_MEMCACHE_EXPIRATION_SEC = 60 * 60 * 24
    MEMCACHE_RETRY_LIMIT = 100
    
    LOOPBACK_CLIENT_ID = 'LOOPBACK_CLIENT_ID'
    # Turn/Stun server override. This allows AppRTC to connect to turn servers
    # directly rather than retrieving them from an ICE server provider.
    # ICE_SERVER_OVERRIDE = None
    # Enable by uncomment below and comment out above, then specify turn and stun
    ICE_SERVER_OVERRIDE  = [
      {
        "urls": [
          "turn:<your-realm>:3478?transport=udp",
          "turn:<your-realm>:3478?transport=tcp"
        ],
        "username": "test",
        "credential": "test"
      },
      {
        "urls": [
          "stun:<your-realm>:3478"
        ]
      }
    ]
    
    ICE_SERVER_BASE_URL = 'https://appr.tc'
    ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
    ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
    HEADER_MESSAGE = os.environ.get('HEADER_MESSAGE')
    ICE_SERVER_URLS = [url for url in os.environ.get('ICE_SERVER_URLS', '').split(',') if url]
    
    # Dictionary keys in the collider instance info constant.
    WSS_INSTANCE_HOST_KEY = '<your-realm>:8443'
    WSS_INSTANCE_NAME_KEY = 'vm_name'
    WSS_INSTANCE_ZONE_KEY = 'zone'
    WSS_INSTANCES = [{
        WSS_INSTANCE_HOST_KEY: '<your-realm>:8443',
        WSS_INSTANCE_NAME_KEY: 'wsserver-std',
        WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
    }]
    
    WSS_HOST_PORT_PAIRS = [ins[WSS_INSTANCE_HOST_KEY] for ins in WSS_INSTANCES]
    
    # memcache key for the active collider host.
    WSS_HOST_ACTIVE_HOST_KEY = 'wss_host_active_host'
    
    # Dictionary keys in the collider probing result.
    WSS_HOST_IS_UP_KEY = 'is_up'
    WSS_HOST_STATUS_CODE_KEY = 'status_code'
    WSS_HOST_ERROR_MESSAGE_KEY = 'error_message'
    
    RESPONSE_ERROR = 'ERROR'
    RESPONSE_ROOM_FULL = 'FULL'
    RESPONSE_UNKNOWN_ROOM = 'UNKNOWN_ROOM'
    RESPONSE_UNKNOWN_CLIENT = 'UNKNOWN_CLIENT'
    RESPONSE_DUPLICATE_CLIENT = 'DUPLICATE_CLIENT'
    RESPONSE_SUCCESS = 'SUCCESS'
    RESPONSE_INVALID_REQUEST = 'INVALID_REQUEST'
    
    IS_DEV_SERVER = os.environ.get('APPLICATION_ID', '').startswith('dev')
    
    BIGQUERY_URL = 'https://www.googleapis.com/auth/bigquery'
    
    # Dataset used in production.
    BIGQUERY_DATASET_PROD = 'prod'
    
    # Dataset used when running locally.
    BIGQUERY_DATASET_LOCAL = 'dev'
    
    # BigQuery table within the dataset.
    BIGQUERY_TABLE = 'analytics'
    
    

    为解决反向代理的跨域问题 Failed to start signaling: Failed to execute 'pushState' on 'History',需要修改 apprtc/src/web_app/js/appcontroller.js 文件,将 AppController.prototype.pushCallNavigation_ 函数内容注释掉:

    AppController.prototype.pushCallNavigation_ = function(roomId, roomLink) {
      // window.history.pushState({'roomId': roomId, 'roomLink': roomLink}, roomId,
      //     roomLink);
    };
    

    安装 Google Cloud SDK https://cloud.google.com/sdk/docs/install

    sudo apt-get install \
    	google-cloud-sdk-app-engine-python \
    	google-cloud-sdk-app-engine-python-extras \
    	google-cloud-sdk-datastore-emulator
    
    cd apprtc
    npm install
    pip install -r requirements.txt
    grunt build
    dev_appserver.py --host=0.0.0.0 --port=8080 ./out/app_engine --skip_sdk_update_check
    
    

    4. Nginx

    sudo apt-get install nginx
    

    创建配置文件 /etc/nginx/conf.d/8443-apprtc-web.conf ,内容如下:

    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    server {
        listen 8443;
        server_name <your-realm>;
        ssl on;
        ssl_certificate <your-cert-path>;
        ssl_certificate_key <your-key-path>;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
            proxy_pass http://127.0.0.1:8080;
        }
        location /ws {
            proxy_pass http://127.0.0.1:8089;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
        }
    }
    
    
    sudo systemctl restart nginx
    

    最后通过浏览器访问 https://<your-realm>:8443 即可。


    参考文档

    1. https://github.com/webrtc/apprtc
    2. https://github.com/coturn/coturn
    3. https://blog.csdn.net/lingshengxueyuan/article/details/100519054
    4. https://blog.csdn.net/shaosunrise/article/details/89527745
    5. https://zhuanlan.zhihu.com/p/91289458
    展开全文
  • apprtc demo的apprtc.py分析

    千次阅读 2016-09-21 17:15:53
    概述apprtc比较重要的一个文件是apprtc.py文件。 在客户端连接房间服务器时,我们可以看到除了GAE的modules.py打印信息外,apprtc.py也打印出信息。 今天我们就来搞清楚apprtc.py到底在做什么。

    概述

    apprtc比较重要的一个文件是apprtc.py文件。
    在客户端连接房间服务器时,我们可以看到除了GAE的modules.py打印信息外,apprtc.py也打印出信息。
    今天我们就来搞清楚apprtc.py到底在做什么。

    抓主干

    在apprtc.py的最后,我们看到了这样的代码

    app = webapp2.WSGIApplication([
        ('/', MainPage), 
        ('/a/', analytics_page.AnalyticsPage),
        ('/compute/(\w+)/(\S+)/(\S+)',     compute_page.ComputePage),
        ('/join/([a-zA-Z0-9-_]+)', JoinPage),
        ('/leave/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', LeavePage),
        ('/bye/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', LeavePage),
        ('/message/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', MessagePage),
        ('/params', ParamsPage),
        ('/r/([a-zA-Z0-9-_]+)', RoomPage),
    ], debug=True)

    webapp2.WSGIApplication表明使用webapp2框架进行webapp的开发。
    在网上找到GAE的webapp框架的介绍http://lampeter123.iteye.com/blog/390536
    根据其中的介绍,我们可以梳理出apprtc.py的主干或者说apprtc房间服务器的主干。
    一个 webapp 程序包含三个部分:
    一个或多个 RequestHandler类用来处理请求和产生响应。
    一个 WSGIApplication 实例用来根据发送请求的URL对应到相应的类
    一个主程序用来运行 WSGIApplication(使用CGI adaptor)

    app的debug=True会 打印调试信息,如果做成产品后,则可以不打印。
    apprtc.py中app就是一个WSGIApplication的实例,用将请求的URL对应到对应的类。
    app的对应关系为
    ('/', MainPage),
    ('/a/', analytics_page.AnalyticsPage),
    ('/compute/(\w+)/(\S+)/(\S+)', compute_page.ComputePage),
    ('/join/([a-zA-Z0-9-_]+)', JoinPage),
    ('/leave/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', LeavePage),
    ('/bye/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', LeavePage),
    ('/message/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', MessagePage),
    ('/params', ParamsPage),
    ('/r/([a-zA-Z0-9-_]+)', RoomPage),

    具体分析

    上面的代码定义了一个request handler MainPage,映射到根目录URL(/)。当房间服务器接收到客户端的一个http GET URL/的请求后,他会初始化MainPage类,然后调用这个实力的get方法。

    class MainPage内容

    class MainPage(webapp2.RequestHandler):
      def write_response(self, target_page, params={}):
        template = jinja_environment.get_template(target_page)
        content = template.render(params)
        self.response.out.write(content)
    
      def get(self):                                                     //
        """Renders index.html."""
        if self.request.headers['Host'] == 'apprtc.net':
          webapp2.redirect('https://www.apprtc.net', permanent=True)
        # Parse out parameters from request.
        params = get_room_parameters(self.request, None, None, None)
        # room_id/room_link will not be included in the returned parameters
        # so the client will show the landing page for room selection.
        self.write_response('index_template.html', params)

    在GET方法中,请求信息通过self.request获得,可以看到房间服务器获得GET请求根目录的请求后,所做的是判断头中Host内容并重定向到一个域名并获取房间参数,并将index_template.html模板对应部分填充客户端输入的房间信息,然后返回给客户端。

    加入房间时,提交的应该是join,其对应的处理类为JoinPage,其内容如下:

    class JoinPage(webapp2.RequestHandler):
      def write_response(self, result, params, messages):
        # TODO(tkchin): Clean up response format. For simplicity put everything in
        # params for now.
        params['messages'] = messages
        self.response.write(json.dumps({
          'result': result,
          'params': params
        }))
    
      def write_room_parameters(self, room_id, client_id, messages, is_initiator):
        params = get_room_parameters(self.request, room_id, client_id, is_initiator)
        self.write_response('SUCCESS', params, messages)
    
      def post(self, room_id):
        client_id = generate_random(8)
        is_loopback = self.request.get('debug') == 'loopback'
        result = add_client_to_room(self.request, room_id, client_id, is_loopback)
        if result['error'] is not None:
          logging.info('Error adding client to room: ' + result['error'] + \
              ', room_state=' + result['room_state'])
          self.write_response(result['error'], {}, [])
          return
    
        self.write_room_parameters(
            room_id, client_id, result['messages'], result['is_initiator'])
        logging.info('User ' + client_id + ' joined room ' + room_id)
        logging.info('Room ' + room_id + ' has state ' + result['room_state'])

    提交Http 的Post请求到join/roomID时,初始化JoinPage类并且用post函数来处理。

    //计算一个clietn_id值
    client_id = generate_random(8)
    //判断是否是本地测试;
    is_loopback = self.request.get('debug') == 'loopback'
    //添加客户端到房间的结果
    result = add_client_to_room(self.request, room_id, client_id, is_loopback)
    if result['error'] is not None:
    //错误信息输出并退出
          logging.info('Error adding client to room: ' + result['error'] + \
              ', room_state=' + result['room_state'])
          self.write_response(result['error'], {}, [])
          return
    //获取房间参数并返回房间参数信息给客户端,包括client_ID
        self.write_room_parameters(
            room_id, client_id, result['messages'], result['is_initiator'])
    //打印日志信息
        logging.info('User ' + client_id + ' joined room ' + room_id)
        logging.info('Room ' + room_id + ' has state ' + result['room_state'])
      def write_room_parameters(self, room_id, client_id, messages, is_initiator):
        params = get_room_parameters(self.request, room_id, client_id, is_initiator)
        self.write_response('SUCCESS', params, messages)
     def write_response(self, result, params, messages):
        # TODO(tkchin): Clean up response format. For simplicity put everything in
        # params for now.
        params['messages'] = messages
        self.response.write(json.dumps({
          'result': result,
          'params': params
        }))

    进入房间后,应该提交http Get 到/r/roomId信息到房间服务器,此时初始化class roompage。其内容为

    class RoomPage(webapp2.RequestHandler):                           //回调函数
      def write_response(self, target_page, params={}):
        template = jinja_environment.get_template(target_page)
        content = template.render(params)
        self.response.out.write(content)
    
      def get(self, room_id):
        """Renders index.html or full.html."""
        # Check if room is full.
        room = memcache.get(
            get_memcache_key_for_room(self.request.host_url, room_id))
        if room is not None:
          logging.info('Room ' + room_id + ' has state ' + str(room))
          if room.get_occupancy() >= 2:
            logging.info('Room ' + room_id + ' is full')
            self.write_response('full_template.html')
            return
        # Parse out room parameters from request.
        params = get_room_parameters(self.request, room_id, None, None)
        # room_id/room_link will be included in the returned parameters
        # so the client will launch the requested room.
        self.write_response('index_template.html', params)
    

    会使用get函数进行处理,基本应该就是根据房间状态, 返回状态,如果放假非空,则输出房间状态, 并且如果房间超过2个客户端,则输出full_template.html模板。也就是建立房间后,如果房间数大于2个,则会提示房间满的页面。可以通过这个来调节输出房间满的条件。
    其他分析类似

    其中compute_page.ComputePage表示的是compute_page.py中的ComputePage类。

    基本分析就是如此。

    展开全文
  • Apprtc-swift, 视频静音,音频静音,旋转支持,Apprtc代码写入快速 3 apprtc-swiftApprtc代码用 Swift 2编写,带有视频静音,音频静音,旋转支持。 有关详细信息,请参阅我的博客命令行指令在 2设备中运行应用程序...
  • build_apprtc fails

    2020-12-28 16:20:46
    <div><p>Firstly, not all of the dependencies seem to be automatically installed. After running get_webrtc I got the following ________ running '...Debug build for apprtc failed for revision 7456...
  • <div><ol><li>Join a two way apprtc call between any chrome device and the desktop</li><li>Check to see the errors or warnings in the js console of the chrome device user</li><li>Join a loopback apprtc...
  • 因为项目需要本地搭建一个AppRTC服务器,研究了好几天才基本弄完,但是也只是Web端可以访问,好多坑( ⊙ o ⊙ ),记录一下。 0 准备工作 0.1 配置代理 服务器使用Ubuntu,服务器端需要用代理的时候,使用Shadow...

    本文介绍使用域名 HTTPS 的方式部署AppRTC服务,信令服务和STURN/TURN服务。
    本文使用虚拟机桥接模式下的Ubuntu18.04系统和相关代理服务。
    因为项目需要本地搭建一个AppRTC服务器,研究了好几天才基本弄完,但是也只是Web端可以访问,好多坑( ⊙ o ⊙ ),记录一下。

    0 准备工作

    【这部分配置代理方法被和谐掉了,自行解决】

    0.1.3 npm代理方式*

    设置镜像站

    npm config set registry https://repo.huaweicloud.com/repository/npm/
    npm cache clean -f
    

    0.2 Google App Engine SDK,以及创建gcloud工程

    GAE SDK是AppRTC部署工具,有好几个版本,我选用的是Node.js版本,不着急安,往下看。

    0.2.1 Node.js & npm

    可以安装Ubuntu仓库的版本,也可以使用官网介绍安装最新版本。

    sudo apt-get install nodejs npm
    

    0.2.2 Java

    安装OpenJDK

    sudo apt-get install openjdk-8-jdk
    

    0.2.2 Google Cloud SDK

    项目地址 https://cloud.google.com/sdk/docs/#linux ,Linux可以下载通用的二进制包,配置环境变量。方便起见,Ubuntu可以使用在线下载的方式

    Ubuntu在线安装GCloud SDK,注意:需要代理的命令前加proxychains4。

    ## 添加源
    export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
    echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
    ## 安装
    sudo apt-get update
    sudo apt-get install google-cloud-sdk
    sudo apt-get install google-cloud-sdk-app-engine-python
    sudo apt-get install google-cloud-sdk-datastore-emulator
    sudo apt-get install google-cloud-sdk-app-engine-python-extras
    
    0.2.3 初始化Google Cloud
    gcloud init
    # proxychains4 gcloud init
    

    提示登录Google账号,按Y确认,出现登录链接,把这个链接粘到浏览器,登陆后返回验证字符串,再粘到下面的。

    如果电脑安装了浏览器会自动打开浏览器进行登录验证,若浏览器出现跳转错误,那就把浏览器先卸了。
    如果还是出错,先执行proxychains gcloud auth login --no-launch-browser认证,然后再gcloud init

    Go to the following link in your browser:
        https://accounts.google.com/o/oauth2/auth?...
    Enter verification code: 
    

    提示使用已存在的GCloud工程或者创建新工程。

    Pick cloud project to use: 
     [1] apprtc-237109
     [2] Create a new project
    

    可以选创建新工程直接输入小写字母的工程名字,但是可能会创建失败。
    如果创建失败,则可以在浏览器中自己创建工程,然后直接选已存在的工程即可。GCloud工程管理链接:
    https://console.cloud.google.com/cloud-resource-manager 。

    0.3 域名与证书

    HTTPS 方式部署 AppRTC 需要证书,如果有域名的话可以申请 CA 证书,参考另一篇文章《快速申请 Let’s Encrypt 免费SSL证书 / CA证书》。
    如果使用的服务器没有公网 IP,可以配置服务器和本机hosts文件,使其域名都指向该服务器IP。如果有公网 IP 应设置域名A记录指向服务器IP。

    进入正题~
    AppRTC是会议服务,Collider是信令服务,Coturn是中继服务。可以一个一个部署。

    1. AppRTC

    这一步先测试AppRTC服务,使用Google默认的信令和TURN服务。

    1.1 下载源码

    git clone https://github.com/webrtc/apprtc.git
    

    1.2 安装node.js依赖

    npm install
    npm install grunt # 编译工具
    

    如果出现连接问题的话要设置npm代理

    npm config set proxy=http://127.0.0.1:1080
    npm config set https-proxy http://127.0.0.1:1080
    

    如果有其他错误,可以按照提示执行npm audit fix修复,可能会反复执行几遍npm installnpm audit fix

    1.3 安装node.js依赖

    sudo apt install python-pip
    pip install -r requirements.txt
    

    如果需要代理可以试试

    proxychains pip install -r requirements.txt
    

    1.4 安装JDK

    前面没安装JDK的话,需要安装JDK。可以自行下载 Oracle JDK 安装,配置环境变量。方便起见可以在线安装OpenJDK。

    apt-get install openjdk-8-jdk
    

    1.5 编译

    保证这步没有错误

    # sudo npm install grunt -g # 先安装grunt
    grunt build
    

    1.6 部署运行

    这一步介绍使用默认信令和TURN服务部署AppRTC,仅作测试使用,完全部署必须配置信令服务和TURN服务。
    建议配置其他服务之前先保证此测试服务正常。

    1.6.1 HTTP 方式

    <path to gclud sdk>/dev_appserver.py --host <server-ip> ./out/app_engine
    

    注意:
    离线安装GCloud,dev_appserver.py 文件位于google-cloud-sdk/bin/目录下,
    在线安装的方式,位于/usr/lib/google-cloud-sdk/bin/目录下。若该目录已经添加到PATH,则可以直接执行dev_appserver.py

    1.6.2 HTTPS 方式

    需要证书,我使用的是域名apprtc.lmshao.com和相应的证书,不知道使用IP和自签名证书是否可行。因为使用的虚拟机没有公网IP,我把服务器的hosts的域名指到了服务器的IP了。
    命令行指定域名和证书路径,和生成程序的路径./apprtc/out/app_engine

    dev_appserver.py --host apprtc.lmshao.com ./apprtc/out/app_engine --ssl_certificate_path /cert/cert.pem --ssl_certificate_key_path /cert/key.pem --skip_sdk_update_check
    

    我这里会提示默认服务地址:

    • http://apprtc.lmshao.com:8080
    • https://apprtc.lmshao.com:8081

    我在我的Windows电脑上也设置了hosts,Chrome不支持WebRTC通过http方式链接,使用Chrome可以打开这个https的链接了。
    到目前为止打开浏览器应该可以正常使用了,只是参会人数默认有2人限制。如果这一步出错,就不要进行下面的了,先把这步走通再继续。

    1.6.3 常见问题

    问题 1
    Chrome浏览器不支持 HTTP 方式使用 WebRTC 服务器,会导致没法获取摄像头数据,Firefox有可能会支持。最好的方式是使用HTTPS方式部署
    没有域名的话可以配置服务器和本机的hosts文件,把特定域名指向服务器的IP地址。

    问题2
    至此使用的是默认的Google 信令和TURN服务,客户端访问需要开PAC代理,否则没法正常视频会议。

    2. Collider 信令服务

    2.1 安装Golang

    sudo apt-get install golang
    

    2.2 配置Go工作区

    创建快捷方式

    export GOPATH=$HOME/goWorkspace/
    mkdir $GOPATH/src
    ln -s `pwd`/apprtc/src/collider/collider $GOPATH/src
    ln -s `pwd`/apprtc/src/collider/collidermain $GOPATH/src
    ln -s `pwd`/apprtc/src/collider/collidertest $GOPATH/src
    

    2.3 安装collidermain

    安装依赖

    go get collidermain
    # proxychains go get collidermain
    

    每次重新编译apprtc,都要安装一次

    go install collidermain
    

    2.4 运行 Collider 服务

    命令行指定参数,通常使用的就是8089端口,tls使用加密方式secure websocket,这里指的是apprtc服务与collider之间的连接,room-server指的是AppRTC的服务地址,使用https方式的8081端口。

    需要把证书和秘钥文件放在/cert目录下,即/cert/cert.pem /cert/key.pem

    goWorkspace/bin/collidermain -port=8089 -tls=true -room-server="https://apprtc.lmshao.com:8081"
    

    如果命令行未指定参数,则从文件中读取。所以也可以通过修改配置文件指定参数apprtc/src/collider/collidermain/main.go

    var tls = flag.Bool("tls", true, "whether TLS is used")
    var port = flag.Int("port", 8089, "The TCP port that the server listens on")
    var roomSrv = flag.String("room-server", "https://263.net:8081", "The origin of the room server")
    

    注意:
    修改文件后,要重新编译apprtc、安装collidermain

    cd apprtc
    grunt build
    go install collidermain
    

    2.5 配置AppRTC 使用 Collider

    修改apprtc/src/app_engine/constants.py,把WSS_INSTANCE_HOST_KEYhost_port_pair改为 Collider的地址apprtc.lmshao.com:8089

    #WSS_INSTANCE_HOST_KEY = 'host_port_pair'
    WSS_INSTANCE_HOST_KEY = '263.net:8089'
    WSS_INSTANCE_NAME_KEY = 'vm_name'
    WSS_INSTANCE_ZONE_KEY = 'zone'
    WSS_INSTANCES = [{
        WSS_INSTANCE_HOST_KEY: '263.net:8089',
        WSS_INSTANCE_NAME_KEY: 'wsserver-std',
        WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
    }, {
        WSS_INSTANCE_HOST_KEY: '263.net:8089',
        WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
        WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
    }]
    

    WSS_INSTANCES数组两个信令服务器可以删除一个

    重新编译AppRTC

    cd apprtc
    grunt build
    go install collidermain
    

    先运行Collider

    goWorkspace/bin/collidermain -port=8089 -tls=true -room-server="https://apprtc.lmshao.com:8081"
    
    dev_appserver.py --host apprtc.lmshao.com ./apprtc/out/app_engine --ssl_certificate_path /cert/cert.pem --ssl_certificate_key_path /cert/key.pem --skip_sdk_update_check
    

    如果不加Collider之前AppRTC可以正常工作,那么这时应该也可以参会。若不能参会,打开小飞机PAC代理试试。

    3. Coturn TURN服务

    3.1 在线安装

    Ubuntu可以在线安装,能自动安装其他依赖项libevent等多个库。

    sudo apt-get install coturn
    

    3.1 离线安装*

    安装libevent

    $ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
    $ tar xvfz libevent-2.0.21-stable.tar.gz
    $ cd libevent-2.0.21-stable
    $ ./configure
    $ make
    $ sudo make install
    

    安装SQLite3

    安装CoTurn

    $ wget https://coturn.net/turnserver/v4.5.0.8/turnserver-4.5.0.8.tar.gz
    $ tar xvfz turnserver*.tar.gz
    $ ./configure
    $ make
    $ sudo make install
    

    3.3 配置

    创建用户

    $ sudo turnadmin -a -u 用户名 -p 密码 -r 域(写你自己服务器的IP/域名)
    $ sudo turnadmin -a -u liming -p 12345678 -r apprtc.lmshao.com
    

    可以查看用户

    $ turnadmin -l
    liming[apprtc.lmshao.com]
    

    3.4 启动CoTurn服务

    参数可以直接命令行指定,也可以用配置文件,默认参数会使用配置文件/etc/turnserver.conf的参数。

    sudo turnserver -v -L 192.168.198.135 -a -f -r apprtc.lmshao.com -u liming:12345678 --cer /cert/cert.pem --pkey /cert/key.pem
    

    详细参数说明

    参数 说明
    -v 日志输出级别
    -L 绑定网卡IP
    -a 使用长期凭证机制,turn中继转发模式,必须使用长期凭证机制
    -f 指定 turn 消息使用 fingerprint
    -r 指定域名
    -u 用户名密码 -u user:password
    –cert 证书路径
    –pkey 秘钥路径
    -c 指定配置文件,否则使用默认配置文件/etc/turnserver.conf

    最简单的启动参数

    # 前台进程
    $ turnserver -L <public_ip_address> -a -f -r <realm-name>
    # 后台服务
    $ turnserver -L <public_ip_address> -o -a -f -r <realm-name>
    

    测试CoTurn服务

    turnutils_uclient apprtc.lmshao.com -u liming -w 12345678
    turnutils_uclient 域名 -u 用户名 -w 密码
    

    正常情况下运行不出错的话,过一会会出现测试结果。

    3.5 配置AppRTC启动CoTurn

    编辑 apprtc/src/app_engine/constants.py,重新编译执行即可。

    #ICE_SERVER_OVERRIDE = None
    
    # Enable by uncomment below and comment out above, then specify turn and stun
    
    ICE_SERVER_OVERRIDE  = [
      {
        "urls": [
          "turn:apprtc.lmshao.com:3478?transport=udp",
          "turn:apprtc.lmshao.com:3478?transport=tcp"
        ],
        "username": "liming",
        "credential": "12345678"
      },
      {
        "urls": [
          "stun:apprtc.lmshao.com:3478:3478"
        ]
      }
    ]
    
    ICE_SERVER_BASE_URL = 'https://networktraversal.googleapis.com'
    ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
    ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
    

    4. AppRTC & Collider & Coturn

    4.1 AppRTC配置

    至此,这个服务都配置好了,下面是完整的apprtc/src/app_engine/constants.py配置。

    # Copyright 2015 Google Inc. All Rights Reserved.
    
    """AppRTC Constants.
    
    This module contains the constants used in AppRTC Python modules.
    """
    import os
    
    # Deprecated domains which we should to redirect to REDIRECT_URL.
    REDIRECT_DOMAINS =  [
      'apprtc.appspot.com', 'apprtc.webrtc.org', 'www.appr.tc'
    ]
    # URL which we should redirect to if matching in REDIRECT_DOMAINS.
    REDIRECT_URL = 'https://appr.tc'
    
    ROOM_MEMCACHE_EXPIRATION_SEC = 60 * 60 * 24
    MEMCACHE_RETRY_LIMIT = 100
    
    LOOPBACK_CLIENT_ID = 'LOOPBACK_CLIENT_ID'
    
    # Turn/Stun server override. This allows AppRTC to connect to turn servers
    # directly rather than retrieving them from an ICE server provider.
    
    # ICE_SERVER_OVERRIDE = None
    
    # Enable by uncomment below and comment out above, then specify turn and stun
    
    ICE_SERVER_OVERRIDE  = [
      {
        "urls": [
          "turn:apprtc.lmsaho.com:3478?transport=udp",
          "turn:apprtc.lmsaho.com:3478?transport=tcp"
        ],
        "username": "liming",
        "credential": "12345678"
      },
      {
        "urls": [
          "stun:apprtc.lmsaho.com:3478"
        ]
      }
    ]
    
    ICE_SERVER_BASE_URL = 'https://networktraversal.googleapis.com'
    ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
    ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
    
    # Dictionary keys in the collider instance info constant.
    
    WSS_INSTANCE_HOST_KEY = 'apprtc.lmsaho.com:8089'
    WSS_INSTANCE_NAME_KEY = 'vm_name'
    WSS_INSTANCE_ZONE_KEY = 'zone'
    WSS_INSTANCES = [{
        WSS_INSTANCE_HOST_KEY: 'apprtc.lmsaho.com:8089',
        WSS_INSTANCE_NAME_KEY: 'wsserver-std',
        WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
    }
    #, {
    #    WSS_INSTANCE_HOST_KEY: 'apprtc.lmsaho.com:8089',
    #    WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
    #    WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
    #}
    ]
    
    WSS_HOST_PORT_PAIRS = [ins[WSS_INSTANCE_HOST_KEY] for ins in WSS_INSTANCES]
    
    # memcache key for the active collider host.
    WSS_HOST_ACTIVE_HOST_KEY = 'wss_host_active_host'
    
    # Dictionary keys in the collider probing result.
    WSS_HOST_IS_UP_KEY = 'is_up'
    WSS_HOST_STATUS_CODE_KEY = 'status_code'
    WSS_HOST_ERROR_MESSAGE_KEY = 'error_message'
    
    RESPONSE_ERROR = 'ERROR'
    RESPONSE_ROOM_FULL = 'FULL'
    RESPONSE_UNKNOWN_ROOM = 'UNKNOWN_ROOM'
    RESPONSE_UNKNOWN_CLIENT = 'UNKNOWN_CLIENT'
    RESPONSE_DUPLICATE_CLIENT = 'DUPLICATE_CLIENT'
    RESPONSE_SUCCESS = 'SUCCESS'
    RESPONSE_INVALID_REQUEST = 'INVALID_REQUEST'
    
    IS_DEV_SERVER = os.environ.get('APPLICATION_ID', '').startswith('dev')
    
    BIGQUERY_URL = 'https://www.googleapis.com/auth/bigquery'
    
    # Dataset used in production.
    BIGQUERY_DATASET_PROD = 'prod'
    
    # Dataset used when running locally.
    BIGQUERY_DATASET_LOCAL = 'dev'
    
    # BigQuery table within the dataset.
    BIGQUERY_TABLE = 'analytics'
    
    

    注意修改完重新编译AppRTC

    cd apprtc
    grunt build
    go install collidermain
    

    4.2 启动服务

    IP用户名密码改为相应的值。

    Collider

    nohup goWorkspace/bin/collidermain -port=8089 -tls=true -room-server="https://apprtc.lmshao.com:8081" >> log/collider.log &
    

    Coturn

    sudo turnserver -v -L 192.168.198.135 -o -a -f -r apprtc.lmshao.com -u liming:12345678 --cer /cert/cert.pem --pkey /cert/key.pem -l log/coturn.log
    

    AppRTC

    nohup dev_appserver.py --host apprtc.lmshao.com ./apprtc/out/app_engine --ssl_certificate_path /cert/cert.pem --ssl_certificate_key_path /cert/key.pem --skip_sdk_update_check >> log/apprtc.log &
    

    浏览器访问有如下效果
    AppRTC-1

    4.3 Nginx反向代理

    上面的部署如果使用 https://apprtc.263.net:8081访问没问题,一旦使用http://apprtc.263.net:8081 访问,AppRTC服务就会报错导致服务卡死,必须重启AppRTC服务。
    可以使用Nginx反向代理方式,设置http自动跳转到https,并隐藏服务端口。

    sudo apt-get install nginx
    

    编辑默认配置文件
    /etc/nginx/sites-available/default

    # 跳转到 apprtc.lmshao.com:8081
    upstream apprtc {
            server apprtc.lmshao.com:8081;
    } 
    
    # http 跳转到 https
    server {
            listen 80;
            server_name apprtc.lmshao.com;
            rewrite ^(.*) https://$server_name$1 permanent;
    }
    
    server {
            # SSL configuration
            #
            listen 443 ssl default_server;
            listen [::]:443 ssl default_server;
    
            server_name apprtc.lmshao.com;
    
            ssl_certificate /cert/cert.pem;
            ssl_certificate_key /cert/key.pem;
    
            index index.html index.htm index.nginx-debian.html;
    
            location / {
                    #try_files $uri $uri/ =404;
                    proxy_pass https://apprtc;
                    
                    # 必须加这句
                    proxy_set_header Host $host;
    
                    # 传递远端IP
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header REMOTE-HOST $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }
    
    

    Nginx 服务管理

    # 启动
    sudo nginx
    # 停止
    sudo pkill -9 nginx
    

    如果没出错的话,浏览器访问就可以参会了~
    AppRTC-2

    5. 总结

    主要参考AppRTC的官方文档进行部署的,摸索了好几天,遇到了好多坑。目前Web参会没问题,Android Demo参会有问题,还没搞定。
    东西太多,记录一下,如果能给后来者参考,少走弯路就更好了。
    欢迎交流。

    展开全文
  • 由于之前在搭建apprtc的服务器过程中遇到过很多问题:1.apprtc参数的配置(包括https的配置)。...3.coturn服务器的参数的处理。由于上面的服务器各个参数...最近在测试google的最新apprtc服务器时我们欣喜的发现,ipho...

    由于之前在搭建apprtc的服务器过程中遇到过很多问题:

    1.apprtc参数的配置(包括https的配置)。

    2.collider服务器房间服务器的处理及https的测试。

    3.coturn服务器的参数的处理。

    由于上面的服务器各个参数需要相互对应上才可以实现完整的webrtc服务器的测试(这个只能一个参数一个参数去核对源代码了)。最近在测试google的最新apprtc服务器时我们欣喜的发现,iphone(11.2.2)系统的safari 竟然可以支持webrtc的通话了,所以,我们就迫不及待地想搭个自已的服务器试试:

    首先准备域名:www.webrtcserver.cn 。

    再申请个主机及https的证书,准备完毕后再来个主页。

    用iphone手机的safari和mac 的safari试试 https://www.webrtcserver.cn里的apprtc测试服务器 ,也能相互通话了。

    接下来我们测了一个firefox(之前由于没有配置https,所以一直用firefox来处理视频通话),现在好了,chrome也支持,再来个opera和windows的edge浏览器,统统都已经支持。

    看来用webrtc实现浏览器之间的视频通话已经基本上完成了技术上的支持工作,由此带来的应用我想也会越来越多。大家可以根据自已的行业尽情的发挥自已的想象力。

    展开全文
  • I tried to implement apprtc working locally without using external server. But in apprtc, it uses another server like following. - wss://apprtc-ws.webrtc.org:443/ws - ...
  • ubuntu 搭建apprtc

    2019-02-22 18:22:28
    ubuntu 搭建apprtc 记录搭建apprtc 主要分为3不大步骤一、coTurn 打洞服务器 配置1.1安装依赖1.2 下载并编译源码1.3 turnserver 的证书1.4 启动turnserver 服务(10.140.0.6为内网ip, 34.80.18.14为外网ip)二、房间...
  • Apprtc ICE SERVER problem

    2021-01-08 20:52:19
    <div><p>Hello all, I followed the instructions and I configured my iceserver. ...The result is this: <pre><code> ...ICE request server error: Status = 0, response =...webrtc/apprtc</p></div>
  • 自建 AppRTC

    2015-11-24 11:51:00
    自建 AppRTC 字数3158阅读1718评论2喜欢2 AppRTC是 webrtc 的一个 demo。自建 AppRTC 可以苦其心志劳其筋骨饿其体肤,更重要的是能学会 webrtc 服务器的搭建流程…… AppRTC 的组成部分是这样的:1、AppRTC - ...
  • Run with apprtc with https

    2021-01-08 20:47:45
    <div><p>Hello, I'...<p>I've configured collider to use tls=true and turnserver, they are working fine. <p>Now, how i can configure apprtc to use https?</p> ...webrtc/apprtc</p></div>
  • AppRTC broken for Firefox

    2021-01-08 20:39:02
    <div><p>The AppRTC interop test found that we can no longer bring up calls with a Firefox participant. When I run the test, the Firefox participant gets <p>'toJSON' called on an object that ...
  • <div><p>When I run the apprtc.py sample, the shown video at apprtc.io using Chrome eventually hangs. Sometimes it starts already stuck and sometimes it stops to play in seconds. <p>What kind of ...
  • Ubuntu下搭建AppRTC

    2020-11-07 19:02:37
    https://zhuanlan.zhihu.com/p/73851817 WebRTC开源项目-手把手教你搭建AppRTC https://blog.csdn.net/lingshengxueyuan/article/details/100519054
  • <div><p>Setting up build environment for Android Export the base settings of ...Release build for apprtc failed for revision </p><p>该提问来源于开源项目:pristineio/webrtc-build-scripts</p></div>
  • <div><p>When I connect via chrome with my website run apprtc code, it work, but in android app it crash in lib C++, here is full logcat of Android (android app connect to appr.tc work in ...
  • <div><p>Hello, <p>My domain is https but this apprtc https://url:port is not working only http://url:port working but after update google chrome 47 its not working, how can i ...webrtc/apprtc</p></div>
  • <div><p>currently getting websocket timeouts, the red box says <pre><code> WebSocket open error: WebSocket error WebSocket register error: WebSocket error </code></pre> ...webrtc/apprtc</p></div>
  • m running Ubuntu 14.04 LTS and trying to make that machine as server by executing the commands that are present in the homepage of AppRTC. The server is starting at the port 8080 but am not able to ...
  • Add robots.txt to apprtc

    2021-01-08 20:40:28
    (See the original issue for full comment thread) <p>samdutton commented 7 days ago If no objections, I think we should run the Webmaster Tools robots.txt ...apprtc.appspot....webrtc/apprtc</p></div>
  • AppRTC服务器搭建

    千次阅读 2016-11-14 10:20:46
    WebRTC,是Web Real-Time Communication的缩写,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术,...这篇文章要搭建的,是基于webrtc的apprtc示例,GitHub地址:https://github.com/webrtc/appr
  • <a href="https://github.com/webrtc/apprtc/files/664495/Sumo_apprtc_loopback_js_logs.txt">Sumo_apprtc_loopback_js_logs.txt</a></p>该提问来源于开源项目:webrtc/apprtc</p></div>
  • <div><p>I increased the number of occupancies in room but ... Is it possible to implement conference or broadcast(one to many) in this AppRTC ? </p><p>该提问来源于开源项目:webrtc/apprtc</p></div>
  • apprtc server nodejs 版

    2018-02-28 10:47:37
    https://github.com/ISBX/apprtc-node-server
  • can you add a apprtc docker

    2021-01-08 20:41:20
    <div><p><strong>Browsers and versions affected</strong></p> <p><strong>Description</strong></p> <p><strong>Steps to reproduce</strong></p> <p><strong>Expected results</strong></...webrtc/apprtc</p></div>
  • apprtc, 在WebRTC上,视频聊天演示应用基于 AppRTC演示代码插件开发可以在中找到关于在 WebRTC中开发的详细信息,可以在developer中找到。访问AppRTC服务器可以通过访问 http://localhost:8080 服务器访问。在本地...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 648
精华内容 259
关键字:

apprtc