Live777 HTTP API
WHIP && WHEP
POST /whip/:streamId
Response: [201]
POST /whep/:streamId
Response: [201]
PATCH /session/:streamId/:sessionId
Response: [204]
DELETE /session/:streamId/:sessionId
Response: [204]
Stream
创建一个流
POST /api/streams/:streamId
streamId 需要唯一标识符
你可以使用此配置自动创建流
[strategy]
# WHIP auto a stream
auto_create_whip = true
# WHEP auto a stream
auto_create_whep = true你也可以按流覆盖 strategy 字段:
[stream.restricted]
[stream.restricted.strategy]
auto_create_whip = false
auto_create_whep = falseResponse: [204]
Get all Stream
GET /api/streams/
Response: [200]
id: String,streamIdcreatedAt: Int,timestamppublish:Object(PubSub), about publishersubscribe:Object(PubSub), about subscriber(publish | subscribe).leaveAt: Int,timestamp(publish | subscribe).sessions: Array,sessions(publish | subscribe).sessions.[].id: String,sessionId(publish | subscribe).sessions.[].createdAt: Int,timestamp(publish | subscribe).sessions.[].state: String, RTCPeerConnection/connectionState(publish | subscribe).sessions.[].cascade: Optional(Object(Cascade))(publish | subscribe).sessions.[].cascade.sourceUrl: Optional(String(URL))(publish | subscribe).sessions.[].cascade.targetUrl: Optional(String(URL))(publish | subscribe).sessions.[].cascade.sessionUrl: String(URL)(publish | subscribe).sessions.[].stats:Object(Stats),该会话的媒体统计:推流会话为输入方向,订阅会话为输出方向(publish | subscribe).sessions.[].stats.bytes: Int,累计字节数(RTP 线上大小:头部 + 扩展 + 负载)(publish | subscribe).sessions.[].stats.packets: Int,累计包数(publish | subscribe).sessions.[].stats.bitrate: Int,当前码率(比特/秒,每 2 秒采样一次)stats:Object,流级统计:stats.publish为输入(推流)合计,stats.subscribe为全部订阅输出合计;结构同为Stats,累计计数在重新推流和订阅者进出时保持单调递增statsScope: String,stats的范围;node表示单个 liveion 节点,clusterNodeWork表示 liveman 跨节点合并的节点工作量,级联链路会计入每个中继节点
例如:
[
{
"id": "push",
"createdAt": 1719326206862,
"publish": {
"leaveAt": 0,
"sessions": [
{
"id": "08c1f2a0a60b0deeb66ee572bd369f80",
"createdAt": 1719326206947,
"state": "connected"
}
]
},
"subscribe": {
"leaveAt": 1719326206862,
"sessions": []
}
},
{
"id": "pull",
"createdAt": 1719326203854,
"publish": {
"leaveAt": 0,
"sessions": [
{
"id": "41b2c52da4fb1eed5a3bff9a9a200d80",
"createdAt": 1719326205079,
"state": "connected",
"cascade": {
"sourceUrl": "http://localhost:7777/whep/web-0",
"sessionUrl": "http://localhost:7777/session/web-0/aabc02240abfc7f4800e8d9a6f087808"
}
}
]
},
"subscribe": {
"leaveAt": 1719326203854,
"sessions": []
}
},
{
"id": "web-0",
"createdAt": 1719326195910,
"publish": {
"leaveAt": 0,
"sessions": [
{
"id": "0dc47d8da8eb0a64fe40f461f47c2a36",
"createdAt": 1719326196264,
"state": "connected"
}
]
},
"subscribe": {
"leaveAt": 0,
"sessions": [
{
"id": "aabc02240abfc7f4800e8d9a6f087808",
"createdAt": 1719326204997,
"state": "connected"
},
{
"id": "dab1a9e88b2400cfd4bcfb4487588ef3",
"createdAt": 1719326206798,
"state": "connected",
"cascade": {
"targetUrl": "http://localhost:7777/whip/push",
"sessionUrl": "http://localhost:7777/session/push/08c1f2a0a60b0deeb66ee572bd369f80"
}
},
{
"id": "685beee8650b761116b581a4a87ca9b9",
"createdAt": 1719326228314,
"state": "connected"
}
]
}
}
]销毁一个流
DELETE /api/streams/:streamId
Response: [204]
配置文件中声明的流([stream.<name>])是预注册的,不能通过 API 删除或重复创建: 对这些流执行 DELETE 或重复的 POST 会返回 [409]。
流状态 SSE
GET /api/sse/streams
Server-Sent Events 端点,和管理接口使用同样的鉴权。
当流状态发生变化时,推送所有流的全量快照。每条 SSE 消息都是一个流对象的 JSON 数组:
[
{
"id": "streamId",
"publish": { ... },
"subscribe": { ... },
"reforward": { ... }
}
]连接建立后会立即发送第一条消息,之后每次状态变更都会再次推送当前完整状态;2 秒的统计采样周期在快照有变化时也会推送,因此有媒体流量时码率实时刷新,流静默时码率归零。
级联
POST /api/cascade/:streamId
Request:
{
"token": "",
"sourceUrl": "",
"targetUrl": "",
}token: Option, auth headersourceUrl:Option<WHEP url>. if has, use pull modetargetUrl:Option<WHIP url>. if has, use push modesourceUrlandtargetUrlat the same time can only one
录制
开始录制流
POST /api/record/:streamId
开始录制指定的流。流必须处于活跃状态(有发布者)才能开始录制。需要启用 recorder 特性。
请求体(可选):
{
"base_dir": "optional/path/prefix"
}base_dir(可选):覆盖默认的目录前缀。如果不设置,录制会使用/:streamId/:record_id/(10 位 Unix 时间戳)作为目录;当单次录制时长达到max_recording_seconds时,系统会自动以新的时间戳目录继续录制。
响应: [200]
{
"id": "camera01",
"record_id": "1718200000",
"record_dir": "camera01/1718200000",
"mpd_path": "camera01/1718200000/manifest.mpd"
}当输出路径末尾不是 10 位 Unix 时间戳(例如自定义 base_dir 未包含该段)时,record_id 会返回为空字符串。
录制状态
GET /api/record/:streamId
响应: [200]
{ "recording": true }停止录制
DELETE /api/record/:streamId
停止指定流的录制。成功时返回 [200],响应体为空。
参考: Recorder