声网提供消息通知服务,你可以配置一个接收回调的 HTTP/HTTPS 服务器地址来接收云端录制的事件通知。当事件发生时,声网云端录制服务会将事件消息发送给声网消息通知服务器,然后声网消息通知服务器会通过 HTTP/HTTPS 请求将事件投递给你的服务器。
使用声网消息通知服务前需要申请开通并进行配置,关于如何开通服务以及消息通知回调的数据格式详见消息通知服务。
开通消息通知服务后,当你指定要接收通知的事件发生时,声网消息通知服务器会以 HTTP 请求形式向你发送回调。回调的具体内容在请求包体中以 JSON 对象形式返回,根据事件不同,请求包体中 JSON 对象所包含的字段也不一样。
下面以一个示例说明请求包体中的字段:
payload 中的公共字段,所有的云端录制事件的回调中 payload 都包含这些字段。eventType,serviceType 和 details 的内容取决于发生的事件,详见回调事件。 payload 字段是一个 JSON Object,包含事件的具体内容。云端录制每种类型的事件通知中 payload 都会包含以下字段:
cname:String 类型,录制的频道名称。uid:String 类型,录制使用的 UID。sid:String 类型,录制 ID,一次云端录制的唯一标识。sequence:Number 类型,消息序列号,从 0 开始计数。消息可能乱序到达或者丢失重发,可以通过该参数标识消息。serviceScene:String 类型,当前运行的录制场景或录制阶段:"rtc_record": 实时录制。"rtc_snapshot": 截图。"rtc_vod": 录制并上传至阿里视频点播服务。"web_record": 页面录制。"postpone_transcode::rtc_record": 延时转码场景下的第一阶段,即录制阶段。"postpone_transcode::transcode": 延时转码场景下的第二阶段,即转码阶段。"postpone_transcode::transcode_failover": 转码失败。sendts:Number 类型, 事件发生的时间 (UTC 时间)。Unix 时间戳,精确到毫秒。serviceType:Number 类型,回调事件服务的类型。0:云端录制服务1:录制模块2:上传模块4:扩展服务6:页面录制7:延时转码模块8:下载模块details:JSON Object,具体的消息内容,详见下面每个事件的描述。消息通知服务可能会在 details 中新增字段,但为保证兼容,不会改变现有字段的数据格式。本节详细介绍云端录制每种回调事件的相关字段。
| eventType | serviceType | 事件描述 |
|---|---|---|
| 1 | 0(云端录制服务) | 云端录制服务发生错误 |
| 2 | 0(云端录制服务) | 云端录制服务发生警告 |
| 3 | 0(云端录制服务) | 云端录制服务状态发生变化 |
| 4 | 0(云端录制服务) | 生成录制索引文件 |
| 11 | 0(云端录制服务) | 云端录制服务结束任务并退出 |
| 12 | 0(云端录制服务) | 云端录制启用高可用机制 |
| 30 | 2(上传模块) | 上传服务已启动 |
| 31 | 2(上传模块) | 所有录制文件已上传至指定的第三方云存储 |
| 32 | 2(上传模块) | 所有录制文件已经全部上传完成,但至少有一片上传到声网备份云 |
| 33 | 2(上传模块) | 录制文件上传到第三方云存储的进度 |
| 40 | 1(录制模块) | 录制服务已启动 |
| 41 | 1(录制模块) | 录制服务已退出 |
| 42 | 1(录制模块) | 同步录制文件信息 |
| 43 | 1(录制模块) | 音频流状态变化 |
| 44 | 1(录制模块) | 视频流状态变化 |
| 45 | 1(录制模块) | 视频截图成功 |
| 60 | 4(扩展服务) | 阿里视频点播服务上传模块启动,并成功获取上传凭证。 |
| 61 | 4(扩展服务) | 所有录制文件已上传至阿里视频点播服务。 |
| 70 | 6 (页面录制) | 页面录制已启动 |
| 71 | 6 (页面录制) | 页面录制已停止 |
| 72 | 6 (页面录制) | 待录制页面使用了不受支持的功能,录制即将停止 |
| 73 | 6 (页面录制) | 待录制页面重新加载 |
| 80 | 7 (延时转码模块) | 转码已启动 |
| 81 | 7 (延时转码模块) | 转码已完成 |
| 90 | 8 (下载模块) | 下载录制文件失败 |
| 100 | 6 (页面录制) | 页面录制 CDN 推流状态变化 |
| 1001 | 0 (云端录制服务) | 转码最终结果 |
eventType 为 1 表示云端录制服务发生错误, details 中包含以下字段:
msgName:String 类型,消息名称,即 "cloud_recording_error"。module:Number 类型,发生错误的模块。0:录制模块1:上传模块2:云端录制服务6:页面录制服务errorLevel:Number 类型,错误级别。1:debug2:minor3:medium4:major5:fatal。fatal 级别的错误很可能导致录制退出,如果收到该级别的消息请及时调用 query API 查询当前状态,并结合错误消息的内容进行处理。errorCode:Number 类型,错误码。如果错误发生在录制模块(0),请参考常见错误码;如果错误发生在上传模块(1),请参考上传错误码;如果错误发生在云端录制服务模块(2),请参考云端录制服务错误码;其他模块错误码请参考常见错误码。如果错误码未列出,请联系声网技术支持。stat:Number 类型,事件状态,0 表示正常,其他值表示异常。errorMsg:String 类型,具体的错误信息。eventType 为 2 表示云端录制服务发生警告, details 中包含以下字段:
msgName:String 类型,消息名称,即 cloud_recording_warning。module:Number 类型,发生警告的模块名。0:录制模块1:上传模块warnCode:Number 类型,警告码。如果警告发生在录制模块,请参考警告码;如果警告发生在上传模块,请参考上传警告码。eventType 为 3 表示云端录制服务状态与你调用的方法不匹配,导致调用失败。例如,云端录制服务已开始,导致再次调用 start 失败。details 中包含以下字段:
msgName:String 类型,消息名称,即 cloud_recording_status_update。status:Number 类型,云端录制当前的状态,请参考云端录制服务状态码。recordingMode:Number 类型,录制模式。0:合流模式1:单流模式fileList:String 类型,录制生成的 M3U8 索引文件名。eventType 为 4 表示生成 M3U8 文件并上传。录制过程中,录制服务会反复上传和覆盖 M3U8 文件,以更新索引信息,但只有第一次生成并上传 M3U8 文件时会触发该回调。
details 中包含以下字段:
msgName:String 类型,消息名称,即 cloud_recording_file_infos。fileList:String 类型,生成的 M3U8 文件名。eventType 为 11 表示云端录制服务结束任务并退出,details 中包含以下字段:
msgName:String 类型,消息名称,即 session_exit。exitStatus:Number 类型,退出状态。0:正常退出,即录制结束、录制文件成功上传后,录制服务退出。1:异常退出,例如参数设置错误,导致录制停止。eventType 为 12 表示云端录制启用高可用机制,details 中包含以下字段:
msgName:String 类型,消息名称,即 session_failover。newUid:Number 类型,启用高可用机制后,云端录制随机指定的录制 UID。云端录制将使用该录制 UID 加入频道,不再使用原有的录制 UID。eventType 为 30 表示上传服务已启动, details 中包含以下字段:
msgName:String 类型,消息名称,即 uploader_started。status:Number 类型,事件状态,0 表示正常,其他值表示异常。eventType 为 31 表示所有录制文件已上传至指定的第三方云存储, details 中包含以下字段:
msgName:String 类型,消息名称,即 uploaded。status:Number 类型,事件状态,0 表示正常,其他值表示异常。fileList:JSON Array,由每个录制文件的具体信息组成的数组。fileName:String 类型,录制产生的 M3U8 文件和 MP4 文件的文件名。trackType:String 类型,录制文件的类型。"audio":纯音频文件。"video":纯视频文件。"audio_and_video":音视频文件。uid:String 类型,用户 UID,表示录制的是哪个用户的音频流或视频流。合流录制模式下,uid 为 "0"。mixedAllUser:Boolean 类型,用户是否是分开录制的。true:所有用户合并在一个录制文件中。false:每个用户分开录制。isPlayable:Boolean 类型,是否可以在线播放。true:可以在线播放。false:无法在线播放。sliceStartTime:Number 类型,该文件的录制开始时间,Unix 时间戳,单位为毫秒。{
"msgName": "uploaded",
"fileList": [
{
"fileName": "xxx.m3u8",
"trackType": "audio",
"uid": "57297",
"mixedAllUser": false,
"isPlayable": true,
"sliceStartTime": 1619172871089
},
{
"fileName": "xxx.m3u8",
"trackType": "audio",
"uid": "10230",
"mixedAllUser": false,
"isPlayable": true,
"sliceStartTime": 1619172871099
}
],
"status": 0
}
{
"msgName": "uploaded",
"fileList": [
{
"fileName": "xxx.m3u8",
"trackType": "audio_and_video",
"uid": "0",
"mixedAllUser": true,
"isPlayable": true,
"sliceStartTime": 1619170461821
}
],
"status": 0
}
{
"msgName": "uploaded",
"fileList": [
{
"fileName": "xxx.mp4",
"trackType": "audio_and_video",
"uid": "0",
"mixedAllUser": true,
"isPlayable": true,
"sliceStartTime": 1619172632080
},
{
"fileName": "xxx.m3u8",
"trackType": "audio_and_video",
"uid": "0",
"mixedAllUser": true,
"isPlayable": true,
"sliceStartTime": 1619172632080
}
],
"status": 0
}
{
"msgName": "uploaded",
"status": 0
}
eventType 为 32 表示所有录制文件已经全部上传完成,但至少有一片上传到声网备份云,声网备份云会自动将这部分文件上传到指定的第三方云存储。 details 中包含以下字段:
msgName:String 类型,消息名称,即 backuped。status:Number 类型,事件状态,0 表示正常,其他值表示异常。fileList:JSON Array,由每个录制文件的具体信息组成的数组。fileName:String 类型,录制产生的 M3U8 文件和 MP4 文件的文件名。trackType:String 类型,录制文件的类型。"audio":纯音频文件。"video":纯视频文件。"audio_and_video":音视频文件。uid:String 类型,用户 UID,表示录制的是哪个用户的音频流或视频流。合流录制模式下,uid 为 "0"。mixedAllUser:Boolean 类型,用户是否是分开录制的。true:所有用户合并在一个录制文件中。false:每个用户分开录制。isPlayable:Boolean 类型,是否可以在线播放。true:可以在线播放。false:无法在线播放。sliceStartTime:Number 类型,该文件的录制开始时间,Unix 时间戳,单位为毫秒。{
"msgName": "backuped",
"fileList": [
{
"fileName": "xxx.m3u8",
"trackType": "audio",
"uid": "57297",
"mixedAllUser": false,
"isPlayable": true,
"sliceStartTime": 1619172871089
},
{
"fileName": "xxx.m3u8",
"trackType": "audio",
"uid": "10230",
"mixedAllUser": false,
"isPlayable": true,
"sliceStartTime": 1619172871099
}
],
"status": 0
}
{
"msgName": "backuped",
"fileList": [
{
"fileName": "xxx.m3u8",
"trackType": "audio_and_video",
"uid": "0",
"mixedAllUser": true,
"isPlayable": true,
"sliceStartTime": 1619170461821
}
],
"status": 0
}
{
"msgName": "backuped",
"fileList": [
{
"fileName": "xxx.mp4",
"trackType": "audio_and_video",
"uid": "0",
"mixedAllUser": true,
"isPlayable": true,
"sliceStartTime": 1619172632080
},
{
"fileName": "xxx.m3u8",
"trackType": "audio_and_video",
"uid": "0",
"mixedAllUser": true,
"isPlayable": true,
"sliceStartTime": 1619172632080
}
],
"status": 0
}
{
"msgName": "backuped",
"status": 0
}
eventType 为 33 表示当前上传的进度,录制开始后每分钟会通知一次。 details 中包含以下字段:
msgName:String 类型,消息名称,即 uploading_progress。progress:Number 类型,0 到 10000 之间的数字,当前已上传文件与已录制的文件的比例乘以 10000。这个数字是不断变动的,录制退出后,到达 10000 表示上传完成。eventType 为 40 表示录制服务已启动, details 中包含以下字段:
msgName:String 类型,消息名称,即 recorder_started。status:Number 类型,事件状态,0 表示正常,其他值表示异常。eventType 为 41 表示录制组件已退出, details 中包含以下字段:
msgName:String 类型,消息名称,即 recorder_leave。
leaveCode:Number 类型,退出码。将该退出码与各枚举值逐一进行按位与运算,计算结果非零的,即为退出原因。例如,code 为 6(二进制 110)时,将其与各枚举值逐一进行按位与计算,LEAVE_CODE_SIG (二进制 10)与 LEAVE_CODE_NO_USERS (二进制 100)的结果非零,则退出原因包括收到 SIGINT 信号以及录制超时。
| 枚举值 | |
|---|---|
| LEAVE_CODE_INIT | 0:初始化失败。 |
| LEAVE_CODE_SIG | 2(二进制 10):AgoraCoreService 收到 SIGINT 信号而触发的退出。 |
| LEAVE_CODE_NO_USERS | 4(二进制 100):频道内除录制端外没有其他用户,录制端自动离开频道。 |
| LEAVE_CODE_TIMER_CATCH | 8(二进制 1000):可忽略。 |
| LEAVE_CODE_CLIENT_LEAVE | 16(二进制 10000):录制端调用 leaveChannel 方法退出频道。 |
eventType 为 42 表示同步录制文件信息, details 中包含以下字段:
msgName:String 类型,消息名称,即 recorder_slice_start。startUtcMs:Number 类型,录制开始时间(即第一个录制切片的开始时间),UTC 时间,精确到毫秒。discontinueUtcMs:Number 类型,UTC 时间,精确到毫秒,正常情况下该字段值与 startUtcMs 一致。当录制发生异常中断时,声网云端录制会自动恢复录制,此时也会收到该事件通知,且该字段表示上一个正常的录制切片结束的时间。mixedAllUser:Boolean 类型,是否将每个用户分开录制。true:所有用户合并在一个录制文件中。false:每个用户分开录制。streamUid:String 类型,用户 UID,表示录制的是哪个用户的音频流或视频流。在合流模式下,streamUid 为 "0"。trackType:String 类型,录制文件的类型。"audio":纯音频文件。"video":纯视频文件。"audio_and_video":音视频文件。举例来说,某次录制生成第一个切片文件时,会收到回调通知该事件,其中startUtcMS 为第一个切片文件开始的时间。假设第 2 个 到第 N 个切片文件都是正常的,不会收到该事件通知,到第 N + 1 个切片时发生故障,导致该切片文件丢失且录制中断,此时重新开始录制后生成第 N + 2 个切片,会再次收到回调通知该事件,其中 startUtcMs 为第 N + 2 个切片开始的时间, discontinueUtcMs 为第 N 个切片结束的时间。
eventType 为 43 表示录制的音频流状态变化,details 中包含以下字段:
msgName:String 类型,消息名称,即 recorder_audio_stream_state_changed。streamUid: String 类型,用户 UID,表示录制的是哪个用户的音频流。合流录制模式下,会收到 streamUid 为 0 的回调,代表合流后的音频流。state:Number 类型,云端录制服务是否正在接收音频流。0:云端录制服务正在接收音频流1:云端录制服务未在接收音频流UtcMs:Number 类型,音频流状态变化时的时间,UTC 时间,精确到毫秒。eventType 为 44 表示录制的视频流状态变化,details 中包含以下字段:
msgName:String 类型,消息名称,即 recorder_video_stream_state_changed。streamUid: String 类型,用户 UID,表示录制的是哪个用户的视频流。合流录制模式下,会收到 streamUid 为 0 的回调,代表合流后的视频流。state:Number 类型,云端录制服务是否正在接收视频流。0:云端录制服务正在接收视频流1:云端录制服务未在接收视频流UtcMs:Number 类型,视频流状态变化时的时间,UTC 时间,精确到毫秒。eventType 为 45 表示视频截图成功并上传至第三方云存储,details 中包含以下字段:
msgName:String 类型,消息名称,即 recorder_snapshot_file。fileName: String 类型,截图生成的 JPG 文件的文件名。格式为:"fileName": "<fileNamePrefix>/<file name>"。
fileNamePrefix指截图文件在第三方云存储中的存储位置。
eventType 为 60 表示阿里视频点播服务上传模块启动成功,并成功获取阿里视频点播服务的上传凭证, details 中包含以下字段:
msgName:String 类型,消息名称,即 "vod_started"。aliVodInfo:JSON Object,待上传视频的相关信息。videoId:String 类型,待上传视频的视频 ID。eventType 为 61 表示所有录制文件均已上传至阿里视频点播服务, details 中包含以下字段:
msgName:String 类型,消息名称,即 "vod_triggered"。
eventType 为 70 表示页面录制已启动, details 中包含以下字段:
msgName:String 类型,消息名称,即 "web_recorder_started"。recorderStartTime: Number 类型,录制开始时间(UTC 时间)。Unix 时间戳,精确到毫秒。eventType 为 71 表示页面录制已停止, details 中包含以下字段:
msgName:String 类型,消息名称,即 "web_recorder_stopped"。code: Number 类型,错误码。如果错误码不为 0,则表示页面录制异常停止。message: String 类型,错误消息,用于提示录制正常或异常停止的原因。details: String 类型,错误消息具体描述,用于提示录制正常或异常停止的原因的具体描述,你可以根据该信息采取相应措施。fileList:JSON Array。由每个录制文件的具体信息组成的数组。fileName:String 类型,录制产生的 M3U8 或 MP4 文件的文件名。sliceStartTime:Number 类型,该文件的录制开始时间,Unix 时间戳,单位为毫秒。code 和 message 字段说明如下:
| code | message | 说明 |
|---|---|---|
0 |
ok |
正常,用户主动停止录制。 |
1 |
max_recording_hour |
录制时长达到设置的最大录制时长(maxRecordingHour)导致录制停止。 |
2 |
capability_limit |
待录制页面使用了不受支持的功能导致录制停止。 |
3 |
start_engine_failed |
录制服务启动失败导致录制停止。 |
4 |
page_load_timeout |
使用页面加载超时功能的情况下,页面加载超时导致录制停止。 |
5 |
access_url_failed |
打开待录制页面发生错误导致录制停止。 |
6 |
recorder_error |
录制发生错误不可继续导致录制停止。 |
{
"msgName": "web_recorder_stopped",
"code": 1,
"message": "max_recording_hour",
"details": "max recording hour is 4",
"fileList": [
{
"filename": "test_p1627613634_www.m3u8",
"sliceStartTime": 1627613641393
},
{
"filename": "test_p1627613634_www_0.mp4",
"sliceStartTime": 1627613641393
}
]
}eventType 为 72 表示待录制页面使用了不受支持的功能,录制即将停止。details 中包含以下字段:
msgName:String 类型,消息名称,即 "web_recorder_capability_limit"。limitType:String 类型,限制类型名称,包含如下几种"resolution": 待录制页面中包含超过 1920 × 1080 分辨率的视频源。"WebGL":待录制页面使用了 WebGL 功能。"bandwidth":上行带宽超过 10 M,或者下行带宽超过 1 G。eventType 为 73 表示页面录制过程中,页面重新加载, details 中包含以下字段:
msgName:String 类型,消息名称,即 "web_recorder_reload"。reason: String 类型,页面重新加载的原因。包含以下原因:"audio_silence":检测到页面音频丢失。"page_load_timeout":检测到页面加载超时。该回调仅在以下条件下返回该字段:启用页面加载超时检测功能,且页面加载超时。eventType 为 80 表示转码已启动。details 中包含以下字段:
msgName:String 类型,消息名称,即 "transcoder_started"。eventType 为 81 表示转码已完成。details 中包含以下字段:
msgName:String 类型,消息名称,即 "transcoder_completed"。result: String 类型,转码结果。"all_success":全部文件转码成功。"partial_success":部分文件转码失败。"fail":转码失败。uids:JSON Array。数组内容为每个 UID 对应的录制文件的转码结果以及 MP4 文件的文件名。uid:String 类型,录制文件对应的 UID。result:String 类型,转码结果。"success":转码成功。"fail":转码失败。fileList:JSON Array,数组内容为 MP4 文件的相关信息。fileName:String 类型,MP4 文件的文件名。eventType 为 90 表示下载任务失败。整个录制进程仅触发一次该回调。details 中包含以下字段:
msgName:String 类型,消息名称,即 "download_failed"。vendor: Number 类型,第三方云存储供应商,和你在 start 请求中设置的 vendor 一致。region:Number 类型,第三方云存储指定的地区信息,和你在 start 请求中设置的 region 一致。bucket:String 类型,第三方云存储的 bucket,和你在 start 请求中设置的 bucket 一致。filename:String 类型,下载失败的 M3U8 或 TS/WebM 文件的文件名列表,文件名以 “;” 分隔 。eventType 为 100 表示页面录制的 CDN 推流状态变化, details 中包含以下字段:
msgName:String 类型,消息名称,即 "rtmp_publish_status"。rtmpUrl: String 类型,CDN 推流地址。status: Number 类型,页面录制当前的推流状态,包括以下状态:connecting:正在连接 CDN 服务器。publishing:正在推流。onhold:推流暂停。disconnected:连接 CDN 服务器失败,声网建议你更换 CDN 推流地址。eventType 为 1001 表示转码的最终结果。details 中包含以下字段:
msgName:String 类型,消息名称,即 "postpone_transcode_final_result"。result: String 类型,转码结果。"total_success":全部文件转码成功。"partial_success":部分文件转码失败。"failed":转码失败。fileList:JSON Array,数组内容为 MP4 文件的相关信息。fileName:String 类型,MP4 文件的文件名。| 错误码 | 描述 |
|---|---|
| 32 | 第三方云存储信息错误 |
| 47 | 文件上传失败 |
| 51 | 上传时文件操作发生错误 |
| 警告码 | 描述 |
|---|---|
| 31 | 重传到指定的云存储 |
| 32 | 重传到声网备份云 |
| 错误码 | 描述 |
|---|---|
| 50 | 上传超时 |
| 52 | 云端录制服务启动超时 |
| 状态码 | 描述 |
|---|---|
| 0 | 没有开始云端录制 |
| 1 | 云端录制初始化完成 |
| 2 | 录制组件开始启动 |
| 3 | 上传组件已启动 |
| 4 | 录制组件启动完成 |
| 5 | 已成功上传第一个文件 |
| 6 | 已经停止录制 |
| 7 | 云端录制服务全部停止 |
| 8 | 云端录制准备退出 |
| 20 | 云端录制异常退出 |