本文为您介绍直播推/拉流地址的生成方式及适用场景。
使用场景
- 手动拼接:适合业务批量生成推/拉流地址,使用视频直播提供的规则,无需调用接口,即可使用直播服务;
- 地址生成器生成:适合生成单个直播流,无需代码基础,直接页面操作即可;
- 使用 API 生成:适合于在应用程序中集成直播功能实现自动生成直播地址的场景。
背景信息
直播地址信息说明
直播地址通常由 Domain、AppName 和 StreamName 组成。如果您开启了 URL 鉴权,还包含鉴权信息。
直播地址参数说明如下表所示。
参数 | 说明 |
---|
Domain | 已添加的域名,生成推流地址时使用推流域名,生成拉流地址时使用拉流域名。 |
AppName | 直播流的 AppName 标识,拉取指定推流时,推拉流地址的 AppName 需一致。 |
StreamName | 直播流的 StreamName 标识,拉取制定推流时,推拉流地址的 StreamName 需一致。 说明 转码流的 StreamName 由 源流 StreamName _Suffix 构成,其中 Suffix 为您转码配置中的转码后缀。 |
鉴权信息 | 参考鉴权信息组成说明了解 URL 鉴权组成并拼接鉴权信息。 |
直播地址组成规则
不同的传输协议对应不同的地址格式,其组成规则如下:
鉴权信息组成说明
在直播推流和拉流地址中,鉴权信息由 volcTime
和 volcSecret
两个 URL 参数组成。
- volcTime = {UnixTime}
- volcSecret = MD5("/{AppName}/{StreamName}{SecretKey}{volcTime}")
鉴权信息参数说明如下表所示。
参数 | 说明 |
---|
UnixTime | 推拉流地址过期时间的 Unix 时间戳,单位为秒,过期后无法使用地址发起新的请求,进行中的请求不受影响。例如 2022-05-27 14:20:22 的 Unix 时间为 1653632422 。 |
AppName | 直播流地址的 AppName 标识,例如 live 。 |
StreamName | 直播流地址的 StreamName 标识,例如 livestream 。 |
SecretKey | 鉴权密钥,您可以使用视频直播控制台在为域名开启 URL 鉴权时自定义或由系统自动生成鉴权密钥,如 A1B2C3d4e5f6 。 |
地址示例
使用上表中鉴权参数示例值拼接鉴权信息,volcSecret
值为 md5("/live/livestreamA1B2C3d4e5f61653632422")
即volcSecret=e5bb77201cbaa2f9ccdd316fcda4c212
。
则当前推流域名为 push.example.com
时,包含鉴权的 RTMP 推流地址如下所示。
rtmp://push.example.com/live/livestream?volcTime=1653632422&volcSecret=e5bb77201cbaa2f9ccdd316fcda4c212
前提条件
方法一:手动拼接
根据直播地址组成规则,您可以:
方法二:通过地址生成器生成
登录视频直播控制台,左侧导航栏选择直播工具 > 地址生成器,或直接进入地址生成器。
根据页面提示选择地址类型和域名,并填写自定义的 AppName、自定义的 StreamName 和过期时间。
单击生成地址。
在生成结果区域获取新生成的推/拉流地址,如下图所示。您可:
- 单击前往在线拉流按钮在新页面中进行在线拉流。
- 单击复制按钮复制地址。
- 保存二维码图片。
(可选)您可单击页面右上角历史记录按钮查看近期生成的地址记录。
方法三:调用 API 生成
- (可选)调用添加或更新推拉流鉴权接口,为域名开启并配置鉴权密钥。
- 调用生成推流地址接口生成推流地址。
- 调用生成拉流地址接口生成拉流地址。
地址生成代码示例
本节为您提供基于 Go、Python、Java、PHP 语言生成带鉴权的 RTMP 推流地址的原生代码示例。您可以根据地址拼接规则,自行实现其他协议地址的生成。
package main
import (
"crypto/md5"
"fmt"
)
func main() {
fmt.Println(GenAuthUrl("testDomain", "testApp", "testStream", "testsecretKey", 1636963457))
}
func GenAuthUrl(domain, app, stream, secretKey string, volcTime int64) string {
src := fmt.Sprintf("/%s/%s%s%d", app, stream, secretKey, volcTime)
sign := fmt.Sprintf("%x", md5.Sum([]byte(src)))
return fmt.Sprintf("rtmp://%s/%s/%s?volcTime=%d&volcSecret=%s", domain, app, stream, volcTime, sign)
}
import hashlib
def GenAuthUrl(domain, app, stream, secretKey, volcTime):
src = "/%s/%s%s%d" % (app, stream, secretKey, volcTime)
sign = hashlib.md5(src.encode("utf8")).hexdigest()
return "rtmp://%s/%s/%s?volcTime=%d&volcSecret=%s" % (domain, app, stream, volcTime, sign)
if __name__ == '__main__':
print(GenAuthUrl("testDomain", "testApp", "testStream", "testsecretKey", 1636963457))
package demo;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Demo1 {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println((GenAuthUrl("testDomain", "testApp", "testStream", "testsecretKey", 1636963457)));
}
public static String GenAuthUrl(String domain, String app, String stream, String secretKey, int volcTime) throws NoSuchAlgorithmException {
String src = String.format("/%s/%s%s%d", app, stream, secretsecretKey, volcTime);
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md5.digest(src.getBytes(StandardCharsets.UTF_8));
String sign = "";
for (int i = 0; i < md5Bytes.length; i++) {
sign += Integer.toHexString(md5Bytes[i] | 0xFFFFFF00).substring(6);
}
return String.format("rtmp://%s/%s/%s?volcTime=%d&volcSecret=%s", domain, app, stream, volcTime, sign);
}
}
<?php
function GenAuthUrl($domain, $app, $stream, $secretKey, $volcTime){
$src = sprintf("/%s/%s%s%d", $app, $stream, $secretKey, $volcTime);
$sign = sprintf("%s",md5($src));
return sprintf("rtmp://%s/%s/%s?volcTime=%d&volcSecret=%s",$domain, $app, $stream, $volcTime, $sign);
}
echo GenAuthUrl("testDomain", "testApp", "testStream", "testsecretKey", 1636963457);