
# 示例2：创建合流录制任务
#### 场景描述
[示例1：创建单流录制任务](https://support.huaweicloud.com/api-rtc/rtc_07_0008.html)已介绍了如何将房间中的每一个用户的音视频流分别录制成独立的文件。若您需要将房间中的多个单流用户录制成一个文件，您可以参考此章节内容调用SparkRTC API进行合流录制。
#### 前提条件
- 已获取需要使用的SparkRTC服务的终端节点：rtc-api.myhuaweicloud.com。
- 已创建用于存储录制文件的OBS桶，并完成OBS桶授权。您可以通过调用[OBS 创建桶API](https://support.huaweicloud.com/api-obs/obs_04_0015.html)进行创建，并在SparkRTC控制台中完成[OBS桶授权](https://support.huaweicloud.com/usermanual-rtc/rtc_04_0008.html)。
 
#### 总体流程
![](https://support.huaweicloud.com/api-rtc/zh-cn_image_0000001170614045.png)
1. [获取Token]
2. [创建应用]
3. [创建录制规则]
4. [配置录制回调]
5. [终端用户加入房间]
6. [创建合流录制任务]
 
#### 操作步骤
1. [获取用户Token](https://support.huaweicloud.com/api-iam/iam_30_0001.html)，用于调用SparkRTC接口时进行认证鉴权。
   
   在"我的凭证"页面获取***username*** 、***password*** 、***domainname*** ，调用如下接口获取Token。详细信息请参见[构造请求](https://support.huaweicloud.com/api-rtc/rtc_07_0004.html)。
   ```
   POST https://iam.myhuaweicloud.com/v3/auth/tokens
   Content-Type: application/json
   {
     "auth": {
       "identity": {
         "methods": [
           "password"
         ],
         "password": {
           "user": {
             "name": "username", //用户名。
             "password": "password", //用户登录密码。
             "domain": {
               "name": "domainname" //用户所属的账号名。  
             }
           }
         }
       },
       "scope": {
         "domain": {
            "name": "domainname"  //用户所属的账号名。
         }
       }
     }
   }
   ```
   如[图1]所示，红框中的信息为获取用户Token。
   图1获取用户Token   
   ![](https://support.huaweicloud.com/api-rtc/zh-cn_image_0301106159.png)
   
   
2. 调用[创建应用](https://support.huaweicloud.com/api-rtc/CreateApp.html)接口创建SparkRTC应用。
   
   1. 选择**POST** 请求方法并输入URI。
      ```
      https://rtc-api.myhuaweicloud.com/v2/apps
      ```
      
   
   2. 请求消息头中增加"X-Auth-Token"，值设置为步骤[1](https://support.huaweicloud.com/api-rtc/rtc_07_0008.html#rtc_07_0008__li134912423710)中获取的用户Token。
   
   3. Request Body中传入如下参数：
      ```
      {
        "app_name" : "rtctest"
      }
      ```
      
   
   4. 请求响应成功后，返回已创建应用的ID。
      ```
      {
      "app_id": "5ff9701f2346968bb306cb43",
      }
      ```
      
   
   
   
   
3. 调用[创建或更新录制规则](https://support.huaweicloud.com/api-rtc/CreateRecordRule.html)接口，创建录制规则。
   
   1. 选择**POST** 请求方法并输入URI。
      ```
      https://rtc-api.myhuaweicloud.com/v2/apps/{app_id}/record-rules
      ```
      
   
   2. 请求消息头中增加"X-Auth-Token"，值设置为步骤[1]中获取的用户Token。
   
   3. Request Body中传入如下参数：
      ```
      {
      "obs_addr": {
      "bucket": "obsName",
      "location": "cn-north-4",
      "object": "Record/",
      "project_id": "01234567890123456789012345678901"
      },
      "record_formats": ["MP4"],
      "mp4_config": {}
      }
      ```
      
   
   4. 请求响应成功后，返回已创建的录制规则。
      ```
      {
      "app_id": "5ff9701f2346968bb306cb43",
      "rule_id": "5d0ec2c53a2c15625017adb8bbbcd9ab",
      "create_time": "2021-04-21T10:29:33Z",
      "hls_config": {
      "record_cycle": 0,
      "record_max_duration_to_merge_file": 0
      },
      "mp4_config": {
      "record_cycle": 7200,
      "record_max_duration_to_merge_file": 0,
      "record_prefix": "Record/{publish_domain}/{app}/{record_type}/{record_format}/{stream}_{file_start_time}/{stream}_{file_start_time}"
      },
      "obs_addr": {
      "bucket": "obsName",
      "location": "cn-north-4",
      "object": "Record/",
      "project_id": "01234567890123456789012345678901"
      },
      "record_formats": [
      "MP4"
      ],
      "update_time": "2021-04-21T10:29:33Z"
      }
      ```
      
   
   
   
   
4. 调用[RTC增值（录制）事件回调配置](https://support.huaweicloud.com/api-rtc/UpdateRecordCallback.html)接口，配置录制回调。
   
   1. 选择**PUT** 请求方法并输入URI。
      ```
      https://rtc-api.myhuaweicloud.com/v2/apps/{app_id}/record-callback
      ```
      
   
   2. 请求消息头中增加"X-Auth-Token"，值设置为步骤[1]中获取的用户Token。
   
   3. Request Body中传入如下参数：
      ```
      {
      "url": "http://mydomain.com/callback",
      "auth_key": "8923ab8c2dcef4538923ab8c2dcef453"
      }
      ```
      
   
   4. 请求响应成功后，返回已创建的回调信息。
      ```
      {
      "app_id": "5ff9701f2346968bb306cb43",
      "record_callback": {
      "auth_key": "8923ab8c2dcef4538923ab8c2dcef453",
      "update_time": "2021-04-07T12:05:18.0718Z",
      "url": "http://mydomain.com/callback",
      "notify_event_subscription": [
      "RECORD_NEW_FILE_START",
      "RECORD_FILE_COMPLETE",
      "CLOUD_RECORD_OVER"
      ]
      }
      }
      ```
      
   
   
   
   
5. 终端用户通过SparkRTC APP加入某个SparkRTC房间，SparkRTC APP的集成开发请参见[客户端SDK](https://support.huaweicloud.com/csdk-rtc/rtc_05_0001.html)。
6. 调用[启动合流任务](https://support.huaweicloud.com/api-rtc/CreateMixJob.html)接口，创建录制任务。
   
   1. 选择**POST** 请求方法并输入URI。
      ```
      https://rtc-api.myhuaweicloud.com/v2/apps/{app_id}/mix-stream-jobs
      ```
      
   
   2. 请求消息头中增加"X-Auth-Token"，值设置为步骤[1]中获取的用户Token。
   
   3. Request Body中传入如下参数：
      ```
      {
      "mix_param": {
      "room_id": "room001",
      "encode_template": "1920x1080_30_4620",
      "max_idle_time": 30,
      "layout_template": "nine_grids_view" //若视频布局为屏幕共享，则填写为screen_share_left或screen_share_right。
      },
      "record_param": {
      "record_rule_id": "5d0ec2c53a2c15625017adb8bbbcd9ab"
      }
      }
      ```
      **layout_template**：视频布局模板编号。
      - **nine_grids_view** ：九宫格模板（自适应模板）。
        每个用户画面平铺在画布上，大小一致。根据用户数量，动态调整每个画面的大小和位置，最多支持25个画面。不同人数的实际布局效果如下图所示：
        ![](https://support.huaweicloud.com/api-rtc/zh-cn_image_0000001144513497.png)
        - 如果实际视频流的宽高比与视窗的宽高比不一致，则视频画面会裁剪以适配视窗的大小。
        
        - 如果中途有流退出房间，则该条流的画面会被后进入房间的流顶替。
        
        - 如果房间内的人数不足，则剩余位置显示背景色。
        
        - 如果用户只发送音频，仍然会占用画面位置。
        
        - 支持背景图，如果房间内人数不足，则显示背景图。
          
      
      - **screen_share_left** 、**screen_share_right** ：主视图在左边、右边的屏幕共享模板（自适应模板）。
        屏幕分享（或者主讲人摄像头画面）始终占据屏幕左侧或者右侧大画面位置，其他用户依次垂直排列于旁边，最多支持17个画面。不同人数的实际布局效果如下图所示：
        ![](https://support.huaweicloud.com/api-rtc/zh-cn_image_0000001097953646.png)
        ![](https://support.huaweicloud.com/api-rtc/zh-cn_image_0000001098193466.png)
        - 大视窗画面，可选择主讲摄像头流或共享屏幕流。
        
        - 大视窗画面，显示指定的UID用户的视频，如果未指定或者指定用户未进入频道，则大视窗区域显示背景色。
        
        - 左侧大视窗为了保持内容的完整性采用缩放方式处理，右侧小视窗采用裁剪方式适配视窗的大小。
        
        - 右侧小视窗画面按照加入房间的时间先后顺序排列。
        
        - 右侧小视窗有流退出房间，则该条流的画面会被后进入房间的流顶替。
        
        - 如果房间内的人数不足，则剩余位置显示背景色。
        
        - 如果用户只发送音频，仍然会占用画面位置。
        
        - 支持背景图，如果房间内人数不足，则显示背景图。
          
       
   
   4. 请求响应成功后，返回合流录制任务信息。
      ```
      {
      "app_id": "5ff9701f2346968bb306cb43",
      "create_time": "2021-04-21T11:47:32Z",
      "job_id": "607f9fc100d861eeefff9b300b388dab",
      "job_unique_id": "87b1f2b8da9c44cd",
      "mix_param": {
      "room_id": "room001",
      "layout_template": "nine_grids_view",
      "encode_template": "1920x1080_30_4620",
      "max_idle_time": 30
      },
      "push_param": {
      "rtmp_urls": null
      },
      "record_param": {
      "record_rule_id": "5d0ec2c53a2c15625017adb8bbbcd9ab"
      },
      "room_id": "room001",
      "start_time": "2021-04-21T11:47:32Z",
      "state": "INIT",
      "stop_time": "0001-01-01T00:00:00Z",
      "stream_name": "m_607f9fc100d861eeefff9b300b388dab_room001",
      "update_time": "2021-04-21T11:47:32Z"
      }
      ```
      
   
   
   
   
7. SparkRTC房间结束音视频互动后，您可以在配置的OBS桶中获取录制文件。
 
