agora.io On-premise Recording SDK クイックスタートガイド

#概要
agora.ioに[On-premise Recording SDK](https://docs.agora.io/en/Recording/product_recording?platform=Linux)が公開されています。

On-premise Recording SDKは、agora.ioのVideoやVoiceSDKなどで作成されたサービス(1対1面談、ボイスチャット、会議、セミナーなど)の通話(映像・音声)を録画することができます。オンプレミス型のため、録画サーバ(Linux)を構築し、そこで録画処理を実行します。

この記事では、[NodeJSのサンプル](https://github.com/AgoraIO/Basic-Recording/tree/master/On-Premise-Recording-Nodejs)を利用して、録画サーバの構築と録画実行、映像再生までの流れをご説明します。
（録画サーバ環境構築は検証環境の構築というレベルになります。）

##Cloud Recording SDKとの違い
[Cloud Recording SDK](https://docs.agora.io/en/cloud-recording/product_cloud_recording%20?platform=Linux)との一番の違いは、オンプレミス型かクラウド型かになります。Cloud Recordingの場合は録画ファイルの保存先がサードパーティのクラウドストレージであるのに対し、On-premise Recordingは構築した録画サーバ上のストレージになります。
（その他、機能面においていくつか差異があります）
参考
・[Cloud Recording SDK](https://docs.agora.io/en/cloud-recording/product_cloud_recording%20?platform=Linux)
・[agora.io Cloud Recording SDK クイックスタートガイド](https://qiita.com/v-cube/items/bd119f39239b6e6a7c22)


#On-premise Recordingの動作イメージ
※[agora公式ページ](https://docs.agora.io/en/Recording/recording_integrate_java?platform=Linux%20Java)より転用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/662b3af3-a47f-303c-e629-e67e8b1e1a82.png" width="60%">
(右上)Linux Server：録画サーバ（構築が必要）
(中央)SD-RTN：Agoraのメインサーバ
(左下)モバイルデバイス：クライアント

1．(左下の)各モバイルデバイスよりビデオ通話が開始されます。
2．(右上の)Linux Server(録画サーバ)は対象ビデオ通話の録画を実行します。
3．(中央の)SD-RTNは映像/音声を録画サーバに送ります。
4．(右上の)Linux Server(録画サーバ)は、録画ファイルを保存します。



#録画サーバの構築準備(必要なもの)
##サーバ環境
・Ubuntu : 18.04.2
※[Docker for windows](https://docs.docker.com/docker-for-windows/)を利用

##Agora SDKと録画サンプルソース
・[Agora On-premise Recording SDK](https://docs.agora.io/en/Recording/downloads)

・[Agora Basic recording sample](https://github.com/AgoraIO/Basic-Recording)
※[NodeJSのサンプル](https://github.com/AgoraIO/Basic-Recording/tree/master/On-Premise-Recording-Nodejs)を利用

##その他（必要なもの）
【Ubuntuにインストールするパッケージ】
・GCC
・nodejs
・npm
・ffmpeg
・その他（tar、tree、unzip、vim）

【検証用クライアント】
・[Agora-Web-Tutorial-1to1(検証用クライアント)](https://github.com/AgoraIO/Basic-Video-Call/tree/master/One-to-One-Video/Agora-Web-Tutorial-1to1)
※動作確認時にクライアントとして利用


#録画サーバの構築

##1.Linuxサーバの準備と起動
(Dockerコンテナを作成、実行し)Linuxサーバを起動します。

##2.SDKと録画サンプルのインストール
2-1.[Agora On-premise Recording SDK](https://docs.agora.io/en/Recording/downloads)を解凍します。
2-2.[Agora Basic recording sample(録画サンプル)](https://github.com/AgoraIO/Basic-Recording)を解凍します。
※ファイルは/home以下に保存しました。

```
$tar -xvf /home/Agora_Recording_SDK_for_Linux_v2_3_4_FULL.tar
$unzip /home/Basic-Recording-master.zip
```

2-3.解凍したSDKをAgora Basic recording sample(録画サンプル)配下に移動します。
移動元：/home/Agora_Recording_SDK_for_Linux_FULL
移動先：/home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src/sdk

```
/home/Basic-Recording-master.
|-- On-Premise-Recording-C++
|-- On-Premise-Recording-Nodejs
    |-- record
    |   |-- output
    |   |-- package-lock.json
    |   |-- sdkdemo.js
    |   `-- src
    |       `-- sdk  //←ここ
    `-- server
```

移動時のコマンド

```
$cp -r /home/Agora_Recording_SDK_for_Linux_FULL   /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src
$mv /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src/Agora_Recording_SDK_for_Linux_FULL 
/home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src/sdk
```

## 3.npmパッケージ作成

3-1.ディレクトリを移動
/sdk配下へ移動します。

```
$cd /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src/sdk
```

3-2.npmパッケージの作成

```
$npm install -g node-gyp
```

##4.録画実行ソースビルド

4-1.ディレクトリを移動
/record配下へ移動します。

```
$cd /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record
```

4-2.ビルド実行

```
$source build.sh
```

4-3.ビルド実行後確認
ビルドが成功すると./record配下に"agorasdk.node"が作成されます。

```
$ls /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record
AgoraRecordSdk.js  agorasdk.node  build.sh  build_debug.sh  output  package-lock.json  sdkdemo.js  src
```

録画サーバの構築が完了しました。

#動作の確認
それでは録画を実行してみます。
##1．動作前準備1（APPIDの設定）
実行ファイル(sdkdemo.js)にAPPIDをセットします。
1-1.実行ファイル(sdkdemo.js)を編集モードで開きます。

```
$vi /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/sdkdemo.js
```

1-2."rec.joinChannel()"の第4引数("YOUR APP ID")にAPPIDをセットします。

```js:sdkdemo.js
(省略)
    //create output folder
    fs.mkdir(storageDir, {recursive: true}, err => {
        //join channel
        rec.joinChannel(null, "agoratest", 0, "<YOUR APP ID>", storageDir); ←ここ
    })
    return rec;
(省略)
```
1-3.編集を保存(:wq)します。

##2．動作前準備2（クライアント）
[Agora-Web-Tutorial-1to1(録画実行時の検証用クライアント)](https://github.com/AgoraIO/Basic-Recording)をPCに保存し、
起動できるようにしておきます。

##3．録画の開始
録画を開始します("node sdkdemo.js")。
実行後、SDKよりレスポンスがあります。

(以下例ではChannel:"agoratest"に録画用UID:"1202710079"がJoinしています。)

```
$ node sdkdemo.js
setting mix layout...
joinChannel...
appliteDir /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src/sdk/bin/
pRecording->m_agorasdk->createChannel return result:1
join channel Id: agoratest, with uid: 1202710079
channel joined agoratest 1202710079
```

##4．クライアントの入室
用意しておいたクライアントで入室します。(できれば2拠点以上)
※入室時のAPPIDとChannelは録画の開始時と同じものをセットします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/636fe0aa-d7a0-b2c9-49ba-0369a9d5b00b.png" width="40%">
入室すると、以下のようなレスポンスがあります。

```
User 361415303 joined, RecordingDir:/home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/output/
userjoin 361415303
setting mix layout...
color: #00ff00
```

##5．録画の停止
各クライアントを退室させます。
退室すると以下のようなレスポンスがあります。

```
leaveChannel...
```

※このデモでは、タイムアウトにより録画UIDが(タイムアウト後)自動で退室し、録画が停止します。

```js:sdkdemo.js
setTimeout(() => {
    recorder.leaveChannel();
}, 1000 * 50)
```

##6．出力フォルダの確認
outputフォルダに録画したファイルが保存されています。
※スペースで区切って表示しています

```
$cd /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record
$ls ./output
0_20200316055159530.aac  agorasdk.dat  metadata.txt         recording_sys.log
0_20200316055200353.mp4  agorasdk.log  recording2-done.txt  uid_0_20200316055159535.txt
agorareport.dat          cfg.json      recording_0.log
```

##7．トランスコード
*※Individualモードの場合のみ*
出力されたファイルを[トランスコードツール(video_convert.pyとffmeg)](https://docs.agora.io/en/Recording/recording_merge_files)で変換します。


（この例ではfps:30、640x480で変換しています）

```
$python /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src/sdk/tools/video_convert.py 
-f /home/Basic-Recording-master/On-Premise-Recording-Nodejs/record/output 
-p 30 -r 640 480
```

##8．再生
8-1. Linuxサーバ内のoutputフォルダをPCに転送します。

8-2. トランスコード済みのファイル(0_20200316055159535_av.mp4)をクリックし再生を開始します。

・1拠点目入室時の映像（背景："#00ff00"(デフォルト)）
※実際の映像は隠して表示しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/11f7f3aa-65b4-ae31-f575-7c0efdcdd0c5.png" width="50%">
・2拠点目入室時の映像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/750bdf9e-806e-1381-813d-13f77fb68508.png" width="50%">


録画サーバの構築、録画の実行、映像の再生まで実施できました。

#補足
[NodeJSのサンプル](https://github.com/AgoraIO/Basic-Recording/tree/master/On-Premise-Recording-Nodejs)は、デフォルトでmixモードでの利用になっています。
Individualモードで利用したい場合は、[以下コード](https://github.com/AgoraIO/Basic-Recording/blob/35b199145db4d9bf75dc1c8ececd9c1bdb089e4c/On-Premise-Recording-Nodejs/record/src/agora_node_ext/agora_node_recording.cpp#L125)を編集します。

```:agora_node_recording.cpp
/*individualモードの時*/
config.isMixingEnabled = false;  
config.mixedVideoAudio = agora::linuxsdk::MIXED_AV_DEFAULT; 
(mixモードの時はtrue、MIXED_AV_CODEC_V2)
```
※修正後は再度ビルドが必要です。

#関連リンク
・[On-premise RecordingとCloud Recordingの違いは何ですか？](https://vcube-support.zendesk.com/hc/ja/articles/900000575863)
・[録画モードの違いについて教えてください。](https://vcube-support.zendesk.com/hc/ja/articles/900000657783)
・[On-premise Recordingで録画中にレイアウトを変更したいのですが、方法はありますか？](https://vcube-support.zendesk.com/hc/ja/articles/900001965986)




#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=6eeefe73d5c9ecc6d5a2)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=6eeefe73d5c9ecc6d5a2)