外观
视频地址
接口说明
获取站点(或指定设备)下的摄像机视频流地址。
返回每条视频记录的 hlsUrl 即可直接播放的视频流地址。
视频流地址既可能是 HLS 也可能是 FLV
实测同一账号下不同品牌的摄像机返回不同格式:
hlsUrl 实际取值 | 设备类型 | 格式 |
|---|---|---|
https://gbs.auto-control.com.cn/proxy/sms/local/live/xxx.flv?expired=… | V008 GBS | FLV |
http://hls.open.ys7.com/openlive/xxx.hd.m3u8 | 萤石云 | HLS |
字段名虽然叫 hlsUrl,但它不保证是 HLS。 播放前请按 URL 后缀(.m3u8 / .flv)选择对应的播放器:
.m3u8→hls.js+<video>.flv→flv.js+<video>
并请在代码里同时处理两种格式,不要假定一定是 HLS。
请求地址
text
GET https://yunshangwenshi.auto-control.com.cn/api/video-data/list1
请求方法
GET
请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
stationId | Int | 否 | 站点 ID;不传则返回账号下全部视频地址 | 5820 |
deviceId | Int | 否 | 设备 ID;不填则返回该站点下所有视频地址 | 9695 |
pageNumber | Int | 否 | 页码 | 1 |
pageSize | Int | 否 | 每页数量 | 20 |
stationId 实测不是必填
不传 stationId 时会返回账号下的全部视频地址(实测返回了不同站点下的摄像机)。
stationId 会带出子站点的摄像机
实测传一个父站点的 ID,返回结果里包含了子站点下的摄像机。 如果需要精确到某个站点,请结合返回体里的 stationId / stationName 自行过滤。
请求头
| 请求头 | 值 | 必填 |
|---|---|---|
Authorization | Bearer <token> | 是 |
返回字段
分页对象
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
data | Array | 视频记录数组 | [ {...} ] |
pageNumber | Int | 当前页码 | 1 |
pageSize | Int | 每页数量 | 5 |
totalCount | Int | 总记录数 | 2 |
视频记录(data.data[])
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
id | Int | 记录 ID | 4266 |
deviceId | Int | 设备 ID | 9695 |
deviceCode | String | 设备编码 | 34020000001320000015 |
deviceName | String | 设备名称 | 摄像机#1 |
deviceTypeId | String | 设备类型编码 | V008 |
deviceTypeName | String | 设备类型名称 | 网络摄像机 |
stationId | Int | 所属站点 ID | 5820 |
stationName | String | 所属站点名称 | 海康摄像测试 |
customerId | Long | 所属客户 ID | 1667372262 |
createDate | String | 创建时间 | 2022-11-02 14:57:43 |
modifiedDate | String | 修改时间 | 2024-06-02 16:05:01 |
sortOrder | Int | 排序权重 | 1 |
name | String | 自定义名称,可能为空串 | "" |
channel | Int | 通道号 | 1 |
hlsUrl | String | 视频流地址(HLS 或 FLV,见上方说明) | https://gbs…flv?expired=… |
rtmpUrl | String | RTMP 流地址,实测为空串 | "" |
poster | String | 封面图 URL(带签名,会过期) | http://iot-pictures.oss-… |
hasPtz | Boolean | 是否支持云台(PTZ)控制 | true |
primary | Boolean | 是否主码流 | true |
online | Boolean | 摄像机是否在线 | false |
description | String | 描述 | "" |
请求示例
curl
bash
# 指定站点
curl 'https://yunshangwenshi.auto-control.com.cn/api/video-data/list?pageNumber=1&pageSize=5&stationId=5820' \
-H "Authorization: Bearer <token>"
# 全部视频
curl 'https://yunshangwenshi.auto-control.com.cn/api/video-data/list?pageNumber=1&pageSize=5' \
-H "Authorization: Bearer <token>"1
2
3
4
5
6
7
2
3
4
5
6
7
HTTP 报文
http
GET /api/video-data/list?pageNumber=1&pageSize=5&stationId=5820 HTTP/1.1
Host: yunshangwenshi.auto-control.com.cn
Authorization: Bearer <token>
Accept: application/json1
2
3
4
2
3
4
Python
python
import requests
BIZ_HOST = "https://yunshangwenshi.auto-control.com.cn"
def list_videos(token: str, station_id: int | None = None, device_id: int | None = None,
page: int = 1, size: int = 20):
"""获取视频流地址。station_id 不传则返回全部。"""
params = {"pageNumber": page, "pageSize": size}
if station_id is not None:
params["stationId"] = station_id
if device_id is not None:
params["deviceId"] = device_id
resp = requests.get(
f"{BIZ_HOST}/api/video-data/list",
params=params,
headers={"Authorization": f"Bearer {token}"},
timeout=20,
)
body = resp.json()
if body.get("code") != 200:
raise RuntimeError(f"查询失败: {body.get('code')} {body.get('message')}")
return body["data"]
def player_for(url: str) -> str:
"""按 URL 后缀选择播放器。"""
clean = url.split("?")[0].lower()
if clean.endswith(".m3u8"):
return "hls.js"
if clean.endswith(".flv"):
return "flv.js"
return "未知格式,请检查后端返回"
if __name__ == "__main__":
page = list_videos("<你的 token>", station_id=5820)
print(f"共 {page['totalCount']} 路视频")
for v in page["data"]:
state = "在线" if v["online"] else "离线"
print(f'{v["deviceName"]}({state}) 播放器={player_for(v["hlsUrl"])}')
print(f' {v["hlsUrl"]}')1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
返回示例
json
{
"requestId": "ef06c2e6-447d-45ae-843a-2ec8a7b494e9",
"code": 200,
"data": {
"data": [
{
"id": 4266,
"customerId": 1667372262,
"createDate": "2022-11-02 14:57:43",
"modifiedDate": "2024-06-02 16:05:01",
"deviceId": 9695,
"deviceCode": "34020000001320000015",
"deviceName": "摄像机#1",
"deviceTypeId": "V008",
"deviceTypeName": "网络摄像机",
"stationId": 5820,
"stationName": "海康摄像测试",
"sortOrder": 1,
"name": "",
"channel": 1,
"rtmpUrl": "",
"hlsUrl": "https://gbs.auto-control.com.cn/proxy/sms/local/live/34020000001320000015_34020000001320000015.flv?expired=20251030144809",
"hasPtz": true,
"poster": "http://iot-pictures.oss-cn-beijing.aliyuncs.com/202406/L36548075/30264319108ce39963769c38c2d65f0b.jpg?Expires=1789552727&OSSAccessKeyId=LTAI5t…&Signature=BIRciZaHJaenmtrhPsfHAx4bq2c%3D",
"description": "",
"primary": true,
"online": false
}
],
"pageNumber": 1,
"pageSize": 5,
"totalCount": 2
},
"timestamp": 1789466325,
"success": true
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
注意事项
视频流地址有时效,不要落库长期使用
hlsUrl 上的 expired 参数是到期时间,且格式为 yyyyMMddHHmmss (例如 expired=20251030144809 → 2025-10-30 14:48:09)。
正确用法:每次要播放时调用本接口重新获取,而不是存库或长期缓存。
先用 online 判断再播放
online 为 false 时摄像机不在线,播放会失败。 建议在 UI 上把离线的摄像机置灰,避免无谓的播放尝试。
poster 是带签名的临时链接
带 Expires 与 Signature,会过期,请勿长期缓存。
关于云台(PTZ)控制
hasPtz 表示摄像机是否支持云台转动,但平台未提供 PTZ 控制接口。 如需远程控制云台,请与运营方确认。