[PeerJS] 실시간 화상 통화 데모 실장편(3) - 카메라 영상 스트리밍

처음에



본고는, 「PeerJS를 사용한 리얼타임 화상 통화의 데모를 실장해 본 시리즈」의 PART(3)이다.
  • PeerJS를 사용한 실시간 화상 통화 데모를 구현해 본 이야기 (1) - mediaDevices.getUserMedia() 사용법
  • PeerJS를 사용한 실시간 화상 통화 데모를 구현해 본 이야기 (2) - PeerJS 소통 확인
  • PeerJS를 사용한 실시간 화상 통화 데모를 구현해 본 이야기 (3) - 카메라 영상 스트리밍

  • 전회까지의 기사에서는, 텍스트 데이터의 수수까지를 기재했습니다.

    이번에는 한층 더 한 걸음 밟아 카메라 영상의 실시간 스트리밍(데모)을 구현해 보겠습니다.

    실시간 스트리밍 (데모) 구현 절차


  • 카메라 영상에 액세스하여 스트림 데이터를 얻는다.
  • 양쪽 연결을 설정한다.
  • 2. 에서 취득한 카메라 영상을 상대에게 보낸다.

  • 1. 카메라 영상에 액세스하여 스트림 데이터를 얻는다.



    상대의 PeerID를 지정해 peer.call 를 실행하는 것으로, 그 상대를 호출할 수가 있습니다.
    ※상대를 호출할 때 또는 호출에 응답할 때에는 MediaStream을 제공해야 합니다.
    Skyway - 공식 문서

    소스 코드는 다음과 같습니다.

    sample.html
    <script type="text/javascript">
     let localVideo;
    
      // カメラ、オーディオ等のリソースへアクセス
      navigator.mediaDevices.getUserMedia({video : true, audio : true})
      .then(function (stream) {
        // カメラ、オーディオリソースへのアクセス成功時
        // 変数videoStreamに取得したストリームデータを代入
      localVideo = stream;
      }).catch(function (error) {
       // カメラ、オーディオリソースへのアクセス失敗時
      // エラー内容をコンソール出力する。
        console.log(error);
      });
    </script>
    

    2. 양쪽 연결을 설정합니다.



    [호출하는 쪽]

    caller.js
    // mediaStreamは自端末のカメラ映像(ストリーミングデータ)
    let call = peer.call('reciverId',mediaStream)
    

    [호출되는 쪽]

    callee.js
    peer.on('call',function(call){
     // mediaStreamは自端末のカメラ映像(ストリーミングデータ)
     call.answer(mediaStream);
    });
    

    [※중요]
    상대방을 호출할 때 또는 호출에 응답할 때 MediaStream을 제공해야 합니다.

    3. 2. 에서 취득한 카메라 영상을 상대에게 보낸다.



    그런 다음 navigator.mediaDevices.getUserMedia()를 사용하여 기기의 카메라 이미지에 액세스합니다.

    소스 코드는 다음과 같습니다.

    [호출측]

    caller.html
    <!DOCTYPE html>
    <head>
      <meta charset="UTF-8">
      <title>sample</title>
      <script src="http://cdn.peerjs.com/0.3/peer.js"></script>
    </head>
    <body>
      <video id="local_video" autoplay></video>
      <video id="remote_video" autoplay></video>
    </body>
    
      <script type="text/javascript">
    
        let localVideo = document.getElementById('local_video');
        let RemoteVideo = document.getElementById('remote_video');
    
        let peer = new Peer('senderId',{key : 'we074c3o2tv2huxr'});
    
        navigator.mediaDevices.getUserMedia({video : true, audio : true})
        .then(function (stream) {
          // カメラ映像、オーディオへのアクセスが成功した場合
          // 取得したカメラ映像を相手に送ります。
          localVideo.srcObject = stream;
          let call = peer.call('reciverId',stream);
          if (call != null) {
            call.on('stream', function(stream) {
                   // ストリーミングデータ受信処理
                   RemoteVideo.srcObject = stream;
            });
          }
        }).catch(function (error) {
          // カメラ映像、オーディオへのアクセスが失敗した場合
          // エラーの内容をconsole.logで出力します。
          console.log(error);
        });
    
      </script>
    </html>
    

    [호출되는 쪽]

    callee.html
    <!DOCTYPE html>
    <head>
      <meta charset="UTF-8">
      <title>sample</title>
      <script src="http://cdn.peerjs.com/0.3/peer.js"></script>
    </head>
    <body>
      <video id="local_video" autoplay></video>
      <video id="remote_video" autoplay></video>
    </body>
    
      <script type="text/javascript">
    
        let localVideo = document.getElementById('local_video');
        let RemoteVideo = document.getElementById('remote_video');
    
        let peer = new Peer('reciverId',{key : 'we074c3o2tv2huxr'});
    
        peer.on('call', function(call){
          navigator.mediaDevices.getUserMedia({video : true, audio : true})
          .then(function (stream) {
            // カメラ映像、オーディオへのアクセスが成功した場合
            // 取得したカメラ映像を相手に送ります。
            localVideo.srcObject = stream;
            call.answer(stream);
            call.on('stream', function(stream) {
               // ストリーミングデータ受信処理
               RemoteVideo.srcObject = stream;
            });
    
          }).catch(function (error) {
            // カメラ映像、オーディオへのアクセスが失敗した場合
            // エラーの内容をconsole.logで出力します。
            console.log(error);
          });
        });
    
      </script>
    </html>
    

    검증해 보자. (순서)


  • 우선, 최초로 호출되는 측의 html 파일을 브라우저로 확인

  • 호출자의 HTML 파일을 브라우저에서 확인
    → 카메라, 오디오 등의 리소스에 대한 액세스 권한이 필요합니다 (허용).

  • 호출되는 측도 마찬가지로 허가를 한다.
  • 양방향간에 통신이 되어 있는 것을 확인할 수 있다.



  • 이러한 형태로 표시되면 성공입니다.

    실제로 조금 지연이 발생하여 다른 표정이되고 있습니다 w

    끝에



    외형은 나쁘지만, PeerJS를 사용한 실시간 화상 통화(?)와 같은 것을 만들 수 있었습니다.
    물론 서비스로 만들려면 아직 멀지 만 데모를 구현하는 중,
    자신, WebRTC에 대한 지식이 깊어진 것 같아요.

    끝까지 읽어 주셔서 감사합니다.
    또, 끊임없는 문장의 기사입니다만, 「좋아요」를 눌러 주신 여러분,
    정말 고마워요.

    본 연재는, 이것으로 종료하겠습니다만,
    3개의 기사에 관해서는, 앞으로도 수시로 업데이트를 해 나갈 예정이므로,
    뭔가 있으면 댓글을 주시면 감사하겠습니다.

    이상.

    좋은 웹페이지 즐겨찾기