tencent cloud

文档反馈

推流配置

最后更新时间:2023-10-07 11:55:56
    为了保护直播推流的信息安全,云直播推流域名默认开启推流鉴权。您可通过推流地址详情页中的推流地址生成器,在线生成对应的推流地址。通过使用推流地址在线推流,实现直播流传输到云直播服务,即实现直播视频上传。

    注意事项

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

    前提条件

    已开通云直播服务。

    鉴权配置

    1. 进入 域名管理,单击需配置的 推流域名 管理 进入域名详情页。
    2. 单击 推流配置 ,查看 鉴权配置 标签,单击右侧的 编辑
    
    
    3. 进入推流鉴权配置页,单击
    
    按钮选择开启/关闭推流鉴权。
    4. 修改主 KEY 和备 KEY 信息,单击 保存 即可成功生效。
    
    
    说明
    主 KEY 为必填、备 KEY 为选填,主备 KEY 可实现当 KEY 泄露时平滑更换 KEY 不影响业务。

    推流地址生成器

    操作步骤

    1. 进入 域名管理 选择需配置的推流域名或单击 管理 ,进入域名详情页。
    2. 选择 推流配置 > 推流地址生成器 ,进行如下配置:
    2.1 选择过期时间,例如:2022-11-24 16:00:35
    2.2 填写自定义的流名称 StreamName,例如:livetest
    2.3 单击 生成推流地址 即可生成带着 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
    }
    

    后续操作

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

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持