tetero
@tetero (tetero)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Skywayを使ってビデオ通話できるようにしたい

やりたいこと

Skywayを使ってビデオ通話できるようにしたい。

発生している問題

発信者と着信者のカメラの映像は取得できているが、音声だけが拾えない。

環境

・MacでローカルサーバーはMAMPを使用している。
・MAMPのMYSQLバージョンは5.7.30
・ブラウザではカメラも音声も使用を許可している。
・Skywayの公式サイトのコードを使用している。

<html>
  <head>
    <title>Video chat</title>
    <link rel="stylesheet" href="style.css" />
    <script
      type="text/javascript"
      src="//ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"
    ></script>
    <!-- <script src="https://cdn.webrtc.ecl.ntt.com/skyway-4.4.5.js"></script> -->
  </head>

  <body>
    <div class="pure-g">
      <!-- Video area -->
      <div class="pure-u-2-3" id="video-container">
        <video id="my-video" width="400px" autoplay muted playsinline></video>
        <p>MY ID: <span id="my-id"></span></p>
        <input id="their-id"></input>
        <button id="make-call">call</button>
        <video id="their-video" width="400px" autoplay muted playsinline></video>        
      </div>

      <!-- Steps -->
      <div class="pure-u-1-3">
        <h2>PeerJS Video Chat</h2>

        <!-- Get local audio/video stream -->
        <div id="step1">
          <p>
            Please click `allow` on the top of the screen so we can access your
            webcam and microphone for calls.
          </p>
          <div id="step1-error">
            <p>
              Failed to access the webcam and microphone. Make sure to run this
              demo on an http server and click allow when asked for permission
              by the browser.
            </p>
            <a href="#" class="pure-button pure-button-error" id="step1-retry"
              >Try again</a
            >
          </div>
        </div>

        <!-- Make calls to others -->
        <div id="step2">
          <p>Your id: <span id="my-id">...</span></p>
          <p>Share this id with others so they can call you.</p>
          <h3>Make a call</h3>
          <div class="pure-form">
            <input type="text" placeholder="Call user id..." id="callto-id" />
            <a href="#" class="pure-button pure-button-success" id="make-call"
              >Call</a
            >
          </div>
        </div>

        <!-- Call in progress -->
        <div id="step3">
          <p>Currently in call with <span id="their-id">...</span></p>
          <p>
            <a href="#" class="pure-button pure-button-error" id="end-call"
              >End call</a
            >
          </p>
        </div>
      </div>
    </div>
    <script src="https://cdn.webrtc.ecl.ntt.com/skyway-4.4.5.js"></script>

    <script>
      console.log("This is before camera");
      // カメラ映像取得
      navigator.mediaDevices
        .getUserMedia({ video: true, audio: true })
        .then((stream) => {
          // 成功時にvideo要素にカメラ映像をセットし、再生
          const videoElm = document.getElementById("my-video");
          videoElm.srcObject = stream;
          console.log(videoElm.srcObject);
          console.log("This is success");
          videoElm.play();
          // 着信時に相手にカメラ映像を返せるように、グローバル変数に保存しておく
          localStream = stream;
        })
        .catch((error) => {
          // 失敗時にはエラーログを出力
          console.error("mediaDevice.getUserMedia() error:", error);
          return;
        });
        console.log("This is after camera");

      //Peer作成
      const peer = new Peer({
        key: "ここには自分のAPIキーを入力している",
        debug: 3,
      });
      //PeerID取得
      peer.on("open", () => {
        document.getElementById("my-id").textContent = peer.id;
      });
      // 発信処理
      document.getElementById('make-call').onclick = () => {
        console.log("This is calling");
        const theirID = document.getElementById('their-id').value;
        const mediaConnection = peer.call(theirID, localStream);
        setEventListener(mediaConnection);
      };

      // イベントリスナを設置する関数
      const setEventListener = mediaConnection => {
        mediaConnection.on('stream', stream => {
          // video要素にカメラ映像をセットして再生
          const videoElm = document.getElementById('their-video')
          videoElm.srcObject = stream;
          videoElm.play();
        });
      }
      //着信処理
      peer.on('call', mediaConnection => {
        console.log("This is reciving calling");
        mediaConnection.answer(localStream);
        setEventListener(mediaConnection);
      });

      // Peer(相手)との接続が切れた際に発火します。
      peer.on('close', () => {
        alert('通信が切断しました。');
      });
    </script>
  </body>
</html>

参考サイト

具体的な正解コードが分かる方、
よろしくお願い致します!

0

2Answer

参照先サイトに似た現象の方が居ました。
(以下回答コピペ)
一般的なWebRTCを使ったWebアプリケーションでは、マイクを利用するために、ブラウザに搭載されたgetUserMediaというAPIを利用します。

チュートリアルの「カメラ映像、マイク音声の取得」についても、その前提で記載されています。

ですので、getUseMediaによってマイクの音声を取得できない場合、利用できません。

以下のサイトで音声が取得できているか確認できますので、試してみるのはいかがでしょうか。

■参照
https://support.skyway.io/hc/ja/community/posts/360028884834-%E9%9F%B3%E5%A3%B0%E9%80%9A%E8%A9%B1%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84-skyway%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E3%82%82-

■その他
https://qiita.com/B-B/items/25603041288271670c6e

1Like

Comments

  1. @tetero

    Questioner

    @Futabaneko000 さん
    ご回答ありがとうございます。
    早速参考にさせて頂きます、ありがとうございます!

はじめまして。
コードや添付のリンクを見てみたところ、旧バージョンのSkyWayを使っているようですが、APIキーに紐づいているアカウントは新旧どちらのSkyWayで取得したものでしょうか…?

新旧のSkyWayではAPIやアカウント関連で互換性が無いので確認させてください。ただ、カメラの映像は取得できているとのことなので、旧バージョンと新バージョンの混在は無いかと思います。

getUseMediaのAPIでの音声取得ができない場合がある、という説が出ていますが、新しいSkyWayではカメラ/マイクの取得コードが変わっている[const { audio, video } = await SkyWayStreamFactory.createMicrophoneAudioAndCameraStream();]ので、新しいSkyWayを試してみる方法もあると思います。SkyWayStreamFactoryの関数内で同様のAPIが使われているかもしれませんが…

0Like

Comments

  1. @tetero

    Questioner

    @kazu_iroiro さん
    コメントありがとうございます。
    旧バージョン・新バージョンがあるということを初めて知りました。
    アカウントは旧バージョンのものかと思います。しかし、コードはどこからか入手した新バージョンの方のものも使っていじった記憶があるので、ご指摘の通り新旧の混在の可能性も十分あるかと思います。
    新バージョンの方で統一して再挑戦してみたいと思います。
    アドバイスありがとうございます!(^^)

  2. @tetero

    Questioner

    @Futabaneko000 さんの音声の取得確認
    ご紹介して頂いた音声確認サイトで確認したが、両方で音声を取得できていた。
    ① https://webrtc.github.io/samples/src/content/getusermedia/volume/
    ② https://webrtc.github.io/samples/src/content/getusermedia/audio/

    @kazu_iroiro さんのSkywayの新バージョンへの統一
    こちらも完了したけど、やはりカメラの映像は取得できるが、音声だけが取れない。。

    skyway以外に簡単に実装可能な方法を知っている方がいらっしゃったら伺いたいです。。。

Your answer might help someone💌