互動直播之WebRTC服務器Kurento實戰

【轉載請註明出處】:http://www.javashuo.com/article/p-fgyqvceq-he.htmlhtml

1. Kurento

Kurento的主要組件是Kurento媒體服務器(KMS),負責媒體傳輸,處理,記錄和播放。KMS創建在出色的GStreamer多媒體庫之上,並提供如下功能:java

  • 網絡流協議,包括HTTPRTPWebRTC
  • 支持媒體混合和媒體路由/調度的組通訊(MCU和SFU功能)。
  • 對實現計算機視覺和加強現實算法的過濾器的通用支持。
  • 媒體存儲支持WebMMP4的寫入操做以及GStreamer支持的全部格式的播放。
  • GStreamer支持的任何編解碼器之間的自動媒體轉碼,包括VP8,H.264,H.263,AMR,OPUS,Speex,G.711等。

image.png

Kurento設計原則

Kurento的設計基於如下主要原則:node

  • 分開的媒體和信令平面

信號媒體是兩個獨立的平面,以便應用程序能夠分別處理多媒體處理的那些方面。linux

  • 媒體和應用服務的分配

Kurento Media Server和應用程序能夠在不一樣的機器之間並置,升級或分佈。
一個應用程序能夠調用多個Kurento Media Server的服務。相反的狀況也適用,即Kurento Media Server能夠知足多個應用程序的請求。git

  • 適用於雲

Kurento適合集成到雲環境中以充當PaaS(平臺即服務)組件。github

  • 媒體管道

經過媒體管道連接媒體元素是一種挑戰多媒體處理複雜性的直觀方法。web

  • 應用開發

開發人員無需瞭解內部Kurento Media Server的複雜性:全部應用程序均可以以開發人員喜歡的任何技術或框架部署,從客戶端到服務器。從瀏覽器到雲服務。redis

  • 端到端通訊能力

Kurento提供端到端通訊功能,所以開發人員無需處理在客戶端設備上傳輸,編碼/解碼和呈現媒體的複雜性。算法

  • 徹底可處理的媒體流

Kurento不只支持交互式人際通訊(例如具備對話呼叫推送/接收功能的Skype),並且還支持人機(例如經過實時流傳輸的視頻點播)和人機(例如遠程視頻錄製) ,多傳感器數據交換)通訊。spring

  • 媒體的模塊化處理

經過媒體元素管道實現的模塊化容許經過「面向圖形」的語言定義應用程序的媒體處理功能,其中應用程序開發人員能夠經過連接適當的功能來建立所需的邏輯。

  • 可審覈的處理

Kurento可以爲QoS監視,計費和審計生成豐富而詳細的信息。

  • 無縫IMS集成

Kurento旨在支持無縫集成到電話運營商的IMS基礎架構中。

  • 透明媒體適配層

Kurento提供了透明的媒體適配層,以使在屏幕大小,功耗,傳輸速率等方面具備不一樣要求的不一樣設備之間的融合成爲可能。

Kurento模塊體系

Kurento被設計爲可插入框架,Kurento中的每一個插件都稱爲一個模塊,可使用新的自定義模塊擴展Kurento Media Server。更多信息,請閱讀Kurento模塊部分。

Kurento模塊體系結構

擴展的Kurento工具箱

Kurento模塊分爲三類:

  • 主要模塊

與Kurento Media Server開箱即用合併:

    • kms-core:Kurento Media Server的主要組件。
    • kms-elements:Kurento Media Elements的實現(WebRtcEndpoint,PlayerEndpoint等)
    • kms-filters:Kurento過濾器的實現(FaceOverlayFilter,ZBarFilter等)
    • 內置模塊

    Kurento團隊開發的額外模塊,用於加強Kurento Media Server的基本功能。到目前爲止,有四個內置模塊,分別是:

    • kms-pointerdetector:基於顏色跟蹤檢測視頻流中指針的過濾器。
    • kms-chroma:過濾器,它在頂層使用顏色範圍並使之透明,從而在後面顯示另外一個圖像。
    • kms-crowddetector:用於檢測視頻流中人彙集的過濾器。

      • kms-platedetector:用於檢測視頻流中的車牌的過濾器。
    • 定製模塊

    Kurento Media Server的擴展,提供了新的媒體功能。

    2. 安裝 EPEL 鏡像源

    yum update
    # RHEL/CentOS 7:
    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
    # RHEL/CentOS 8:
    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

    3. 安裝docker

    # 卸載舊版本(若是安裝過舊版本的話)
    yum remove docker  docker-common docker-selinux docker-engine
    # 安裝須要的軟件包
    yum install -y yum-utils device-mapper-persistent-data lvm2
    #設置docker源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    # 可以使用阿里雲docker源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    #安裝docker
    yum install docker-ce docker-ce-cli containerd.io
    #啓動 docker
    systemctl start docker
    #開機自啓
    systemctl enable docker
    
    #查看KMS日誌
    docker logs kms
    #實時查看:
    docker logs -f kms

    4. 安裝kurento

    #安裝最新版kurento
    docker pull kurento/kurento-media-server:latest
    #啓動鏡像
    docker run --name kms -d -p 8888:8888  kurento/kurento-media-server:latest

    Kurento媒體服務器的端口(KMS)過程當中默認監聽8888客戶端WebSocket鏈接。

    容器運行後,您可使用docker logs命令獲取其日誌輸出:
    docker logs --follow kms >"kms-$(date '+%Y%m%dT%H%M%S').log" 2>&1

    要檢查KMS是否已啓動並正在偵聽鏈接,請使用如下命令:

    curl \
        --include \
        --header "Connection: Upgrade" \
        --header "Upgrade: websocket" \
        --header "Host: 127.0.0.1:8888" \
        --header "Origin: 127.0.0.1" \
        http://127.0.0.1:8888/kurento

    您應該獲得相似於如下內容的響應:

    HTTP/1.1 500 Internal Server Error
    Server: WebSocket++/0.7.0

    忽略「 Server Error 」消息:這是預期的,它實際上證實KMS已啓動並正在偵聽鏈接。

    5. 安裝coturn

    #安裝依賴
    yum install -y openssl-devel libevent-devel git
    
    #clone 源碼
    git clone https://github.com/coturn/coturn.git 
    cd coturn 
    ./configure 
    make 
    sudo make install
    
    # 啓動turnserver
    nohup turnserver -L 0.0.0.0 -a -u kurento:kurento123pwd -v -f -r zhaolong.org &
    #而後查看相應的端口號3478是否存在進程
    sudo lsof -i:3478

    image.png

    這樣就說明已經能夠啓動了,接下來咱們先停掉turnserver,從新配置。
    turnserver 默認加載配置文件是etc/turnserver.conf或/usr/local/etc/turnserver.conf。

    cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf
    openssl req -x509 -newkey rsa:2048 -keyout /usr/local/etc/turn_server_pkey.pem -out /usr/local/etc/turn_server_cert.pem -days 99999 -nodes

    turnserver 默認使用的是SQLite數據庫,若是是須要使用MySQL或者PostgreSQL,須要先初始化數據庫,sql位置在/usr/local/share/turnserver/schema.sql

    修改的turnserver.conf內容:

    # 設置轉發的ip(局域網ip),若是不設置,他會本身選擇默認的
    relay-ip=xx.xx.xx.xx
    
    # 轉發的外網ip(本機外網ip),用於NAT 地址映射
    external-ip=xx.xx.xx.xx
    
    # 轉發的線程數,其實默認不設置最好
    relay-threads=5
    
    #UDP 最小端口和最大端口
    min-port=40000
    max-port=60000
    
    # WebRTC 的消息裏會用到
    fingerprint
    
    # WebRTC 認證須要
    lt-cred-mech
    
    #中繼服務器的監聽器IP地址
    listening-ip=0.0.0.0
    
    #靜態帳號
    user=kurento:kurento
    
    # 統計狀態信息的redis db
    redis-statsdb="ip=xx.xx.xxx.xx dbname=3 password=xxxx port=6379 connect_timeout=30"
    
    # 用戶登陸域
    realm=zhaolong.org
    
    # 證書
    cert=/usr/local/etc/turn_server_cert.pem
    
    # 證書key
    pkey=/usr/local/etc/turn_server_pkey.pem
     
    # 輸出log 
    log-file=stdout
    
    mobility

    從新啓動turnserver

    nohup turnserver >> /var/tmp/turn.log &

    記得開放使用的端口:
    image.png

    能夠用這個網址去測試stun和turn的有效性:
    https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

    測試stun
    測試stun的時候不須要輸入帳號密碼,只須要輸入stun:
    image.png

    測試turn
    須要輸入turn地址,以turn:開頭,以及帳號密碼

    image.png

    5. 配置kurento服務器

    進入kurento的鏡像編輯kurento的配置文件:

    #進入鏡像
    docker exec -it kms /bin/bash
    #安裝vim
    apt-get update
    apt-get install vim
    #進入配置文件夾
    cd /etc/kurento/modules/kurento/
    #編輯配置文件
    vim WebRtcEndpoint.conf.ini

    修改stun 和turn 信息

    stunServerAddress=xx.xx.xx.xx
    stunServerPort=pp
    turnURL=username:userpwd@xx.xx.xx.xx:pp?transport=tcp

    重啓kurento容器

    #查看當前啓動的容器
    docker ps 
    docker restart  {kurento容器ID}

    6. kurento-hello-world

    git clone https://github.com/Kurento/kurento-tutorial-java.git
    cd kurento-tutorial-java/kurento-hello-world
    vim src/main/resources/static/js/index.js

    在函數function uiStart()裏,增長一個叫iceservers的變量,格式以下:

    var iceservers={
        "iceServers":[
            {
              urls:"stun:xx.xx.xx.xx:3478"
            },
            {
              urls:["turn:xx.xx.xx.xx:3478"]
                username:"xxxx",
                credential: "xxxx"
            }
        ]
      }

    再修改底下的options變量:

    const options = {
        localVideo: uiLocalVideo,
        remoteVideo: uiRemoteVideo,
        mediaConstraints: { audio: true, video: true },
        onicecandidate: (candidate) => sendMessage({
          id: 'ADD_ICE_CANDIDATE',
          candidate: candidate,
        }),
          configuration: iceservers //修改在這裏,增長了一個configuration的key
      };

    啓動項目

    mvn -U clean spring-boot:run -Dkms.url=ws://xx.xx.xx.xx:8888/kurento

    啓動完以後用谷歌或者火狐瀏覽器打開demo頁面https://localhost:8443/
    點擊start啓動
    image.png

    至此,最簡單的HelloWorld已經完成。

    【轉載請註明出處】: http://www.javashuo.com/article/p-fgyqvceq-he.html

    相關文章
    相關標籤/搜索