agora.io Cloud Recordingのよくあるトラブルの原因と対策

#概要
[agora.io Cloud Recording](https://docs.agora.io/en/cloud-recording/landing-page?platform=RESTful)のよくあるトラブルの原因と対策についてご紹介します。

##参考リファレンス
・[Cloud Recording RESTful APIリファレンス](https://docs.agora.io/en/cloud-recording/cloud_recording_api_rest?platform=RESTful)
・[Rotate the Video(映像回転の仕様)](https://docs.agora.io/en/Interactive%20Broadcast/video_rotation_android?platform=Android)
・[Video profile table(画質設定)](https://docs.agora.io/en/cloud-recording/recording_video_profile)

[Cloud Recordingの参考記事]
・[agora.io Cloud Recording クイックスタートガイド](https://qiita.com/v-cube/items/bd119f39239b6e6a7c22)
・[agora.io Cloud Recording 録画モード(Individual/Composite)の違い](https://qiita.com/v-cube/items/d968a315266c17acf3a4)

##1.stop()時にステータスコード404(エラー)発生

```php:stop.php
//stop()時レスポンス
string(369) " {"resourceId":"***","sid":"***",` "code":404'`}" 
```

###・症状
acquire()、start()時はステータスコード200(成功)だったが、stop()時に404(エラー)が発生する。

[再現手順]
1. acquire()時、ステータスコードは200(成功)。
2. start()時、ステータスコードは200(成功)。
3. stop()時、ステータスコードは404(エラー)。

###・原因と対策

start()時のリクエスト値に不備があります。(以下参照)

####1.maxIdleTime(待機時間)が過ぎて録画が自動停止した

Cloud Recordingは、録画するChannelに誰もJoinしないままmaxIdleTimeを過ぎると、自動で録画を停止します。

<dl>
  <dt>[対策]</dt>
  <dd>・ChannelにJoinをしてから録画を開始する</dd>
  <dd>・maxIdleTime(5から2,592,000まで)を長くする</dd>
</dl>
<details><summary>設定例</summary><div>

```php:start.php
/*--省略--*/
$recordingConfig = [
   'maxIdleTime' => 1000,　//★ここ
   'streamTypes' => 2,
   'audioProfile' => 0,
   'channelType' => 1, 
   'videoStreamType' => 0
];
/*--省略--*/
```

[サンプルソース](https://github.com/Nakamu987/agoraCloudRecording/tree/master/CloudRecordingQSSample)
</div></details>

####2.Tokenの値が間違えている
Tokenの値に不備があることが考えられます。
特にTokenの有効期限が切れていた原因が多いです。

<dl>
  <dt>[対策]</dt>
  <dd>・Tokenの有効期限が正しいことを確認する</dd>
  <dd>・ひとまずTokenを利用しないで録画ができるかどうか確認する<br>(※TokenはCloud Recording側、VideoSDK側の両方に設定します)</dd>
</dl>
<details><summary>設定例</summary><div>

```php:start.php
/*--省略--*/
$clientRequest = [
  'token' => "",   //★ここ
  'recordingConfig' => $recordingConfig,
  'storageConfig' => $storageConfig
];
/*--省略--*/
```

[サンプルソース](https://github.com/Nakamu987/agoraCloudRecording/tree/master/CloudRecordingQSSample)
</div></details>　
####3.ストレージのキーが間違えている
ストレージのアクセスキーやシークレットキーの不備が考えられます。

<dl>
  <dt>[対策]</dt>
  <dd>・転送ツール(aswcliやwinscp)でローカルからストレージ(またはその逆)にファイルが転送できることを確認する</dd>
</dl>
<details><summary>設定例</summary><div>

```php:start.php
/*--省略--*/
$storageConfig= [
  'accessKey' => '*****',   //★ここ
  'region' => 10,　　　　　　//★
  'bucket' => '*****',　　　//★
  'secretKey' => '*****',  //★
  'vendor' => 1,  　　　　　//★
  'fileNamePrefix' => 'record'　  //★
];
/*--省略--*/
```

[サンプルソース](https://github.com/Nakamu987/agoraCloudRecording/tree/master/CloudRecordingQSSample)
</div></details>　
####4.画質の設定値が間違えている
Cloud Recordingの画質の設定値(transcodingConfigのwidth、height、fps、bitrate)は、[Video profile table](https://docs.agora.io/en/cloud-recording/recording_video_profile)に対応した値を設定する必要があります。

<dl>
  <dt>[対策]</dt>
  <dd>・画質の設定値(transcodingConfigのwidth、height、fps、bitrate)が[Video profile table]に対応した値を正しく設定していることを確認し、適宜修正する</dd>
</dl>
※[Video profile table](https://docs.agora.io/en/cloud-recording/recording_video_profile)

<details><summary>設定例</summary><div>

```php:start.php
/*--省略--*/
$transcodingConfig = [
  'height' => 640,　　//★ここ
  'width' => 360,　　　//★ここ　
  'bitrate' => 500,　　//★ここ
  'fps' => 15,　　　　　//★ここ
  'mixedVideoLayout' => 1
];
/*--省略--*/
```

[サンプルソース](https://github.com/Nakamu987/agoraCloudRecording/tree/master/CloudRecordingQSSample)
</div></details>　

####5.暗号キーが間違えている

暗号キー(Cloud Recording側の[[decryptionMode]、[secret]](https://docs.agora.io/en/cloud-recording/cloud_recording_api_rest?platform=RESTful))の設定は、Cloud Recording側とVideoSDK側の両方に同じ値を設定する必要があります。

<dl>
  <dt>[対策]</dt>
  <dd>・Video SDK側の[encryptionMode]､[ encryptionKey]とCloud Recording側の[decryptionMode]、[secret]を同じ設定にする
</dd>
</dl>
※Video SDK側の[encryptionMode](https://docs.agora.io/en/Video/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_rtc_engine.html#a8d283886c17dbd2555e1f967c7faff2d)、[ encryptionKey](https://docs.agora.io/en/Video/API%20Reference/java/classio_1_1agora_1_1rtc_1_1internal_1_1_encryption_config.html#a94179b52ac9ba2d4736105a5ce3ce286)
※Cloud Recording側の[decryptionMode、secret](https://docs.agora.io/en/cloud-recording/cloud_recording_api_rest?platform=RESTful)

####6.録画のuidがChannelのuidと競合している

channel内のuidと重複しているため、競合が発生しエラーになりますので、重複しないuidを設定する必要があります。

<dl>
  <dt>[対策]</dt>
  <dd>・acquire、start実行時に指定するuidは、録画インスタンス用uidとして、channel内に入室しているuidとは重複しないユニークなuidを指定する。
</dd>
</dl>

####7.その他
以下ケースは(404ではなく)各[エラーコード]((https://docs.agora.io/en/cloud-recording/common_errors?platform=RESTful))が返却されます。

**・start()リクエスト値がデータ型、指定範囲外の値、必須項目なしの場合** →[ステータスコード=2](https://docs.agora.io/en/cloud-recording/common_errors?platform=RESTful)
**・誰もJoinせずにmaxIdletime以内にstop()した場合** →[ステータスコード=435](https://docs.agora.io/en/cloud-recording/common_errors?platform=RESTful)

※その他のケースは[エラーコード]((https://docs.agora.io/en/cloud-recording/common_errors?platform=RESTful))を参照

##２.録画したのに録画ファイルが存在しない
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/55a0c11e-b765-d64c-05a3-fe719e4b4fc8.png" width="45%">

###・症状
録画後にストレージを確認したところ、録画ファイルが存在しなかった。

良くある症状としては、
・録画開始(start)は成功しているのに、ファイルが1つも作成されなかった。
・(Individualモードで)１ユーザの音声ファイルだけが作成されていなかった。
・(Compositeモードで)m3u8ファイルが1つのみだった(tsファイルは0件)。
など

###・原因と対策
####1.録画に失敗している
start時の録画パラメータに不備があったため、録画に失敗している可能性があります。(stop時レスポンスに404が発生していた可能性があります)

<dl>
  <dt>[対策]</dt>
  <dd>・start時の録画パラメータを見直す
</dd>
</dl>
[1.stop()時にステータスコード404(エラー)発生](##-1.stop()時にステータスコード404(エラー)発生)を参照



####2.映像、音声がミュートだった
Cloud Recordingの仕様として、映像、音声のストリームが作成されないと録画ファイルも作成されない仕様となっています。

たとえば、ユーザはJoinしていたが、音声(映像)がずっとミュートだった場合、
Individualモードの場合、音声(又は映像)ストリームが作成されないため、録音(録画)ファイルは作成されません。
Compositeモードの場合は、(映像、音声の両方がミュートだった場合)m3u8ファイルのみでtsファイルは作成されません。

<dl>
  <dt>[対策]</dt>
  <dd>・録画したいユーザの映像、または音声をミュートしてないことを確認する
</dd>
</dl>

####3.Channelに誰もJoinしていない
ユーザがChannelにJoinしていなかった可能性があります。

<dl>
  <dt>[対策]</dt>
  <dd>・[コンソール]にて[Call Search]を利用して、そのユーザがChannelにJoinしていたかどうか確認してください。
</dd>
</dl>
※[Call Search](https://console.agora.io/analytics/call/search?projectId=JcE_18X1vv)

##3.録画した映像の向きが違う
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/98dd48d6-8d22-6aeb-a7a3-0e4e6ac06571.png"  width="35%">

###・症状
ビデオ通話の際にモバイルデバイスを横から縦(又はその逆)にしたら、録画の映像が90度回転していた。

###・原因と対策
####1.VideoSDK側の映像の回転設定が合っていない

映像の回転設定は、以下の組み合わせにより影響します。
・VideoSDK側の[setVideoEncoderConfiguration](https://docs.agora.io/en/Video/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_rtc_engine.html#af5f4de754e2c1f493096641c5c5c1d8f)の[orientationMode](https://docs.agora.io/en/Video/API%20Reference/java/enumio_1_1agora_1_1rtc_1_1video_1_1_video_encoder_configuration_1_1_o_r_i_e_n_t_a_t_i_o_n___m_o_d_e.html)
・モバイルデバイスの画面回転の設定(回転する/しない)

agoraの映像回転の仕様は、[「Rotate the Video」](https://docs.agora.io/en/Interactive%20Broadcast/video_rotation_android?platform=Android)(イメージ付き)に記載がありますので確認してください。

<dl>
  <dt>[対策]</dt>
  <dd>・Video SDK側の設定(setVideoEncoderConfigurationのorientationMode="ADAPTIVE")、モバイルデバイスの設定(画面回転の設定を"回転する")を正しく設定する
</dd>
</dl>

##4.録画した映像が切れている
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/726582ae-70cd-d6cc-f21a-cfc3cdca7458.png" width="35%">
###・症状
録画の映像の縦横または左右が切れていた。

###・原因と対策
####1.VideoSDK側とCloudRecording側の映像サイズが合っていない
Cloud Recordingの定型レイアウト(Floating/BestFit/Vertical)の場合は、
VideoSDK側の映像のアスペクト比と合わないとクロップされます。(Verticalは最大サイズのみFit)
そのため、画面サイズを合わせる必要があります。

<dl>
  <dt>[対策]</dt>
  <dd>・VideoSDK側とCloudRecording側のアスペクト比を合わせる。</dd>
  <dd>・カスタムレイアウトを利用する(下記参照)
</dd>
</dl>

カスタムレイアウトを利用するには、
・[mixedVideoLayout=3(Customized layout)"]
・[layoutConfig]を[render_mode=1(fit)]
に設定します。
※[CloudRecordingのレイアウト](https://docs.agora.io/en/cloud-recording/cloud_recording_layout?platform=RESTful)

##5.その他
全てに該当しない場合、ログ調査をすることも可能です。
以下の情報と共にお問い合わせください。

[必要情報]
・APPID
・発生日時
・症状
・SID（start()時に発行されるセッションidのことです)

#関連リンク
・[Cloud Recordingで録画ファイルが作成されません。](https://vcube-support.zendesk.com/hc/ja/articles/360039081792)
・[録画するユーザ(uid)を限定したいのですが、方法はありますか？](https://vcube-support.zendesk.com/hc/ja/sections/360006547131-Agora-Cloud-Recording-SDK)
・[Cloud Recordingで生成されたm3u8+tsファイルをmp4に変換したい](https://vcube-support.zendesk.com/hc/ja/articles/900004997483)

#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=79a6071f8db9d1514f95)
[<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=79a6071f8db9d1514f95)