有奖捉虫:云通信与企业服务文档专题,速来> HOT
为了保护直播推流的信息安全,云直播推流域名默认开启推流鉴权。您可通过推流地址详情页中的推流地址生成器,在线生成对应的推流地址。通过使用推流地址在线推流,实现直播流传输到云直播服务,即实现直播视频上传。

注意事项

云直播默认提供测试域名 xxxx.tlivepush.com,您可通过该域名进行推流测试,但不建议您在正式业务中使用这个域名作为推流域名。
生成的推流地址在设定的过期时间内均可使用,过期后需要重新生成新的推流地址。

前提条件

已开通云直播服务,并完成实名认证。

鉴权配置

1. 进入域名管理,单击需配置的推流域名管理进入域名详情页。


2. 单击推流配置 ,查看鉴权配置标签,单击右侧的编辑


3. 进入推流鉴权配置页,单击

按钮选择开启/关闭推流鉴权。
4. 修改主 KEY 和备 KEY 信息,单击保存即可成功生效。


说明
主 KEY 为必填、备 KEY 为选填,主备 KEY 可实现当 KEY 泄露时平滑更换 KEY 不影响业务。

推流地址生成器

操作步骤

1. 进入 域名管理 选择需配置的推流域名或单击管理,进入域名详情页。


2. 选择推流配置 > 推流地址生成器 ,进行如下配置:
2.1 您需要选择一种加密类型,请根据您的安全需求和性能考虑进行权衡。加密类型可以选择 MD5 或 SHA256 ,默认 MD5 。
2.2 填写自定义的流名称 StreamName,例如:livetest。
2.3 选择过期时间,例如:2023-12-30 11:47:43
2.4 单击生成推流地址即可生成带着 StreamName 的推流地址。


3. 若您的推流域名未开启推流鉴权,您还可以在推流配置 > 推流地址解析 标签下,查看该推流域名下 RTMP、WebRTC、SRT和RTMP over SRT 这四种推流地址。替换播放地址中的 StreamName(流名称)关联推流地址,关联后即可通过播放地址查看直播画面。



推流地址说明

RTMP 推流地址格式为:
rtmp://domain/AppName/StreamName?txSecret=Md5(key+StreamName+hex(time))&txTime=hex(time)
其中:
domain:直播推流域名。
AppName:直播的应用名称,默认为 live,可自定义。
StreamName:流名称,用户自定义,用于标识直播流。
txSecret:开启推流鉴权后生成的鉴权串。
txTime:推流地址设置的时间戳,是控制台推流地址的有效时间。
注意
若您开启了域名鉴权,txTime 即有效时间。
控制台为了方便使用,设置的时间即为实际过期时间。若您开启了域名鉴权,计算推流地址时会按照公式倒推出 txTime
在过期时间前进行了推拉流,只要推拉流正常没有断开或停止,即使过期时间到了也能正常保持推拉流状态。

推流地址示例代码

腾讯云为您提供的 PHP、Java 和 Go 语言的推流地址示例代码,您可直接参考示例代码完成推流地址的接入。具体查看操作如下:
1. 进入 域名管理
2. 选择推流域名或单击右侧的管理 ,进入域名详情页。



3. 选择推流配置 ,下拉到底查看推流地址示例代码标签。
4. 单击切换标签按钮查看 PHP、Java、Go 示例代码,如下所示:
PHP
Java
GO
/**
* 获取推流地址
* 如果不传key和过期时间,将返回不含防盗链的url
* @param domain 您用来推流的域名
* streamName 您用来区别不同推流地址的唯一流名称
* key 安全密钥
* time 过期时间 sample 2016-11-12 12:00:00
* @return String url
*/
function getPushUrl($domain, $streamName, $key = null, $time = null){
if($key && $time){
$txTime = strtoupper(base_convert(strtotime($time),10,16));
//txSecret = MD5( KEY + streamName + txTime )
$txSecret = md5($key.$streamName.$txTime);
$ext_str = "?".http_build_query(array(
"txSecret"=> $txSecret,
"txTime"=> $txTime
));
}
return "rtmp://".$domain."/live/".$streamName . (isset($ext_str) ? $ext_str : "");
}

echo getPushUrl("123.test.com","123456","69e0daf7234b01f257a7adb9f807ae9f","2016-09-11 20:08:07");

package com.test;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Test {

public static void main(String[] args) {
System.out.println(getSafeUrl("txrtmp", "11212122", 1469762325L));
}

private static final char[] DIGITS_LOWER =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

/*
* KEY+ streamName + txTime
*/
private static String getSafeUrl(String key, String streamName, long txTime) {
String input = new StringBuilder().
append(key).
append(streamName).
append(Long.toHexString(txTime).toUpperCase()).toString();

String txSecret = null;
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
txSecret = byteArrayToHexString(
messageDigest.digest(input.getBytes("UTF-8")));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

return txSecret == null ? "" :
new StringBuilder().
append("txSecret=").
append(txSecret).
append("&").
append("txTime=").
append(Long.toHexString(txTime).toUpperCase()).
toString();
}

private static String byteArrayToHexString(byte[] data) {
char[] out = new char[data.length << 1];

for (int i = 0, j = 0; i < data.length; i++) {
out[j++] = DIGITS_LOWER[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS_LOWER[0x0F & data[i]];
}
return new String(out);
}
}

package a

import (
"crypto/md5"
"fmt"
"strconv"
"strings"
"time"
)

func GetPushUrl(domain, streamName, key string, time int64)(addrstr string){
var ext_str string
if key != "" && time != 0{
txTime := strings.ToUpper(strconv.FormatInt(time, 16))
txSecret := md5.Sum([]byte(key + streamName + txTime))
txSecretStr := fmt.Sprintf("%x", txSecret)
ext_str = "?txSecret=" + txSecretStr + "&txTime=" + txTime
}
addrstr = "rtmp://" + domain + "/live/" + streamName + ext_str
return
}
/*
*domain: 123.test.com
*streamName: streamname
*key: 69e0daf7234b01f257a7adb9f807ae9f
*time: 2022-04-26 14:57:19 CST
*/
func main(){
domain, streamName, key := "123.test.com", "streamname", "69e0daf7234b01f257a7adb9f807ae9f"
//CST: ChinaStandardTimeUT, "2006-01-02 15:04:05 MST" must be const
t, err := time.Parse("2006-01-02 15:04:05 MST", "2022-04-26 14:57:19 CST")
if err != nil{
fmt.Println("time transfor error!")
return
}
fmt.Println(GetPushUrl(domain, streamName, key, t.Unix()))
return
}

后续操作

生成推流地址后,可根据业务场景使用直播推流,具体操作请参见 直播推流