发起一场直播需要生成一个推流地址用于主播的直播推流,和一个播流地址用于分发给观众进行播放。本文档介绍如何为阿里云视频直播服务生成带鉴权的推流地址和播流地址,以实现安全、可靠的直播流分发。
前提条件
在生成推/播流地址前,您需要完成推/播流域名的添加,并进行推/播流域名关联,详细操作请参见添加推流域名和播流域名。
每个域名可生成多个推流和播放地址,支持多场直播并发。推流域名的并发推流上限:北京、上海、深圳为300路,其他直播中心为50路,详情请参见使用限制。
生成规则
直播地址由协议、推流/播流域名、AppName 、StreamName和鉴权串组成。
直播地址参数说明如下表所示。
参数 | 说明 | 举例 |
协议 | 直播采用的播放协议 |
|
推流/播流域名 | 已添加的域名,生成推流地址时使用推流域名,生成播流地址时使用播流域名。 |
|
AppName | 直播的应用名称,由用户自定义,用于区分不同的直播应用或业务场景。 |
|
StreamName | 直播的流名称,由用户自定义,用于作为直播流的唯一标识。 |
|
鉴权串 | 是基于推/播流域名配置的鉴权 Key,通过 MD5 算法生成的加密字符串,用于保障直播安全,生成规则请参见推/播流地址鉴权。 |
|
地址生成
您可以根据需要选择以下任一方式生成推流和播流地址:
控制台生成:适用于初次体验和测试场景,一键生成,地址会自动附带加密的{鉴权串}。
代码拼接生成:适用于生产环境。在服务端实现地址生成的自动化,便于您对直播地址进行灵活的管理和分发。
控制台生成
进入直播地址生成器页面。
完成以下配置获取推流地址和播放地址,点击开始生成,即可获取推/播流地址。
说明直播地址生成器暂不支持生成实时字幕播放地址。
代码拼接生成
以下示例代码以RTMP协议为例,拼接出完整的直播地址,并且生成{鉴权串}。
运行示例时请做以下检查和调整:
在环境变量中设置阿里云AccessKey,详细请参见在Linux、macOS和Windows系统配置环境变量。
设置SDK调用
region,尽量保持region与使用服务一致。
Java
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.live20161101.AsyncClient;
import com.aliyun.sdk.service.live20161101.models.DescribeLiveDomainConfigsRequest;
import com.aliyun.sdk.service.live20161101.models.DescribeLiveDomainConfigsResponse;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import darabonba.core.client.ClientOverrideConfiguration;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class LiveUrlDemo {
/**
* 从阿里云获取直播域名的鉴权Key,该方法会调用阿里云DescribeLiveDomainConfigs接口,查询指定域名的URL鉴权配置,
* 并提取鉴权Key(auth_key1)返回。
* @param domain 推/播流域名,例如:example.aliyundoc.com
* @return 鉴权Key字符串
* @throws RuntimeException 当获取失败、域名不存在或未配置鉴权功能时抛出异常
*/
public static String getLiveKey(String domain) {
// 1. 配置访问凭证(从环境变量获取)
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
if (accessKeyId == null || accessKeySecret == null) {
throw new RuntimeException("请设置环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET");
}
StaticCredentialProvider provider = StaticCredentialProvider.create(
Credential.builder()
.accessKeyId(accessKeyId)
.accessKeySecret(accessKeySecret)
.build());
// 2. 创建阿里云客户端
AsyncClient client = AsyncClient.builder()
.region("cn-qingdao") // 根据实际区域修改,如:cn-hangzhou, cn-beijing等
.credentialsProvider(provider)
.overrideConfiguration(ClientOverrideConfiguration.create()
.setEndpointOverride("live.aliyuncs.com"))
.build();
try {
// 3. 调用API查询域名配置
DescribeLiveDomainConfigsResponse response = client
.describeLiveDomainConfigs(DescribeLiveDomainConfigsRequest.builder()
.domainName(domain)
.functionNames("aliauth") // 查询URL鉴权配置
.build())
.get();
// 4. 解析响应,提取鉴权Key
Gson gson = new Gson();
JsonObject rootObj = gson.fromJson(gson.toJson(response), JsonObject.class);
// 处理响应体(可能在body字段中)
if (rootObj.has("body")) {
rootObj = rootObj.getAsJsonObject("body");
}
// 获取域名配置列表
JsonObject domainConfigs = rootObj.getAsJsonObject("domainConfigs");
if (domainConfigs == null) {
throw new RuntimeException("域名 " + domain + " 未找到配置信息,请确认域名是否正确");
}
JsonArray domainConfigArray = domainConfigs.getAsJsonArray("domainConfig");
if (domainConfigArray == null || domainConfigArray.size() == 0) {
throw new RuntimeException("域名 " + domain + " 未配置URL鉴权功能,请在控制台开启");
}
// 遍历配置,查找aliauth功能
for (JsonElement element : domainConfigArray) {
JsonObject config = element.getAsJsonObject();
String functionName = getStringValue(config, "functionName");
if ("aliauth".equals(functionName)) {
// 提取FunctionArgs中的auth_key1
JsonObject functionArgs = config.getAsJsonObject("functionArgs");
if (functionArgs == null) {
throw new RuntimeException("域名 " + domain + " 的鉴权配置不完整");
}
JsonArray functionArgArray = functionArgs.getAsJsonArray("functionArg");
if (functionArgArray == null) {
throw new RuntimeException("域名 " + domain + " 的鉴权参数配置为空");
}
// 查找auth_key1参数
for (JsonElement argElement : functionArgArray) {
JsonObject arg = argElement.getAsJsonObject();
String argName = getStringValue(arg, "argName");
if ("auth_key1".equals(argName)) {
String key = getStringValue(arg, "argValue");
if (key == null || key.isEmpty()) {
throw new RuntimeException("域名 " + domain + " 的鉴权Key为空");
}
return key;
}
}
throw new RuntimeException("域名 " + domain + " 未找到auth_key1配置");
}
}
throw new RuntimeException("域名 " + domain + " 未开启URL鉴权功能");
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException("获取鉴权Key失败: " + e.getMessage(), e);
} finally {
client.close();
}
}
/**
* 安全获取JSON对象中的字符串值
* @param obj JSON对象
* @param key 键名
* @return 字符串值,如果不存在或为null则返回null
*/
private static String getStringValue(JsonObject obj, String key) {
if (!obj.has(key) || obj.get(key).isJsonNull()) {
return null;
}
return obj.get(key).getAsString();
}
/**
* 生成带鉴权的直播推流/播流地址
* <p>
* 根据阿里云URL鉴权算法生成带鉴权参数的RTMP地址。
* 如果未开启鉴权功能(key为空),则返回不带鉴权参数的原始地址。
* @param domain 推/播流域名,例如:example.aliyundoc.com
* @param appName 应用名称(AppName),不超过256字符,支持数字、大小写字母、短划线(-)、下划线(_)、等号(=)
* @param streamName 流名称(StreamName),不超过256字符,支持数字、大小写字母、短划线(-)、下划线(_)、等号(=)
* @param key 鉴权Key,可通过{@link #getLiveKey(String)}获取。如果未开启鉴权功能,传入null或空字符串
* @param exp 过期时间,UNIX时间戳(秒)。最终失效时间 = exp + 域名URL鉴权有效时长
* @return 带鉴权的完整直播地址,格式:rtmp://domain/appName/streamName?auth_key=exp-rand-uid-hash
*/
public static String generateLiveUrl(String domain, String appName, String streamName, String key, long exp) {
// 构建RTMP URI
String uri = String.format("rtmp://%s/%s/%s", domain, appName, streamName);
// 如果未开启鉴权功能,直接返回原始地址
if (key == null || key.isEmpty()) {
return uri;
}
// 生成鉴权参数
String rand = "0"; // 随机数,默认为"0",可根据需要修改
String uid = "0"; // 用户ID,默认为"0",可根据需要修改
// 构建待签名字符串:uri-exp-rand-uid-key
String signString = String.format("%s-%s-%s-%s-%s", uri, exp, rand, uid, key);
// MD5加密
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5算法不可用", e);
}
md5.update(StandardCharsets.UTF_8.encode(signString));
String hashValue = String.format("%032x", new BigInteger(1, md5.digest()));
// 生成鉴权参数:exp-rand-uid-hash
String authKey = String.format("%s-%s-%s-%s", exp, rand, uid, hashValue);
// 拼接完整地址
return String.format("%s?auth_key=%s", uri, authKey);
}
/**
* 使用示例:获取鉴权Key并生成带鉴权的直播地址
*/
public static void main(String[] args) {
try {
// 1. 配置参数
String domain = "example.aliyundoc.com"; // 推/播流域名
String appName = "liveApp"; // 应用名称
String streamName = "liveStream"; // 流名称
// 2. 获取鉴权Key(如果未开启鉴权功能,可跳过此步骤,key设为null)
String key = getLiveKey(domain);
System.out.println("鉴权Key: " + key);
// 3. 设置过期时间(当前时间 + 3600秒,即1小时后过期)
long exp = System.currentTimeMillis() / 1000 + 3600;
// 4. 生成带鉴权的直播地址
String authUrl = generateLiveUrl(domain, appName, streamName, key, exp);
System.out.println("直播地址: " + authUrl);
} catch (Exception e) {
System.err.println("生成直播地址失败: " + e.getMessage());
e.printStackTrace();
}
}
}Python
# -*- coding: utf-8 -*-
"""
阿里云直播推流/播流地址生成工具
功能:获取鉴权Key并生成带鉴权的RTMP地址
"""
import os
import hashlib
import time
from alibabacloud_live20161101.client import Client as live20161101Client
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_live20161101 import models as live_20161101_models
from alibabacloud_tea_util import models as util_models
def _create_client():
"""
创建阿里云直播客户端
@return: live20161101Client实例
"""
# 使用凭据客户端(从环境变量或配置文件自动读取)
# 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378659.html
credential = CredentialClient()
config = open_api_models.Config(credential=credential)
config.endpoint = f'live.aliyuncs.com'
return live20161101Client(config)
def get_live_key(domain):
"""
从阿里云获取直播域名的鉴权Key
@param domain: 推/播流域名,例如:example.aliyundoc.com
@return: 鉴权Key字符串
@raise: Exception 当获取失败、域名不存在或未配置鉴权功能时抛出异常
"""
try:
client = _create_client()
request = live_20161101_models.DescribeLiveDomainConfigsRequest(
domain_name=domain,
function_names='aliauth'
)
runtime = util_models.RuntimeOptions()
response = client.describe_live_domain_configs_with_options(request, runtime)
body = response.body
domain_configs = body.domain_configs
if not domain_configs or not domain_configs.domain_config:
raise Exception(f"域名 {domain} 未配置URL鉴权功能,请在控制台开启")
for config in domain_configs.domain_config:
if config.function_name == 'aliauth':
function_args = config.function_args
if not function_args or not function_args.function_arg:
raise Exception(f"域名 {domain} 的鉴权参数配置为空")
for arg in function_args.function_arg:
if arg.arg_name == 'auth_key1':
key = arg.arg_value
if not key:
raise Exception(f"域名 {domain} 的鉴权Key为空")
return key
raise Exception(f"域名 {domain} 未找到auth_key1配置")
raise Exception(f"域名 {domain} 未开启URL鉴权功能")
except Exception as e:
error_msg = str(e)
if hasattr(e, 'message'):
error_msg = e.message
if hasattr(e, 'data') and hasattr(e.data, 'get'):
recommend = e.data.get("Recommend")
if recommend:
error_msg += f" 诊断地址: {recommend}"
raise Exception(f"获取鉴权Key失败: {error_msg}")
def generate_live_url(domain, app_name, stream_name, key, exp):
"""
生成带鉴权的直播推流/播流地址
根据阿里云URL鉴权算法生成带鉴权参数的RTMP地址。
如果未开启鉴权功能(key为空),则返回不带鉴权参数的原始地址。
@param domain: 推/播流域名,例如:example.aliyundoc.com
@param app_name: 应用名称(AppName),不超过256字符
@param stream_name: 流名称(StreamName),不超过256字符
@param key: 鉴权Key,可通过get_live_key()获取。如果未开启鉴权功能,传入None或空字符串
@param exp: 过期时间,UNIX时间戳(秒)。最终失效时间 = exp + 域名URL鉴权有效时长
@return: 带鉴权的完整直播地址,格式:rtmp://domain/appName/streamName?auth_key=exp-rand-uid-hash
"""
uri = f"rtmp://{domain}/{app_name}/{stream_name}"
if not key:
return uri
rand = "0" # 随机数,默认为"0",可根据需要修改
uid = "0" # 用户ID,默认为"0",可根据需要修改
sign_string = f"{uri}-{exp}-{rand}-{uid}-{key}"
hash_value = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
auth_key = f"{exp}-{rand}-{uid}-{hash_value}"
return f"{uri}?auth_key={auth_key}"
if __name__ == '__main__':
"""
使用示例:获取鉴权Key并生成带鉴权的直播地址
"""
try:
domain = "example.aliyundoc.com" # 推/播流域名
app_name = "liveApp" # 应用名称
stream_name = "liveStream" # 流名称
key = get_live_key(domain)
print(f"鉴权Key: {key}")
exp = int(time.time()) + 3600
auth_url = generate_live_url(domain, app_name, stream_name, key, exp)
print(f"直播地址: {auth_url}")
except Exception as e:
print(f"生成直播地址失败: {str(e)}")
Go
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"time"
live20161101 "github.com/alibabacloud-go/live-20161101/v2/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
credential "github.com/aliyun/credentials-go/credentials"
"github.com/alibabacloud-go/tea/tea"
)
// createClient 使用凭据初始化账号Client
func createClient() (*live20161101.Client, error) {
cred, err := credential.NewCredential(nil)
if err != nil {
return nil, fmt.Errorf("创建凭据失败: %v", err)
}
config := &openapi.Config{Credential: cred}
config.Endpoint = tea.String("live.aliyuncs.com")
client, err := live20161101.NewClient(config)
if err != nil {
return nil, fmt.Errorf("创建客户端失败: %v", err)
}
return client, nil
}
// getLiveKey 从阿里云获取直播域名的鉴权Key
func getLiveKey(domain string) (string, error) {
client, err := createClient()
if err != nil {
return "", err
}
request := &live20161101.DescribeLiveDomainConfigsRequest{
DomainName: tea.String(domain),
FunctionNames: tea.String("aliauth"),
}
response, err := client.DescribeLiveDomainConfigsWithOptions(request, &util.RuntimeOptions{})
if err != nil {
return "", fmt.Errorf("调用API失败: %v", err)
}
if response == nil || response.Body == nil {
return "", fmt.Errorf("域名 %s 未找到配置信息,请确认域名是否正确", domain)
}
domainConfigs := response.Body.DomainConfigs
if domainConfigs == nil {
return "", fmt.Errorf("域名 %s 未找到配置信息,请确认域名是否正确", domain)
}
domainConfigArray := domainConfigs.DomainConfig
if domainConfigArray == nil || len(domainConfigArray) == 0 {
return "", fmt.Errorf("域名 %s 未配置URL鉴权功能,请在控制台开启", domain)
}
for _, config := range domainConfigArray {
if tea.StringValue(config.FunctionName) == "aliauth" {
functionArgs := config.FunctionArgs
if functionArgs == nil {
return "", fmt.Errorf("域名 %s 的鉴权配置不完整", domain)
}
functionArgArray := functionArgs.FunctionArg
if functionArgArray == nil || len(functionArgArray) == 0 {
return "", fmt.Errorf("域名 %s 的鉴权参数配置为空", domain)
}
for _, arg := range functionArgArray {
if tea.StringValue(arg.ArgName) == "auth_key1" {
key := tea.StringValue(arg.ArgValue)
if key == "" {
return "", fmt.Errorf("域名 %s 的鉴权Key为空", domain)
}
return key, nil
}
}
return "", fmt.Errorf("域名 %s 未找到auth_key1配置", domain)
}
}
return "", fmt.Errorf("域名 %s 未开启URL鉴权功能", domain)
}
// generateLiveUrl 生成带鉴权的直播推流/播流地址
func generateLiveUrl(domain, appName, streamName, key string, exp int64) string {
uri := fmt.Sprintf("rtmp://%s/%s/%s", domain, appName, streamName)
if key == "" {
return uri
}
rand, uid := "0", "0"
signString := fmt.Sprintf("%s-%d-%s-%s-%s", uri, exp, rand, uid, key)
hash := md5.Sum([]byte(signString))
hashValue := hex.EncodeToString(hash[:])
authKey := fmt.Sprintf("%d-%s-%s-%s", exp, rand, uid, hashValue)
return fmt.Sprintf("%s?auth_key=%s", uri, authKey)
}
func main() {
domain := "example.aliyundoc.com"
appName := "liveApp"
streamName := "liveStream"
key, err := getLiveKey(domain)
if err != nil {
fmt.Printf("获取鉴权Key失败: %v\n", err)
return
}
fmt.Printf("鉴权Key: %s\n", key)
exp := time.Now().Unix() + 3600
authUrl := generateLiveUrl(domain, appName, streamName, key, exp)
fmt.Printf("直播地址: %s\n", authUrl)
}PHP
<?php
/**
* 阿里云直播URL鉴权生成示例
* 功能:从阿里云获取直播域名的鉴权Key,并生成带鉴权的推流/播流地址
*/
require_once __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\SDK\Live\V20161101\Live;
use AlibabaCloud\Credentials\Credential;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Live\V20161101\Models\DescribeLiveDomainConfigsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use AlibabaCloud\Tea\Exception\TeaError;
/**
* 创建阿里云直播客户端
* @return Live 直播服务客户端实例
*/
function createClient() {
$credential = new Credential();
$config = new Config(["credential" => $credential]);
$config->endpoint = "live.aliyuncs.com";
return new Live($config);
}
/**
* 从阿里云获取直播域名的鉴权Key
* @param string $domain 直播域名
* @return string 鉴权Key
* @throws Exception 获取失败时抛出异常
*/
function getLiveKey($domain) {
$client = createClient();
// 构建查询域名配置的请求,查询aliauth鉴权功能
$request = new DescribeLiveDomainConfigsRequest([
"domainName" => $domain,
"functionNames" => "aliauth"
]);
$runtime = new RuntimeOptions([]);
try {
// 调用API获取域名配置
$response = $client->describeLiveDomainConfigsWithOptions($request, $runtime);
if ($response == null || $response->body == null) {
throw new Exception("域名 {$domain} 未找到配置信息,请确认域名是否正确");
}
$domainConfigs = $response->body->domainConfigs;
if ($domainConfigs == null) {
throw new Exception("域名 {$domain} 未找到配置信息,请确认域名是否正确");
}
// 获取鉴权配置数组
$domainConfigArray = $domainConfigs->domainConfig;
if ($domainConfigArray == null || empty($domainConfigArray)) {
throw new Exception("域名 {$domain} 未配置URL鉴权功能,请在控制台开启");
}
// 遍历配置,查找aliauth鉴权功能
foreach ($domainConfigArray as $config) {
if ($config->functionName === 'aliauth') {
$functionArgs = $config->functionArgs;
if ($functionArgs == null) {
throw new Exception("域名 {$domain} 的鉴权配置不完整");
}
$functionArgArray = $functionArgs->functionArg;
if ($functionArgArray == null || empty($functionArgArray)) {
throw new Exception("域名 {$domain} 的鉴权参数配置为空");
}
// 遍历参数,查找auth_key1
foreach ($functionArgArray as $arg) {
if ($arg->argName === 'auth_key1') {
$key = $arg->argValue ?? '';
if (empty($key)) {
throw new Exception("域名 {$domain} 的鉴权Key为空");
}
return $key;
}
}
throw new Exception("域名 {$domain} 未找到auth_key1配置");
}
}
throw new Exception("域名 {$domain} 未开启URL鉴权功能");
} catch (Exception $error) {
if ($error instanceof TeaError) {
throw new Exception("获取鉴权Key失败: " . $error->message);
}
throw new Exception("获取鉴权Key失败: " . $error->getMessage());
}
}
/**
* 生成带鉴权的直播推流/播流地址
* @param string $domain 直播域名
* @param string $appName 应用名称
* @param string $streamName 流名称
* @param string $key 鉴权Key
* @param int $exp 过期时间戳(Unix时间戳)
* @return string 带鉴权参数的直播地址
*/
function generateLiveUrl($domain, $appName, $streamName, $key, $exp) {
$uri = "rtmp://{$domain}/{$appName}/{$streamName}";
if (empty($key)) {
return $uri;
}
$rand = "0";
$uid = "0";
// 按照阿里云鉴权规则拼接签名字符串
$signString = "{$uri}-{$exp}-{$rand}-{$uid}-{$key}";
$hashValue = md5($signString);
// 生成鉴权参数:过期时间-随机数-用户ID-MD5值
$authKey = "{$exp}-{$rand}-{$uid}-{$hashValue}";
return "{$uri}?auth_key={$authKey}";
}
// 使用示例
try {
$domain = "example.aliyundoc.com";
$appName = "liveApp";
$streamName = "liveStream";
// 从阿里云获取鉴权Key
$key = getLiveKey($domain);
echo "鉴权Key: {$key}\n";
// 设置过期时间为1小时后
$exp = time() + 3600;
// 生成带鉴权的直播地址
$authUrl = generateLiveUrl($domain, $appName, $streamName, $key, $exp);
echo "直播地址: {$authUrl}\n";
} catch (Exception $e) {
echo "生成直播地址失败: " . $e->getMessage() . "\n";
}推流地址示例
支持协议 | 地址示例 | 说明 |
RTMP |
| 标准直播推流协议。 |
ARTC |
| 阿里云超低延时直播RTS推流地址。 |
SRT |
| SRT协议默认关闭,需为推流域名开启SRT协议后方可使用,操作指引参见SRT推流。 |
播流地址示例
播流地址 | 说明 | 支持协议 | 地址示例 |
标准直播播流地址 | 推流为SRT协议时,播流协议支持RTMP、FLV、HLS、ARTC。 | RTMP |
|
FLV |
| ||
HLS |
| ||
ARTC |
| ||
转码流播流地址(通用转码/自定义转码) | 转码流地址需要在StreamName后加 | RTMP |
|
FLV |
| ||
HLS |
| ||
ARTC |
| ||
转码流播流地址(多码率转码) | 多码率转码流地址需要在StreamName后加 | HLS |
|
延播播流地址 | 延播播流地址需要在 | RTMP |
|
FLV |
| ||
HLS |
| ||
ARTC |
| ||
实时字幕播流地址 | 实时字幕播流地址需要在StreamName后加 | RTMP |
|
FLV |
| ||
HLS |
|
生成地址验证
本文推荐使用手机端Demo APP推流,和PC端VLC播放器播流完成生成地址有效性验证,更多推/播流方式请参见直播推流和直播播流:
推流地址验证:
准备好一台手机,安卓系统或者iOS系统均可。扫描并安装阿里云直播应用Demo。
说明iOS端扫码安装时如果提示未受信任的企业级开发者,需要在中找到Taobao对应的信任描述,并选择信任。
打开Demo App,选择摄像头推流或录屏推流。输入推流地址,控制台生成的地址可使用二维码扫描输入。


点击开始推流,此时就完成了主播开播的流程。
您可以在视频直播控制台-流管理页面,看到当前的在线流,若未看到直播流,请确认前面操作步骤是否正确。

播流地址验证:
在进行直播播放操作时,需保持推流端维持直播推流状态,否则播放端将会播放失败。
下载并安装VLC播放器。下载地址,请参见VLC media player。
运行VLC播放器。
在菜单栏中选择。
在网络页签中输入网络URL,即生成的播放地址,如:
rtmp://pull-singapore.cloud-example.net/testApp/testStream?auth_key=1750150177-0-0-9b7*******31acc543a99c69********
问题排查
进行推流/播流时遇到问题可以使用自助问题排查功能对地址进行检测,验证地址,鉴权等信息是否有效。