你需要根据声网的规则拼接得到直播推流和播流的 URL。本文介绍直播流 URL 的拼接规则。
因为 URL 中可能包含鉴权信息,声网建议在你的业务服务器上实现 URL 拼接,使用流程如下:
推流 URL 由四部分组成,如下图的示例 URL 所示:
各部分说明:
URL分段 | 是否必须 | 描述 |
---|---|---|
域名 | 是 | 推流使用的域名,必须已备案且 CNAME 配置成功。 |
发布点 | 是 | 默认发布点为 live,每个发布点都有一套直播流相关的配置。 |
流名 | 是 | 直播流名称,用于标识一路直播流,请确保直播流名称唯一。 |
鉴权字符串 | 否 | 如果没有设置直播流鉴权,则 URL 地址中无需 "?" 及后面的内容。 鉴权字符串由以下参数组成:
为保障安全性,声网强烈建议你在 URL 中使用鉴权字符串。 |
播流 URL 的拼接规则和推流 URL 类似,但不同的播流协议对应的 URL 路径略有差异。
播放协议 | URL 路径 | URL 示例 |
---|---|---|
RTMP | /{entry-point}/{stream} | rtmp(s)://domain/live/stream?ts=1635004800&sign=95b0a9970c593819 |
HTTP-FLV | /{entry-point}/{stream}.flv | http(s)://domain/live/stream.flv?ts=1635004800&sign=337f185b6571cd42 |
HLS | /{entry-point}/{stream}/playlist.m3u8 | http(s)://domain/live/stream/playlist.m3u8?ts=1635004800&sign=a1d2d3bcce31c9fe |
播放协议 | URL 路径 | URL 示例 |
---|---|---|
RTMP | /{entry-point}/{stream}_{transcode} | rtmp(s)://domain/live/stream_hd?ts=1635004800&sign=95b0a9970c593819 |
HTTP-FLV | /{entry-point}/{stream}_{transcode}.flv | http(s)://domain/live/stream_hd.flv?ts=1635004800&sign=337f185b6571cd42 |
HLS | /{entry-point}/{stream}_{transcode}/playlist.m3u8 | http(s)://domain/live/stream_hd/playlist.m3u8?ts=1635004800&sign=a1d2d3bcce31c9fe |
本节介绍如何生成 URL 鉴权字符串。
防盗链密钥用于在业务服务器生成签名,以及在使用声网融合 CDN 直播服务时进行验证。
防盗链密钥为不超过 128 字节的字符串,你需要自行设置。每个推流域名和播流域名都可以分别设置防盗链密钥,详见直播流鉴权配置。
推流/播流 URL 中的 ts
参数决定了该 URL 的有效时间。
假设当前时间 2021-10-23 10:00:00,转换为 Unix 时间戳为 1634954400。如果我们期望 URL 的有效期为 10 分钟,即在 2021-10-23 10:10:00 前有效,转换为 Unix 时间戳为 1634955000,即 ts=1634955000。
URL 的有效期不宜设置太短或者太长,声网推荐设置在 5 到 10 分钟之内。
签名(sign)为防盗链密钥、推流/播流 URL 的路径、失效时间戳 ts 这三部分拼接后的字符串计算得到的 MD5 值。签名字符串中的字母必须为小写。
例如,假设 URL 为 http://domain/live/stream.flv
,防盗链密钥为 z2tn3uiny0aasebz
,ts
为 1634955000
,则 sign=MD5(z2tn3uiny0aasebz/live/stream.flv1634955000)=b6ceec4cf7c1bd88e911b72cf39e4715。
以下为用 Python3 代码计算防盗链字符串的示例:
#!/usr/bin/python3
import time
from urllib.parse import urlparse
import hashlib
key = 'test_key'
play_url_str = 'http://push.test.com/live/test.flv'
key_expire_time = 60*15
url = urlparse(play_url_str)
now = int(time.time()) + key_expire_time
sign = key + url.path + str(now)
md5 = hashlib.md5()
md5.update(sign.encode('utf-8'))
play_url_str += "?ts={}&sign={}".format(now, md5.hexdigest())
print(play_url_str)