云端录制

本文档指导您如何使用实时音视频(ARTC)的云端录制功能,将通话或直播内容录制并存储至云端,以满足回放、存档、审核等需求。

功能概览

云端录制功能允许您通过API创建录制任务,将ARTC频道内的音视频流录制下来。核心特性包括:

  • 多样的录制模式:支持将每个用户单独录制(单流录制),或将多个用户合成为一个文件(混流录制)。

  • 灵活的订阅机制:可按需选择录制频道内的指定用户、指定流类型(摄像头/屏幕共享)。

  • 自定义输出:支持自定义混流布局、背景图,并可生成多种文件格式(如 MP4, MP3, HLS)。

  • 可靠的云端存储:支持将录制文件自动上传至阿里云对象存储OSS或视频点播VOD。

准备工作

  1. 开通相关服务:确保您已开通实时音视频(ARTC)服务。根据您选择的存储方式,您还需要:

    • 存储到OSS:录制存储至OSS需要开通OSS服务并创建Bucket,具体操作请参见创建存储空间。会产生存储费用,在OSS中计费请参见存储费用

      说明

      完成服务授权:确保ARTC服务有权限将文件写入您指定的OSS Bucket。通常在开通服务时会自动完成授权。如果该权限意外被删除可点击同意云资源访问授权完成快速授权。

    • 存储到VOD:录制存储至VOD方式需要开通视频点播服务,并进行配置管理存储Bucket。会产生存储费用,在VOD中计费请参见点播基础服务计费

    重要
    • 地域一致性要求:云端录制存储所需Bucket的地域与调用接口时使用的接入点地域必须一致。例如,选择cn-shanghai接入点时,Bucket必须也是cn-shanghai地域的。

    • 录制文件生成:录制结束后,系统会将录制文件根据接口参数配置项存储至存储平台所配置的Bucket中。

  2. 了解计费规则

    • 云端录制属于通用能力,不需要开通即可使用。

    • 云端录制属于收费功能,费用详情请参见云端录制费用

核心概念

录制模式

您可以根据业务场景选择合适的录制模式。

  • 单流录制

    分别录制频道内每个用户的音视频流,为每个用户生成独立的录制文件。适用于需要对单个用户内容进行独立分析或后期处理的场景。

    • 录制文件的音视频参数默认与源流保持一致。

    • 若用户中途断流,录制文件会补充静音或黑屏/最后一帧画面,保证文件连续性。

  • 混流录制

    将频道内多个用户的音视频流混合成一个流,并录制成单个文件。适用于需要完整记录多人互动过程的场景,如会议、在线教育等。

    • 可自定义输出视频的分辨率、码率、帧率等参数。

    • 支持自定义视频布局(最多17路画面)和画布背景图。

    • 若有用户断流,其在混流画面中的位置将显示预设的子画面背景图或黑屏。

录制任务生命周期

image
说明
  • 当任务处于正常运行或异常运行状态中时,若超过最大生命周期(72小时)则任务会自动停止。

  • 任务已停止状态下会触发停止回调,以该回调状态为准,当收到回调信息时,可查询全部录制文件。

  • 空闲超时时间,当任务处于空闲状态的时长超过MaxIdleTime时,自动停止任务。单位为秒,范围须在[10,14400]内,即最大4小时。(默认为300秒)

    • 对于混流录制模式,当所有订阅的用户流都停止推流时算作空闲。

    • 对于单流录制模式,订阅的流之间彼此独立,任意一路流停止推流都算作空闲,达到MaxIdleTime后会停止该路流的录制,当所有订阅流都空闲超时后,会停止整个云端录制任务。

文件生成与存储

录制文件格式

  • 纯音频:支持 MP3、AAC 格式。

  • 音视频:支持 MP4、HLS 格式。

说明
  • 系统默认会生成一份HLS格式的文件,即使您未在请求中指定。

  • 生成多种格式文件会按格式数量分别计费。

文件命名规则

录制文件存储在您指定的OSS/VOD路径下,并以TaskId作为一级目录。您可以通过组合预设变量来自定义文件名。

自定义文件名可用变量:

变量名

描述

AppId

应用ID。

ChannelId

频道ID。

UserId

用户ID(仅单流录制有效)。

RecordMode

录制模式(0: 单流, 1: 混流)。

StreamType

流类型(A: 音频, V: 视频, AV: 音视频)。

SourceType

视频源(C: 摄像头, S: 屏幕共享)。

StartTime

录制开始的UTC时间(毫秒)。

Sequence

HLS切片索引号。

默认文件名规则:

  • 单流录制:

    • HLS格式:{AppId}_{ChannelId}_{UserId}_{StartTime}_{Sequence}

    • 其他格式:{AppId}_{ChannelId}_{UserId}_{StartTime}

  • 混流录制:

    • HLS格式:{AppId}_{ChannelId}_{StartTime}_{Sequence}

    • 其他格式:{AppId}_{ChannelId}_{StartTime}

说明
  • 若同时订阅了同一个UserId的不同StreamType或不同SourceType则在默认命名规则中的{UserId}后补充{SourceType}

  • 当文件命名为***后,文件最终会保存为类似TaskId/***.M3U8的形式,其中TaskId是在启动云端录制任务时生成的任务ID,会由系统自动添加到存储路径中。

文件分片策略

为了便于管理,录制会按指定时长自动切分成多个文件。您可以通过 MaxFileDuration 参数设置每个分片文件的最大时长,范围为180秒到7200秒(2小时),默认为2小时。

实现步骤

通过调用API,您可以轻松控制云端录制的整个流程。以下是核心步骤和常见场景的参数示例。

第一步:启动录制任务

调用启动Rtc云端录制任务接口来启动一个录制任务。您需要根据需求,在请求中配置订阅、录制和存储参数。

关键参数配置思路:

  1. 明确录制模式:决定是单流(RecordMode: 0)还是混流(RecordMode: 1)。

  2. 确定订阅对象:在SubscribeParams中列出您想录制的 UserId及其流类型(StreamType)。

  3. 设置输出格式:在 RecordParams中定义输出是纯音频(StreamType: 1)还是音视频(StreamType: 0)。

  4. 配置存储信息:在 StorageParams中指定存储到OSSVOD,并提供必要的BucketEndpoint信息。

场景示例

image

单流纯音频录制

场景:在房间myRoom内,有userA、userBuserC三个用户。现在希望分别录制userAuserB的音频内容,userC不录制。并期望生成m3u8mp3文件(m3u8文件是必选的)。

录制结果:文件会保存到指定的OSSmy-bucket内。其中,m3u8格式的文件存储在hls/{taskId}路径下,mp3格式的文件存储在mp3/{taskId}路径下。

参数示例:

{
  "AppId": "my-app-id", // 推流时使用的appId
  "ChannelId": "myRoom", // 推流时指定的房间
  "SubscribeParams": {
    "SubscribeUserIdList": [
      {
        "UserId": "userA", // 待录制的user
        "StreamType": 1 // 指定订阅纯音频
      },
      {
        "UserId": "userB", // 待录制的user
        "StreamType": 1 // 指定订阅纯音频
      }
    ]
  },
  "RecordParams": {
    "RecordMode": 0, // 指定单流录制
    "StreamType": 1, // 指定输出纯音频格式
    "MaxFileDuration": 180 // 指定文件大小,180对应3分钟
  },
  "StorageParams": {
    "StorageType": 1, // 指定存储到OSS
    "FileInfo": [ // 生成m3u8和mp3文件,分别存储到"hls"和"mp3"路径下
      {
        "Format": "HLS",
        "FilePathPrefix": [
          "hls"
        ]
      },
      {
        "Format": "MP3",
        "FilePathPrefix": [
          "mp3"
        ]
      }
    ],
    "OSSParams": {
      "OSSEndpoint": "oss-cn-shanghai.aliyuncs.com",
      "OSSBucket": "my-bucket"
    }
  },
  "NotifyUrl": "http://mytest/callback", // 接收回调消息的地址,可选
  "NotifyAuthKey": "12345678abcdefghikj" // 回调消息的鉴权key,可选
}

单流音视频录制

场景:在房间myRoom内,有userA、userBuserC三个用户。现在希望分别录制userAuserB的音视频内容,userC不录制。并期望生成m3u8mp4文件(m3u8文件是必选的)。

录制结果:文件会保存到指定的OSSmy-bucket内。其中,m3u8格式的文件存储在hls/{taskId}路径下,mp4格式的文件存储在mp4/{taskId}路径下。

参数示例:

{
  "AppId": "my-app-id", // 推流时使用的appId
  "ChannelId": "myRoom", // 推流时指定的房间
  "SubscribeParams": {
    "SubscribeUserIdList": [
      {
        "UserId": "userA", // 待录制的user
        "StreamType": 0 // 指定订阅音视频
      },
      {
        "UserId": "userB", // 待录制的user
        "StreamType": 0 // 指定订阅音视频
      }
    ]
  },
  "RecordParams": {
    "RecordMode": 0, // 指定单流录制
    "StreamType": 0, // 指定输出音视频格式
    "MaxFileDuration": 180 // 指定文件大小,180对应3分钟
  },
  "StorageParams": {
    "StorageType": 1, // 指定存储到OSS
    "FileInfo": [ // 生成m3u8和mp4文件,分别存储到"hls"和"mp4"路径下
      {
        "Format": "HLS",
        "FilePathPrefix": [
          "hls"
        ]
      },
      {
        "Format": "MP4",
        "FilePathPrefix": [
          "mp4"
        ]
      }
    ],
    "OSSParams": {
      "OSSEndpoint": "oss-cn-shanghai.aliyuncs.com",
      "OSSBucket": "my-bucket"
    }
  },
  "NotifyUrl": "http://mytest/callback", // 接收回调消息的地址,可选
  "NotifyAuthKey": "12345678abcdefghikj" // 回调消息的鉴权key,可选
}

混流纯音频录制

场景:在房间myRoom内,有userA、userBuserC三个用户。现在希望录制userAuserB的交流内容,userC不录制,录制出的文件中既包含userA的声音,又包含userB的声音,即混流录制。并期望生成m3u8mp3文件(m3u8文件是必选的)。

录制结果:文件会保存到指定的OSSmy-bucket内。其中,m3u8格式的文件存储在hls/{taskId}路径下,mp3格式的文件存储在mp3/{taskId}路径下。

参数示例:

{
  "AppId": "my-app-id", // 推流时使用的appId
  "ChannelId": "myRoom", // 推流时指定的房间
  "SubscribeParams": {
    "SubscribeUserIdList": [
      {
        "UserId": "userA", // 待录制的user
        "StreamType": 1 // 指定订阅纯音频
      },
      {
        "UserId": "userB", // 待录制的user
        "StreamType": 1 // 指定订阅纯音频
      }
    ]
  },
  "RecordParams": {
    "RecordMode": 1, // 指定混流录制
    "StreamType": 1, // 指定输出纯音频格式
    "MaxFileDuration": 180 // 指定文件大小,180对应3分钟
  },
  "StorageParams": {
    "StorageType": 1, // 指定存储到OSS
    "FileInfo": [ // 生成m3u8和mp3文件,分别存储到"hls"和"mp3"路径下
      {
        "Format": "HLS",
        "FilePathPrefix": [
          "hls"
        ]
      },
      {
        "Format": "MP3",
        "FilePathPrefix": [
          "mp3"
        ]
      }
    ],
    "OSSParams": {
      "OSSEndpoint": "oss-cn-shanghai.aliyuncs.com",
      "OSSBucket": "my-bucket"
    }
  },
  "MixTranscodeParams": {
    "AudioBitrate": 128, // 音频码率
    "AudioChannels": 2, // 频道数
    "AudioSampleRate": 44100 // 采样率
  },
  "NotifyUrl": "http://mytest/callback", // 接收回调消息的地址,可选
  "NotifyAuthKey": "12345678abcdefghikj" // 回调消息的鉴权key,可选
}

混流音视频录制

场景:在房间myRoom内,有userA、userBuserC三个用户。现在希望录制userAuserB的音频和摄像头内容,以及userC的音频内容。并期望生成m3u8mp4文件(m3u8文件是必选的)。

录制出的结果中,期望userAuserB的画面按如下方式排列:

image

录制结果:文件会保存到指定的OSSmy-bucket内。其中,m3u8格式的文件存储在hls/{taskId}路径下,mp4格式的文件存储在mp4/{taskId}路径下。

参数示例:

{
  "AppId": "my-app-id", // 推流时使用的appId
  "ChannelId": "myRoom", // 推流时指定的房间
  "SubscribeParams": {
    "SubscribeUserIdList": [
      {
        "UserId": "userA", // 待录制的user
        "StreamType": 0, // 指定订阅音视频
        "SourceType": 0 // 指定订阅相机流
      },
      {
        "UserId": "userB", // 待录制的user
        "StreamType": 0, // 指定订阅音视频
        "SourceType": 0 // 指定订阅相机流
      },
      {
        "UserId": "userC", // 待录制的user
        "StreamType": 1 // 指定订阅纯音频
      }
    ]
  },
  "RecordParams": {
    "RecordMode": 1, // 指定混流录制
    "StreamType": 0, // 指定输出音视频格式
    "MaxFileDuration": 180 // 指定文件大小,180对应3分钟
  },
  "StorageParams": {
    "StorageType": 1, // 指定存储到OSS
    "FileInfo": [ // 生成m3u8和mp4文件,分别存储到"hls"和"mp4"路径下
      {
        "Format": "HLS",
        "FilePathPrefix": [
          "hls"
        ]
      },
      {
        "Format": "MP4",
        "FilePathPrefix": [
          "mp4"
        ]
      }
    ],
    "OSSParams": {
      "OSSEndpoint": "oss-cn-shanghai.aliyuncs.com",
      "OSSBucket": "my-bucket"
    }
  },
  "MixTranscodeParams": {
    "AudioBitrate": 128,
    "AudioChannels": 2,
    "AudioSampleRate": 44100,
    "VideoCodec": "H.264",
    "VideoBitrate": 500,
    "VideoFramerate": 30,
    "VideoGop": 30,
    "VideoHeight": 480, // 最终生成视频的高度
    "VideoWidth": 640 // 最终生成视频的宽度
  },
  "MixLayoutParams": {
    "UserPanes": [
      {
        "UserId": "userA",
        "SourceType": 0,
        "Height": "1", // 占整个画面高度
        "Width": "0.5", // 占一半画面宽度
        // 窗口左上顶点处于画面左上角
        "X": "0",
        "Y": "0"
      },
      {
        "UserId": "userB",
        "SourceType": 0,
        "Height": "1", // 占整个画面高度
        "Width": "0.5", // 占一半画面宽度
        // 窗口左上顶点处于画面中部
        "X": "0.5",
        "Y": "0"
      }
    ]
  },
  "NotifyUrl": "http://mytest/callback", // 接收回调消息的地址,可选
  "NotifyAuthKey": "12345678abcdefghikj" // 回调消息的鉴权key,可选
}

第二步(可选):更新录制任务

在录制过程中,您可以调用更新Rtc云端录制任务接口来动态修改录制参数,无需停止任务。

说明
  • 单流模式:仅支持更新订阅信息。

  • 混流模式:可以更新订阅信息与布局信息。

第三步:停止录制任务

当您需要结束录制时,调用停止Rtc云端录制任务接口。

说明

调用此接口后,系统会开始处理并上传最后的录制文件。真正的任务结束是以收到“停止回调”事件为准。在此之前,请勿删除或修改相关的存储资源。

第四步:查询任务与文件

可调用查询Rtc云端录制文件及任务状态接口来查询云端录制中录制任务的状态与录制文件信息等。

说明
  • 仅当录制任务存在时可以正常查询到具体信息,若查询任务不存在则无法查询到信息,接口会返回错误码。

  • 当任务成功进入到运行状态且距离任务创建时间未达到72小时的情况下,可正常获取到录制文件信息,超过72小时后会返回错误码。