当直播域名配置完成回调功能后,关联事件触发时将以主动发送请求到业务服务器的方式,将含直播事件回调信息的 JSON 数据包发送给业务服务器。
事件通知请求具备重试能力,请求失败后会立即进行 3 次间隔时间为 3 秒的重试;如 3 次重试还未请求成功,则将请求任务加入重试队列再次进行重试;从首次请求算起超过 10 分钟后仍未请求成功则不再重试。以下情况可视为请求失败。
字段 | 类型 | 说明 |
---|---|---|
sign | String | 事件通知请求安全签名 sign=MD5 ( AuthKeyPrimary + t ) 。 说明 火山引擎将回调密钥 AuthKeyPrimary 和过期时间 t 进行字符串拼接后通过 MD5 计算得出 sign 值,并将其放在通知消息里,业务服务器在收到事件通知请求后可以根据同样的算法确认 sign 是否正确,进而确认事件通知请求是否确实来自火山引擎。 |
t | Int64 | 过期时间,事件通知请求签名过期 UNIX 时间戳。 说明 来自火山引擎的事件通知请求默认过期时间是 10 分钟,如果一条事件请求通知中的 t 值所指定的时间已经过期,则可以判定此条事件请求通知无效,通过此方法可以防止网络重放攻击。 |
字段 | 类型 | 说明 |
---|---|---|
vhost | String | 域名空间 |
domain | String | 推流地址 |
app | String | AppName,App 名称 |
stream | String | StreamName,流名称 |
event_type | String | 事件名,push_start 表示开始推流 |
sign | String | 公共安全签名参数 |
t | String | 公共安全签名参数 |
time | Int | 开始推流时间,单位为 s |
time_ms | Int | 开始推流时间,单位为 ms |
transcoded | Boolean | 是否为转码流
|
fp_node_ip | String | 推流节点 IP |
fp_client_ip | String | 推流客户端 IP |
fp_user_url | String | 推流请求携带的 URL 参数 |
session_id | String | 本次推流的会话 ID。 |
sequence_id | String | 本次推流的的推流序列 ID,是一次推流的唯一标识 |
回调示例如下所示。
{ "code":0, "message":"ok", "data":{ "vhost":"push.example.com", "domain":"push.example.com", "app":"live", "stream":"stream-123456", "event_type":"push_start", "sign":"", "t":0, "detail":{ "time":1640849510, "time_ms":1640849510029, "transcoded":false, "fp_node_ip":"10.10.10.1", "fp_client_ip":"10.10.10.2", "fp_user_url":"", "session_id":"3693930911_150.139.1.1", "sequence_id":"027-20241313130E.1231423483" } } }
字段 | 类型 | 说明 |
---|---|---|
vhost | String | 域名空间 |
domain | String | 推流地址 |
app | String | AppName,App 名称 |
stream | String | StreamName,流名称 |
event_type | String | 事件名,push_end 表示推流结束 |
sign | String | 公共安全签名参数 |
t | String | 公共安全签名参数 |
errmsg | String | 参考 断流原因 |
time | Int | 结束推流时间,单位为 s |
time_ms | Int | 结束推流时间,单位为毫秒 |
transcoded | Boolean | 是否为转码流。
|
fp_node_ip | String | 推流节点 IP |
fp_client_ip | String | 推流客户端 IP |
fp_user_url | String | 推流请求携带的 URL 参数 |
session_id | String | 本次推流的会话 ID |
sequence_id | String | 本次推流的的推流序列 ID,是一次推流的唯一标识 |
回调示例如下所示。
{ "code":0, "message":"ok", "data":{ "vhost":"push-rtmp.example.com", "domain":"push-rtmp.example.com", "app":"live", "stream":"stream-123456", "event_type":"push_end", "sign":"", "t":0, "detail":{ "time":1640849502, "time_ms":1640849502762, "transcoded":false, "errmsg":"func:OnStop:eof", "fp_node_ip":"10.10.10.1", "fp_client_ip":"10.10.10.2", "fp_user_url":"", "session_id":"3693930911_150.139.1.1", "sequence_id":"027-20241313130E.1231423483" } } }
字段 | 类型 | 说明 |
---|---|---|
vhost | String | 域名空间 |
domain | String | 推流地址 |
app | String | AppName,App 名称 |
stream | String | StreamName,流名称 |
event_type | String | 事件名,record_event 表示录制事件 |
sign | String | 公共安全签名参数 |
t | String | 公共安全签名参数 |
tos_bucket | String | 保存在对象存储中的 bucket 名称 |
tos_object | String | 保存在对象存储中的文件路径 |
uri | String | 录制保存在点播时,该录制视频在点播中的 Vid |
duration | Int | 录制长度,单位毫秒 |
start_time | Int | 录制开始时间,Unix 时间,单位为 s |
stop_time | Int | 录制结束时间,Unix 时间 |
format | String | 录制格式。支持的取值如下所示。
|
url | String | 文件地址 说明 如果录制文件存储在 VoD 中, |
vod_filename | String | 录制至点播时的文件路径 |
account_id | String | 账号 ID |
size | Long | 录制产物的大小,单位字节 |
回调示例如下所示。
{ "code":0, "message":"ok", "data":{ "vhost":"push.example.com", "domain":"push.example.com", "app":"live", "stream":"stream_123456", "event_type":"record_event", "sign":"", "t":0, "detail":{ "tos_bucket":"", "tos_object":"record/push.example.com/live/stream_123456_1640847072_1640849947_record.m3u8", "uri":"v0df17g10000ca6ut9pka0prk****pig", "duration":2868674, "start_time":1640847072, "stop_time":1640849947, "format":"m3u8", "url":"", "vod_filename":"record/{PubDomain}/{App}/{Stream}/{StartTime}_{EndTime}", "account_id":"10000**", "size":28361 } } }
{ "code": 0, "message": "ok", "data": { "vhost": "push.example.com", "domain": "push.example.com", "app": "live", "stream": "stream_12345", "event_type": "record_event", "sign":"", "t":0, "detail": { "tos_bucket": "livetest", "tos_object": "record/record/push.example.com/live/stream_123456/1653469134_1653469220.m3u8", "uri": "", "duration": 84430, "start_time": 1653469134, "stop_time": 1653469220, "format": "m3u8", "url": "http://livetest.tos.volces.com/record/record/push.example.com/live/stream_12345/1653469134_1653469220.m3u8", "account_id": "2000001174", "size": 689 } } }
字段 | 类型 | 说明 |
---|---|---|
Vhost | String | 域名空间 |
Domain | String | 推流地址 |
App | String | AppName,App 名称 |
Stream | String | StreamName,流名称 |
Bucket | String | 保存在对象存储中的 bucket 名称 |
ObjectKey | String | 存储的文件路径 |
Height | Int | 图片高度,单位像素 |
Width | Int | 图片宽度,单位像素 |
Format | String | 录制格式 |
TimeStamp | Int | 截图时间,Unix 时间 |
AccountId | String | 账号 ID |
ImageXURI | String | 截图存储在 ImageX 时,veImageX 为图片分配的资源 URI |
ServiceID | String | 截图存储在 veImageX 时,veImageX 的服务 ID |
event_type | String | 事件名,snapshot_event 表示截图事件 |
sign | String | 公共安全签名参数 |
t | String | 公共安全签名参数 |
回调示例如下所示。
{ "Vhost": "push.example.com", "Domain": "push.example.com", "App": "live", "Stream": "stream_1234", "Bucket": "bucket1", "ObjectKey": "push.example.com/live/stream_1234/2022052510115****.jpg", "Height": 1080, "Width": 1920, "Format": "jpg", "TimeStamp": 1653473517, "AccountId": "2000001174", "ImageXURI": "tos-cn-i-exampleid/2022052510115****.jpg", "sign":"", "t":0, "ServiceID": "exampleid" }
{ "Vhost":"push.example.com.", "Domain":"push.example.com", "App":"live", "Stream":"stream_1234", "Bucket":"bucket1", "ObjectKey":"pushp.example.com/live/20211****.jpeg", "Height":864, "Width":480, "Format":"jpeg", "TimeStamp":1640849845, "sign":"", "t":0, "AccountId":"10000" }
字段 | 类型 | 说明 |
---|---|---|
action | String | 事件。
|
event_time | Int | 事件的时间,Unix 时间戳,单位为纳秒,例如,1650263223542095385 |
task_id | String | 创建的任务 ID |
dst | String | 推流地址 |
type | Int | 视频来源类型。
|
cycle_mode | Int | 点播文件的循环方式。 |
event_type | String | 事件名,live_pull_to_push 表示拉流转推事件 |
src | String | 视频来源的地址。
|
play_progress | Float | 当前点播素材的播放时长,单位为秒,保留 2 位小数。该字段仅在视频来源为点播时(Type=1)返回。 |
{ "action":"vod_start", "event_time":1650263223542095385, "task_id":"5f4c37605b7d711b51e28d73fa60****", "dst":"rtmp://push.example.com/live/teststream", "type":1, "cycle_mode":-1, "event_type": "live_pull_to_push", "src":"http://pull.example.com/live/test.m3u8", "play_progress":1.05 }
字段 | 类型 | 说明 |
---|---|---|
vhost | String | 域名空间名称 |
Domain | String | 推流域名 |
App | String | 应用名称 |
Stream | String | 流名称 |
EventType | String | 事件类型,默认为 scan_screenshoot_event ,表示截图审核事件 |
sign | String | 公共安全签名参数 |
t | String | 公共安全签名参数 |
EventData | EventData | 事件详情 |
EventTime | String | 事件产生时间,RFC3339 格式的 UTC 时间。单位为 s |
EventId | String | 事件 ID,用于事件去重 |
参数名 | 类型 | 描述 |
---|---|---|
MediaType | Int | 可能违规的内容类型。截图审核的默认取值为 1,表示直播截图。 |
Image | String | 审核截图保存的 uri,根据您配置的审核规则,返回截图在 TOS、veImageX 中的存储路径 |
HitLabels | Array of String | 截图的违规原因。支持以下取值。
|
RiskHit | Array of Risk | 命中的违规列表 |
RiskALL | Array of Risk | 已配置的所有模型列表 |
Decision | String | 根据违规命中情况,给出的操作建议。支持的取值与含义如下所示。
|
AIResultOrigin | String | 审核平台返回的响应原数据。 |
参数名 | 类型 | 描述 |
---|---|---|
Label | String | 截图命中的违规类型标签。支持以下取值。
|
Sublabel | String | 截图命中的违规子类型标签。 |
Decision | String | 根据违规命中情况,给出的操作建议。支持的取值与含义如下所示。
|
{ "Vhost": "push.example.com", "Domain": "push.example.com", "App": "live", "Stream": "stream1", "EventType": "scan_screenshoot_event", "sign":"", "t":0, "EventData": { "MediaType": 1, "Image": "/liveexample/tob****01/stream**/1659079720209.jpg", "HitLabels": [ "301" ], "RiskHit": [ { "Label": "301", "SubLabel": "301001", "Decision": "BLOCK" }, { "Label": "301", "SubLabel": "301002", "Decision": "BLOCK" } ], "RiskALL": [ { "Label": "301", "SubLabel": "301001", "Decision": "BLOCK" }, { "Label": "301", "SubLabel": "301002", "Decision": "BLOCK" } ], "Decision": "BLOCK", "AIResultOrigin": "{\"RequestId\":\"202207291528410102091561590F291DAA\",\"Code\":0,\"Message\":\"success\",\"Data\":{\"DataId\":\"7125691570795811116\",\"Decision\":\"BLOCK\",\"Results\":[{\"Label\":\"301\",\"SubLabel\":\"301001\",\"Decision\":\"BLOCK\",\"score\":0,\"Detail\":null,\"Frames\":null},{\"Label\":\"301\",\"SubLabel\":\"301002\",\"Decision\":\"BLOCK\",\"score\":0,\"Detail\":null,\"Frames\":null}],\"Scores\":null}}" }, "EventTime": "2022-07-29T15:28:40+08:00", "EventId": "71256915707958766**", "CallbackURL": [ "http://example.com/callback/scan_screenshoot" ] }
字段 | 类型 | 说明 |
---|---|---|
vhost | String | 域名空间名称。 |
app | String | 应用名称。 |
stream | String | 流名称。 |
event_type | String | 事件名,record_ts 表示拉流录制任务状态回调。 |
record_status | String | 事件名:
|
task_id | String | 任务 ID。 |
tos_bucket | Object | 保存在对象存储中时的详细信息,见下表。 |
vod_namespace | Object | 保存到视频点播中时的详细信息,见下表。 |
service_id | String | 截图存储在 veImageX 时,veImageX 的服务 ID。 |
time | Int | 回调时间,单位为 s。 |
time_ms | Int | 回调时间,单位为 ms。 |
msg | String | 录制状态回调消息,当 RecordStatus 为 record_stop 时,回调消息:
|
字段 | 类型 | 说明 |
---|---|---|
flv | String | FLV 录制的 bucket ,设置为空时不展示。 |
hls | String | HLS 录制的 bucket ,设置为空时不展示。 |
mp4 | String | MP4 录制的 bucket ,设置为空时不展示。 |
字段 | 类型 | 说明 |
---|---|---|
flv | String | FLV 录制的 namespace ,设置为空时不展示。 |
hls | String | HLS 录制的 namespace ,设置为空时不展示。 |
mp4 | String | MP4 录制的 namespace ,设置为空时不展示。 |
回调示例如下所示。
{ "code":0, "message":"ok", "data":{ "vhost":"push.example.com", "app":"live", "stream":"livestream001", "event_type":"record_ts", "detail":{ "record_status":"record_started", "task_id":"f831f3b0********1aa4dcf7621", "tos_bucket":{ "hls":"live-****-test1" }, "vod_namespace":{ // 点播空间内容为空 }, "time":1688717767, "time_ms":1688717767506, "msg":"" } } }
{ "code":0, "message":"ok", "data":{ "vhost":"live.example.push.com", "app":"live", "stream":"livestream001", "event_type":"record_ts", "detail":{ "record_status":"record_stop", "task_id":"f831f3b0********1aa4dcf7621", "tos_bucket":{ // 对象存储信息为空 }, "vod_namespace":{ "hls":"live**tt" }, "time":1688717870, "time_ms":1688717870948, "msg":"CreateRelaySourceError" } } }
常见的断流原因如下所示,如您获取的断流原因不在下表或您无法判断处理方法,请创建工单联系技术支持进行处理。
errmsg | 说明 |
---|---|
func:HandleInputPacket:net:func:Input:rtmp:FLV Signature don't match | FLV 协议解析失败导致推流断开。 |
func:HandleInputPacket:net:func:Input:rtmp:close stream id 0 don't match 1 | RTMP 协议不兼容导致推流断开。 |
func:conn.Read:net:local error: tls: bad record MAC | TLS 协议失败导致推流断开。 |
func:timeout:idle_too_long | 推流端长时间没有数据传输导致超时断开。 |
io:conn_reset_by_peer | 推流端非通过正常停止直播操作导致的推流断开,如网络中断、直接关闭推流软件等。 |
func:conn.Read:net:read_i/o_timeout | 视频直播中心数据 I/O 错误导致的推流断开。 |
param:Priority:priority | 被高优先级流推流导致的低优先级流推流断开。 |
auth:JudgePublishAuth:timeout:invalid_sign | URL 鉴权参数字段无效、鉴权超时等原因导致推流断开。 |
func:OnStatus:func:RtmpStatusCode2NssError:not_allowed | 直播流被禁用导致的推流断开 |
func:OnStatus:func:RtmpStatusCode2NssError:api_close | 调用 KillStream 接口流断开直播。 |
func:sendEvent:param:receiver:not_running | 视频直播中心内部错误,请联系技术支持。 |
auth:remote_auth:not_allowed | 远程鉴权失败导致推流断开。 |
func:conn.Read:eof | 复杂原因导致的推流断开,请联系技术支持。 |
func:OnStop:eof | 推流端通过停止直播功能正常结束推流。 |
func:conn.Read:net:The socket was properly connected, but the connection has been broken | 网络异常导致推流断开。 |
func:OnStatus:func:RtmpStatusCode2NssError:duplicate | 使用相同流名称进行推流导致推流断开。 |