SkyWay WebRTC Gateway の 動作確認について

Comments

5 comments

  • Avatar
    Toshiya Nakakura

    いくつかの原因が考えられますが、まず一番考えられる原因についてお答えします。

    handsonのスクリプトをお使いということですよね。あのスクリプトの中でgStreamerを起動している部分があるのですが、そちらのgStreamerのスクリプトはお使いのWebカメラを認識する形に書き換えられましたでしょうか?

    https://github.com/skyway-lab/skyway-webrtc-gw-handson/blob/master/chapter3/ruby/webrtc_control.rb#L23

    こちらを書き換えていない場合はカメラに正しくアクセスできていないと思います。
    書き換えている場合は、書き換えた際必要な部分を消してしまった可能性があります。
    よくあるミスとしてはpayload typeの指定が間違っていることが考えられます。payload typeについてはWiresharkでパケットを取得して、decode as rtpしていただければ実際の値が確認できます。
    (参考: https://community.cisco.com/t5/%E3%82%B3%E3%83%A9%E3%83%9C%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/wireshark%E3%81%AB%E3%82%88%E3%82%8B-uc-%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-rtp%E3%81%8B%E3%82%89%E3%81%AE%E9%9F%B3%E5%A3%B0%E5%86%8D%E7%94%9F%E6%96%B9%E6%B3%95/ta-p/3139832)

    また、こちらのスクリプトについてはGoogle Chromeでの動作を想定して記載しましたので、一度そちらも試してみていただけますでしょうか。

    以上、よろしくお願いいたします。

    0
    Comment actions Permalink
  • Avatar
    中村允耶 (Edited )

    お世話になっております。
    ご多忙のところ、ご連絡頂き、ありがとうございます。
    本当は、3/15(金)に、確認して、ご連絡差し上げたかったのですが、
    社内の仮想環境で、USBカメラの認識が、何故か上手く行かず対応が遅れてしまいました。

    ※1. ご指摘頂いた通りですが、gStreamerコマンドの書き方に不備があって、カメラ映像の取得に
    失敗していたと思われます。
    ※2. Wiresharkでパケット取得方法について、ご教示頂き、ありがとうございます。
    今後、使用頻度が増えていくと思われますので、併せて勉強させて頂きます。
    ※3. 上記投稿について、省略してしまったのですが、Firefox Quantum および Google Chrome について、
    カメラ映像の表示を確認できませんでした。

    なお、下記の代替環境で、ハンズオンをベースとした動作確認をさせて頂きましたところ、
    以下の条件で、上手く行きましたので、本件、解決したとみて、ご報告させて頂きます。


    【環境】
    [ホスト側]
    OS: Windows 10 Home (64ビット)
    Google Chrome: 72.0.3626.121 (Official Build) (64 ビット) (cohort: Stable)

    [仮想環境側]
    VirtualBox: 5.2.22 r126460 (Qt5.6.2)
    OS: Ubuntu 18.04.2 LTS
    GStreamer: GStreamer Core Library version 1.14.1
    Ruby: ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-linux]
    gateway_linux_x64: v0.0.4

    [RTSPカメラ]
    無線LAN対応ネットワークカメラ(I-O DATA の TS-WRLC)

    【変更箇所】
    以下の2ファイルについて, 変更し, 動作確認出来ました.
    [webrtc_control.rb]
    [変更前]
    cmd = "gst-launch-1.0 -e rpicamsrc ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! vp8enc deadline=1 ! rtpvp8pay pt=96 ! udpsink port=#{video_port} host=#{video_ip} sync=false"

    [変更後]
    (※admin の パスワードは、マスキング致しました)
    cmd = "gst-launch-1.0 -v rtspsrc location=rtsp://admin:XXXXXXXXXXX@192.168.100.210:41912/ipcam_h264.sdp latency=0 protocols=tcp ! decodebin ! x264enc tune=zerolatency ! rtph264pay ! udpsink port=#{video_port} host=#{video_ip} sync=false"

    [media.rb]
    [変更前]
    "codec": "VP8",

    [変更後]
    "codec": "H264",
    ※根拠
    https://github.com/skyway/skyway-webrtc-gateway/blob/master/samples/util.rb
    -> "codec": "H264" のように 指定されている.

    【スクリーンショット】

    [ホスト] Google Chrome の表示確認

    [ホスト・仮想環境]

    動作確認時の様子

    [ホスト]

    PeerID 確認

     

    0
    Comment actions Permalink
  • Avatar
    Toshiya Nakakura

    ご連絡いただきありがとうございます。gStreamerのオプション変更で解決したということですね。安心致しました。

    >※3. 上記投稿について、省略してしまったのですが、Firefox Quantum および Google Chrome について、
    カメラ映像の表示を確認できませんでした。
    こちらも解決済みということですよね?

    またなにかありましたらお気軽にご連絡ください。

    0
    Comment actions Permalink
  • Avatar
    中村允耶

    お世話になっております。ご連絡頂き、ありがとうございます。

    前回(3/16)、代替環境において、Google Chrome でカメラ映像の表示が上手くいった点をご報告させて頂きましたが、
    Firefox Quantum の場合は、カメラ映像の表示が上手く行かないことを確認致しました。
    但し、Google Chrome での動作を想定されていた旨を、すでに伺っているため、
    エラーログ等のご報告を差し上げる形とさせて頂きました。
    長文となってしまい、申し訳ございません。お時間あるときに、ご確認頂ければと思います。
    ※1. なお、Google Chrome は、引き続き問題なくカメラ映像の表示が出来ることを再度、確認しております。
    ※2. 一番はじめに、ご連絡差し上げました社内の仮想環境については、今後、進展がありましたら、別途ご報告させて頂こうと思います。

    【環境】
    [ホスト側]
    OS: Windows 10 Home (64ビット)
    Firefox Quantum: 65.0.2 (64ビット) <--- Google Chrome から Firefox Quantum へ変更

    [仮想環境側]
    ※前回と同様です。
    VirtualBox: 5.2.22 r126460 (Qt5.6.2)
    OS: Ubuntu 18.04.2 LTS
    GStreamer: GStreamer Core Library version 1.14.1
    Ruby: ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-linux]
    gateway_linux_x64: v0.0.4

    [RTSPカメラ]
    ※前回と同様です。
    無線LAN対応ネットワークカメラ(I-O DATA の TS-WRLC)

    【変更箇所】
    ※前回と同様です。
    [webrtc_control.rb]
    [変更前]
    cmd = "gst-launch-1.0 -e rpicamsrc ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! vp8enc deadline=1 ! rtpvp8pay pt=96 ! udpsink port=#{video_port} host=#{video_ip} sync=false"

    [変更後]
    (※admin の パスワードは、マスキング致しました)
    cmd = "gst-launch-1.0 -v rtspsrc location=rtsp://admin:XXXXXXXXXXX@192.168.100.210:41912/ipcam_h264.sdp latency=0 protocols=tcp ! decodebin ! x264enc tune=zerolatency ! rtph264pay ! udpsink port=#{video_port} host=#{video_ip} sync=false"

    [media.rb]
    [変更前]
    "codec": "VP8",

    [変更後]
    "codec": "H264",

    【エラー発生個所】
    [ホスト側(Firefox/ログ抜粋)]
    ~(略)~
    SkyWay: signalingState is have-local-offer skyway-latest.js:13110:7
    SkyWay: DOMException: "Changing the mid of m-sections is not allowed." skyway-latest.js:13100:7
    SkyWay: Set localDescription: offer skyway-latest.js:13110:7
    InvalidSessionDescriptionError: Changing the mid of m-sections is not allowed.
    ~(略)~

    [https://cdn.webrtc.ecl.ntt.com/skyway-latest.js]ファイル


    ~(略)~
    async _setLocalDescription(offer) {
    logger.log(`Setting local description ${JSON.stringify(offer.sdp)}`);

    try {
    await this._pc.setLocalDescription(offer); <---- ここで止まってしまう(14376行目).
    } catch (err) {
    err.type = 'webrtc';
    logger.error(err);
    this.emit(negotiator_Negotiator.EVENTS.error.key, err);

    logger.log('Failed to setLocalDescription, ', err);
    throw err;
    }
    ~(略)~

    [ホスト(HTTPサーバ/ログ抜粋)]


    > python -m http.server 9000
    Serving HTTP on 0.0.0.0 port 9000 (http://0.0.0.0:9000/) ...
    127.0.0.1 - - [18/Mar/2019 22:46:47] "GET /style.css HTTP/1.1" 200 -
    ----------------------------------------
    Exception happened during processing of request from ('127.0.0.1', 64870)
    Traceback (most recent call last):
    File "C:\Anaconda3\lib\socketserver.py", line 317, in _handle_request_noblock
    self.process_request(request, client_address)
    File "C:\Anaconda3\lib\socketserver.py", line 348, in process_request
    self.finish_request(request, client_address)
    File "C:\Anaconda3\lib\socketserver.py", line 361, in finish_request
    self.RequestHandlerClass(request, client_address, self)
    File "C:\Anaconda3\lib\socketserver.py", line 721, in __init__
    self.handle()
    File "C:\Anaconda3\lib\http\server.py", line 418, in handle
    self.handle_one_request()
    File "C:\Anaconda3\lib\http\server.py", line 406, in handle_one_request
    method()
    File "C:\Anaconda3\lib\http\server.py", line 639, in do_GET
    self.copyfile(f, self.wfile)
    File "C:\Anaconda3\lib\http\server.py", line 800, in copyfile
    shutil.copyfileobj(source, outputfile)
    File "C:\Anaconda3\lib\shutil.py", line 82, in copyfileobj
    fdst.write(buf)
    File "C:\Anaconda3\lib\socketserver.py", line 800, in write
    self._sock.sendall(b)
    ConnectionAbortedError: [WinError 10053] 確立された接続がホスト コンピューターのソウトウェアによって中止されました。
    ----------------------------------------

    0
    Comment actions Permalink
  • Avatar
    Toshiya Nakakura

    詳細に情報をいただきありがとうございます。Firefox Quantumでは動作確認をしたことがないため、なんとも申し上げられず恐縮ですが、将来的に確認してみます。少し先になると思いますので、もしそちら様で確認されるとしたら、想定される懸念点を記載します。

    - ブラウザ側の実装状況

    特定の動画フォーマットのエンコーダ・デコーダを実装していないブラウザが存在します

    - ブラウザのエンコーダ・デコーダとgStreamer側のエンコーダ・デコーダとの相性

    現在は解決しているようですが、古いバージョンのMac版Google Chromeではx264encを利用してgStreamerで生成したH.264の映像が表示できないことがありました。(その際はOpenH264を利用することで回避できることが確認できました)

    - ペイロード番号のアンマッチ

    WebRTC区間で流れる映像や音声は単一のポート番号で転送されます。受信側ではこれをRTPのペイロード番号をチェックして識別します。ペイロード番号の指定を間違えているとこの作業が行えず、うまく転送できないケースがあります。この場合のチェック点は
    1. gStreamerで生成する際のRTPペイロード番号の指定
    2. REST APIでWebRTC GWに伝えるペイロード番号の指定
    の2箇所ありますのでご注意ください。

    以上、よろしくお願いします。

    0
    Comment actions Permalink

Please sign in to leave a comment.