ビデオ通話試してみた（Skyway）

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
ビデオ通話が簡単に実装できるということで、クイックスタートで学んでいきます！

# 使用したものや事前準備
・Macbook Pro
・Visual Studio Code
・SkyWay
・Github pages

# 主に参考にさせていただいた記事

https://skyway.ntt.com/ja/docs/user-guide/javascript-sdk/quickstart/


# 一個ずつセットアップしてみる
コピペで終わらせると一つ詰まっただけで挫折してしまいそうなので、一個ずつある程度理解してから進みたいと思います。

## SkyWay
ドキュメントが日本語でだいぶやりやすいです。
アカウント登録ができればすぐにプロジェクトも作成できます。

https://skyway.ntt.com/ja/

カメラに繋いで映像通信ができるようにやってみます。

SDKはJavaScriptを選びました。


## 事前準備

環境構築　は[NPM]の方を選びました。

### npm init
いろいろ聞かれたのでとりあえずこの形になりました。

![スクリーンショット 2024-03-01 21.56.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/8c9caa53-ba67-95fa-b9f4-de025843a507.png)

### npm i @skyway-sdk/room
複数人で通信をするアプリケーションを作るための ライブラリを入れてます。

https://javascript-sdk.api-reference.skyway.ntt.com/room/


### npm i -D parcel
ホットリロードができる状態にしてくれます。

https://www.npmjs.com/package/parcel

### ※補足
・npm i
　npm installの短縮系
・-D
　--save-dev の短縮形で開発時のみ必要なパッケージとしてインストールします。 
　package.jsonでは「devDependencies」に入れられます。

![スクリーンショット 2024-03-01 22.03.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/4fd62572-0b9a-bef0-7f18-dc356ffd3073.png)

## ソースファイル作成
各ファイルが何やっているか整理します。

### ⚫︎index.html

ビデオ通話のテンプレート

```html
<video id="local-video" width="400px" muted playsinline></video>
```
:point_up:
muted
ミュートにする。今回の場合だと自分のビデオを消音にする。
playsinline
要素内で再生する。（iPhpneだとこれがないと再生しないらいしい

https://developer.mozilla.org/ja/docs/Web/HTML/Element/video

```html
<div id="button-area"></div>
```
:point_up:
追加機能を置くところ

```html
<div id="remote-media-area"></div>
```
:point_up:
相手のビデオを配置するところ

### ⚫︎main.js
```js
const token = new SkyWayAuthToken({

}).encode('ここにシークレットキーをペーストしてください');
```
:point_up:
トークン生成（この時点ではまだ使ってない）


#### サーバーサイド認証
今回はクイックスタートなのでクライアントサイドで認証を通しますが、情報の書き換えも可能になってしまうため基本的にNG。
サーバーサイドで認証できるようにする必要があります。認証情報を渡して、ルーム情報を返すことになりそう。
下記のサンプルは認証情報を返すところまで書いてありました。

https://github.com/skyway/authentication-samples

```js
(async () => {
  const localVideo = document.getElementById('local-video');
  const { audio, video } = await SkyWayStreamFactory.createMicrophoneAudioAndCameraStream();
  video.attach(localVideo);
  await localVideo.play();
})();
```
:point_up:
SkyWayStreamFactory.createMicrophoneAudioAndCameraStream() 関数を呼び出して、デバイスのマイクとカメラからオーディオとビデオのストリームを生成しビデオをアタッチして再生しています。
video.attach(localVideo)の読み方は覚えておきたいです。
今回は「videoストリームをlocalVideo要素にアタッチする」という意味です。
また、localVideo.play()をやっている通り、タグはVideoである必要があります。
ここに修正したビデオを差し込めるという意味だとも思っています。

```js
const context = await SkyWayContext.Create(token);
```   
:point_up:SkyWay Auth Tokenで生成した乱数のようなトークンからアプリケーションの設定を行なっています。SkyWay Auth Tokenはサーバーサイドでも取得できるのでそちらが推奨されている。

https://javascript-sdk.api-reference.skyway.ntt.com/room/#md:skywaycontext

```js
      const room = await SkyWayRoom.FindOrCreate(context, {
        type: 'p2p',
        name: roomNameInput.value,
      });
      const me = await room.join();
```
:point_up:p2pで通信し、入力した値で部屋を作って参加しています。room.join()の引数にはname(一意）とmetadataの設定が可能。

```js
await me.publish(audio);
await me.publish(video);
```
:point_up:ストリームをroom内で公開しています。

```js
room.publications.forEach(subscribeAndAttach);
room.onStreamPublished.add((e) => subscribeAndAttach(e.publication));
```
:point_up:publicationsは現在公開しているストリームを要素として生成し、onStreamPublishedに新しい公開ストリームがあれば追加するイベントがあれば、公開ストリームを引数に渡して要素を生成します。

```js
switch (stream.track.kind) {
~
}
```
:point_up:生成部分です。videoタグやaudioタグにストリームを入れて表現しています。

# github pagesにデプロイし実際に動かしてみた

## リモートリポジトリにプッシュ
リモートリポジトリ（[ユーザー名].github.io）を作成しましょう。
ローカルで作成したファイルをPUSHします。
下記の点を修正しましょう。
・.gitignodeを作成し、node_modulesをコミット対象外にする
・dist/index.htmlの「/index.~.js」を相対パスにします。先頭へドットをつけましょう。

![スクリーンショット 2024-03-02 19.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/906fc786-fe88-6bd2-e22e-220533be6afa.png)

## アクセス

下記の画像のようになったら「Visit site」にアクセスし、URL末尾にdistを追加しましょう。
例：〜.github.io/dist

![スクリーンショット 2024-03-02 19.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/437e1eb1-9d6f-a3e9-5814-db08aa9767d2.png)

アクセスできたら PCやスマホ端末で別々の画面を表示できることを確認してください。

# 最後に
クイックスタートの意味一つひとつ辿るだけでもかなり勉強になりました。こういうところからできることを模索していく必要があると思いましたので継続していきます！