ライブストリームを開始するには、配信者がストリームを送信するためのアップストリーミング URL と、視聴者が再生するためのストリーミング URL が必要です。このドキュメントでは、ApsaraVideo Live で安全で信頼性の高いストリーム配信を実現するために、署名付きアップストリーミング URL とストリーミング URL を生成する方法について説明します。
前提条件
アップストリーミング URL とストリーミング URL を生成する前に、アップストリーミングドメインとストリーミングドメインを追加し、それらを関連付ける必要があります。詳細については、「ドメインの追加」をご参照ください。
アップストリーミングドメインは、中国 (北京)、中国 (上海)、中国 (深セン) では最大 300 の同時ストリーム、その他のリージョンでは 50 の同時ストリームをサポートします。詳細については、「制限事項」をご参照ください。
URL の構造
ライブストリーミング URL は、プロトコル、インジェスト/ストリーミングドメイン、AppName、StreamName、およびトークンで構成されます。
次の表に、ライブストリーミング URL の構成要素を示します。
|
パラメーター |
説明 |
例 |
|
プロトコル |
ライブストリームに使用されるプロトコル。 |
|
|
アップストリーミングドメイン / ストリーミングドメイン |
追加したドメイン。アップストリーミング URL を生成する場合はアップストリーミングドメインを使用し、ストリーミング URL を生成する場合はストリーミングドメインを使用します。 |
|
|
AppName |
アプリケーションのカスタム名。異なるサービスやシナリオを区別するために使用されます。 |
|
|
StreamName |
ストリームのカスタム名。ストリームの一意の識別子として機能します。 |
|
|
アクセス トークン |
MD5 アルゴリズムとドメインに設定された認証キーを使用して生成される暗号化された文字列。ライブストリームを保護します。文字列の生成方法については、「URL 認証」をご参照ください。 |
|
URL の生成
アップストリーミング URL とストリーミング URL は、次のいずれかの方法で生成できます。
-
コンソールで生成: 初期の試用やテストに推奨される方法で、暗号化された {トークン} を含む URL を自動的に生成します。
-
コードを使用して生成:本番環境に推奨します。この方法では、サーバー上で URL 生成を自動化し、柔軟な管理と配信が可能になります。
コンソールで生成
-
URL ジェネレーター ページにアクセスします。
-
設定を構成し、URL の生成 をクリックして、インジェスト URL とストリーミング URL を取得します。
これらの設定には、 [ストリーミングドメイン] (必須。ドメインがない場合は [ドメインの追加] をクリック)、 [関連付けられたアップストリーミングドメイン] (選択したストリーミングドメインから自動入力)、 [AppName] と [StreamName] (必須。最大 256 文字で、数字、英字、ハイフン、アンダースコア、等号を含めることができます)、および [トランスコーディングテンプレート] (オプション。AppName が必要) が含まれます。
説明URL ジェネレーターは、ライブ字幕のストリーミング URL の生成をサポートしていません。
コードを使用して生成
1. URI の構築
URI は {Protocol}://{DomainName}/{AppName}/{StreamName} のフォーマットで構成されます。異なるプロトコルを使用する例については、「インジェスト URL の例」または「ストリーミング URL の例」をご参照ください。
// 疑似コード
protocol = "rtmp"
domain = "example.aliyundoc.com"
appName = "liveApp"
streamName = "liveStream"
uri = protocol + "://" + domain + "/" + appName + "/" + streamName
// 結果: rtmp://example.aliyundoc.com/liveApp/liveStream
2. 認証キーの取得
認証キーは、アクセス トークンを生成するために使用されます。認証キーは、コンソールの「URL 認証」ページから取得するか、DescribeLiveDomainConfigs API を呼び出して取得できます。
アップストリーミング URL にはアップストリーミングドメインの認証キーを使用し、ストリーミング URL にはストリーミングドメインの認証キーを使用します。
3. 署名付き URL の組み立て
以下のコード例では、{トークン} を生成し、RTMP プロトコル用の完全な署名付き URL を組み立てる方法を説明します:
Java
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AuthDemo {
private static String md5Sum(String src) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
md5.update(StandardCharsets.UTF_8.encode(src));
return String.format("%032x", new BigInteger(1, md5.digest()));
}
private static String aAuth(String uri, String key, long exp) {
String pattern = "^(rtmp://)?([^/?]+)(/[^?]*)?(\\?.*)?$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(uri);
String scheme = "", host = "", path = "", args = "";
if (m.find()) {
scheme = m.group(1) == null ? "rtmp://" : m.group(1);
host = m.group(2) == null ? "" : m.group(2);
path = m.group(3) == null ? "/" : m.group(3);
args = m.group(4) == null ? "" : m.group(4);
} else {
System.out.println("NO MATCH");
}
String rand = "0"; // デフォルトは "0"、他の値でも可
String uid = "0"; // デフォルトは "0"、他の値でも可
String sString = String.format("%s-%s-%s-%s-%s", path, exp, rand, uid, key);
String hashValue = md5Sum(sString);
String authKey = String.format("%s-%s-%s-%s", exp, rand, uid, hashValue);
if (args.isEmpty()) {
return String.format("%s%s%s%s?auth_key=%s", scheme, host, path, args, authKey);
} else {
return String.format("%s%s%s%s&auth_key=%s", scheme, host, path, args, authKey);
}
}
public static void main(String[] args) {
// 署名するアップストリーミング URL またはストリーミング URL。example.aliyundoc.com はドメイン名、liveApp は AppName、liveStream は StreamName です。
// アップストリーミング URL とストリーミング URL には同じ署名方法が使用されます。
// AppName と StreamName は最大 256 文字で、数字、大文字と小文字の英字、ハイフン (-)、アンダースコア (_)、等号 (=) を含めることができます。
String uri = "rtmp://example.aliyundoc.com/liveApp/liveStream";
// 認証キー。アップストリーミング URL にはアップストリーミングドメインのキーを使用し、ストリーミング URL にはストリーミングドメインのキーを使用します。
String key = "<input private key>";
// `exp` 値は秒単位の UNIX タイムスタンプです。URL の実際の有効期限は、このタイムスタンプにコンソールで設定された有効期間を加えたものです。たとえば、設定された有効期間が 30 分で、`exp` を現在時刻に設定した場合、URL は 30 分後に期限切れになります。
long exp = System.currentTimeMillis() / 1000 + 1 * 3600;
String authUri = aAuth(uri, key, exp);
System.out.printf("URL : %s\nAuth: %s", uri, authUri);
}
}
Python
import re
import time
import hashlib
import datetime
def md5sum(src):
m = hashlib.md5()
if isinstance(src, str):
src = src.encode('utf-8')
m.update(src)
return m.hexdigest()
def a_auth(uri, key, exp):
p = re.compile("^(rtmp://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
if not p:
return None
m = p.match(uri)
scheme, host, path, args = m.groups()
if not scheme: scheme = "rtmp://"
if not path: path = "/"
if not args: args = ""
rand = "0" # デフォルトは "0"、他の値でも可
uid = "0" # デフォルトは "0"、他の値でも可
sstring = "%s-%s-%s-%s-%s" %(path, exp, rand, uid, key)
hashvalue = md5sum(sstring.encode('utf-8'))
auth_key = "%s-%s-%s-%s" %(exp, rand, uid, hashvalue)
if args:
return "%s%s%s%s&auth_key=%s" %(scheme, host, path, args, auth_key)
else:
return "%s%s%s%s?auth_key=%s" %(scheme, host, path, args, auth_key)
def main():
# 署名するアップストリーミング URL またはストリーミング URL。example.aliyundoc.com はドメイン名、liveApp は AppName、liveStream は StreamName です。
# アップストリーミング URL とストリーミング URL には同じ署名方法が使用されます。
# AppName と StreamName は最大 256 文字で、数字、大文字と小文字の英字、ハイフン (-)、アンダースコア (_)、等号 (=) を含めることができます。
uri = "rtmp://example.aliyundoc.com/liveApp/liveStream"
# 認証キー。アップストリーミング URL にはアップストリーミングドメインのキーを使用し、ストリーミング URL にはストリーミングドメインのキーを使用します。
key = "<input private key>"
# `exp` 値は秒単位の UNIX タイムスタンプです。URL の実際の有効期限は、このタイムスタンプにコンソールで設定された有効期間を加えたものです。たとえば、設定された有効期間が 30 分で、`exp` を現在時刻に設定した場合、URL は 30 分後に期限切れになります。
exp = int(time.time()) + 1 * 3600
authuri = a_auth(uri, key, exp)
print("URL : %s\nAUTH: %s" %(uri, authuri))
if __name__ == "__main__":
main()
Go
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"regexp"
"time"
)
func md5sum(src string) string {
h := md5.New()
h.Write([]byte(src))
return hex.EncodeToString(h.Sum(nil))
}
func a_auth(uri, key string, exp int64) string {
p, err := regexp.Compile("^(rtmp://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
if err != nil {
fmt.Println(err)
return ""
}
m := p.FindStringSubmatch(uri)
var scheme, host, path, args string
if len(m) == 5 {
scheme, host, path, args = m[1], m[2], m[3], m[4]
} else {
scheme, host, path, args = "rtmp://", "", "/", ""
}
rand := "0" // デフォルトは "0"、他の値でも可
uid := "0" // デフォルトは "0"、他の値でも可
sstring := fmt.Sprintf("%s-%d-%s-%s-%s", path, exp, rand, uid, key)
hashvalue := md5sum(sstring)
auth_key := fmt.Sprintf("%d-%s-%s-%s", exp, rand, uid, hashvalue)
if len(args) != 0 {
return fmt.Sprintf("%s%s%s%s&auth_key=%s", scheme, host, path, args, auth_key)
} else {
return fmt.Sprintf("%s%s%s%s?auth_key=%s", scheme, host, path, args, auth_key)
}
}
func main() {
// 署名するアップストリーミング URL またはストリーミング URL。example.aliyundoc.com はドメイン名、liveApp は AppName、liveStream は StreamName です。
// アップストリーミング URL とストリーミング URL には同じ署名方法が使用されます。
// AppName と StreamName は最大 256 文字で、数字、大文字と小文字の英字、ハイフン (-)、アンダースコア (_)、等号 (=) を含めることができます。
uri := "rtmp://example.aliyundoc.com/liveApp/liveStream"
// 認証キー。アップストリーミング URL にはアップストリーミングドメインのキーを使用し、ストリーミング URL にはストリーミングドメインのキーを使用します。
key := "<input private key>"
// `exp` 値は秒単位の UNIX タイムスタンプです。URL の実際の有効期限は、このタイムスタンプにコンソールで設定された有効期間を加えたものです。たとえば、設定された有効期間が 30 分で、`exp` を現在時刻に設定した場合、URL は 30 分後に期限切れになります。
exp := time.Now().Unix() + 3600
authuri := a_auth(uri, key, exp)
fmt.Printf("URL : %s\nAUTH: %s", uri, authuri)
}
PHP
<?php
function a_auth($uri, $key, $exp) {
preg_match("/^(rtmp:\/\/)?([^\/?]+)?(\/[^?]*)?(\?.*)?$/", $uri, $matches);
$scheme = $matches[1];
$host = $matches[2];
$path = $matches[3];
$args = $matches[4];
if (empty($args)) {
$args ="";
}
if (empty($scheme)) {
$scheme ="rtmp://";
}
if (empty($path)) {
$path ="/";
}
$rand = "0";
// デフォルトは "0"、他の値でも可
$uid = "0";
// デフォルトは "0"、他の値でも可
$sstring = sprintf("%s-%u-%s-%s-%s", $path, $exp, $rand, $uid, $key);
$hashvalue = md5($sstring);
$auth_key = sprintf("%u-%s-%s-%s", $exp, $rand, $uid, $hashvalue);
if ($args) {
return sprintf("%s%s%s%s&auth_key=%s", $scheme, $host, $path, $args, $auth_key);
} else {
return sprintf("%s%s%s%s?auth_key=%s", $scheme, $host, $path, $args, $auth_key);
}
}
// 署名するアップストリーミング URL またはストリーミング URL。example.aliyundoc.com はドメイン名、liveApp は AppName、liveStream は StreamName です。
// アップストリーミング URL とストリーミング URL には同じ署名方法が使用されます。
// AppName と StreamName は最大 256 文字で、数字、大文字と小文字の英字、ハイフン (-)、アンダースコア (_)、等号 (=) を含めることができます。
$uri = "rtmp://example.aliyundoc.com/liveApp/liveStream";
// 認証キー。アップストリーミング URL にはアップストリーミングドメインのキーを使用し、ストリーミング URL にはストリーミングドメインのキーを使用します。
$key = "<input private key>";
// `exp` 値は秒単位の UNIX タイムスタンプです。URL の実際の有効期限は、このタイムスタンプにコンソールで設定された有効期間を加えたものです。たとえば、設定された有効期間が 30 分で、`exp` を現在時刻に設定した場合、URL は 30 分後に期限切れになります。
$exp = time() + 3600;
$authuri = a_auth($uri, $key, $exp);
echo "URL :" . $uri;
echo PHP_EOL;
echo "AUTH:" . $authuri;
?>
C#
using System;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Text;
public class Test
{
public static void Main()
{
// 署名するアップストリーミング URL またはストリーミング URL。example.aliyundoc.com はドメイン名、liveApp は AppName、liveStream は StreamName です。
// アップストリーミング URL とストリーミング URL には同じ署名方法が使用されます。
// AppName と StreamName は最大 256 文字で、数字、大文字と小文字の英字、ハイフン (-)、アンダースコア (_)、等号 (=) を含めることができます。
string uri= "rtmp://example.aliyundoc.com/liveApp/liveStream";
// 認証キー。アップストリーミング URL にはアップストリーミングドメインのキーを使用し、ストリーミング URL にはストリーミングドメインのキーを使用します。
string key= "<input private key>";
DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);
// `exp` 値は秒単位の UNIX タイムスタンプです。URL の実際の有効期限は、このタイムスタンプにコンソールで設定された有効期間を加えたものです。たとえば、設定された有効期間が 30 分で、`exp` を現在時刻に設定した場合、URL は 30 分後に期限切れになります。
string exp = Convert.ToInt64((DateTime.Now - dateStart).TotalSeconds+3600).ToString();
string authUri = aAuth(uri, key, exp);
Console.WriteLine (String.Format("URL :{0}",uri));
Console.WriteLine (String.Format("AUTH :{0}",authUri));
}
public static string aAuth(string uri, string key, string exp)
{
Regex regex = new Regex("^(rtmp://)?([^/?]+)(/[^?]*)?(\\?.*)?$");
Match m = regex.Match(uri);
string scheme = "rtmp://", host = "", path = "/", args = "";
if (m.Success)
{
scheme=m.Groups[1].Value;
host=m.Groups[2].Value;
path=m.Groups[3].Value;
args=m.Groups[4].Value;
}else{
Console.WriteLine ("NO MATCH");
}
string rand = "0"; // デフォルトは "0"、他の値でも可
string uid = "0"; // デフォルトは "0"、他の値でも可
string u = String.Format("{0}-{1}-{2}-{3}-{4}", path, exp, rand, uid, key);
string hashValue = Md5(u);
string authKey = String.Format("{0}-{1}-{2}-{3}", exp, rand, uid, hashValue);
if (args=="")
{
return String.Format("{0}{1}{2}{3}?auth_key={4}", scheme, host, path, args, authKey);
} else
{
return String.Format("{0}{1}{2}{3}&auth_key={4}", scheme, host, path, args, authKey);
}
}
public static string Md5(string value)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bytes = Encoding.ASCII.GetBytes(value);
byte[] encoded = md5.ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
for(int i=0; i<encoded.Length; ++i)
{
sb.Append(encoded[i].ToString("x2"));
}
return sb.ToString();
}
}
アップストリーミング URL の例
|
プロトコル |
URL の例 |
説明 |
|
RTMP |
|
ライブストリームアップストリーミングの標準プロトコル。 |
|
RTMPS |
|
ライブストリームアップストリーミングの標準的な暗号化プロトコル。 |
|
ARTC |
|
リアルタイムストリーミング (RTS) のアップストリーミング URL。 |
|
SRT |
|
SRT プロトコルはデフォルトで無効になっています。SRT を使用するには、アップストリーミングドメインで有効にする必要があります。手順については、「SRT アップストリーミング」をご参照ください。 |
ストリーミング URL の例
|
URL タイプ |
説明 |
プロトコル |
URL の例 |
|
標準ストリーミング URL |
SRT プロトコルを使用してアップストリーミングする場合、RTMP、FLV、HLS、ARTC を使用してストリームを再生できます。 |
RTMP |
|
|
FLV |
|
||
|
HLS |
|
||
|
ARTC |
|
||
|
トランスコードストリーム URL ([デフォルト]/[カスタム]) |
StreamName に |
RTMP |
|
|
FLV |
|
||
|
HLS |
|
||
|
ARTC |
|
||
|
トランスコードストリーム URL (マルチビットレートトランスコーディング) |
マルチビットレートのトランスコードストリームの場合、StreamName に |
HLS |
|
|
ストリーム遅延 URL |
遅延ストリームの場合、 |
RTMP |
|
|
FLV |
|
||
|
HLS |
|
||
|
ARTC |
|
||
|
ライブ字幕ストリーム URL |
|
RTMP |
|
|
FLV |
|
||
|
HLS |
|
URL の検証
生成された URL が有効であることを確認するには、モバイルデモアプリを使用してストリームをアップストリーミングし、PC 上の VLC メディアプレーヤーを使用してストリームを再生することを推奨します。その他のアップストリーミングおよび再生方法については、「ライブストリームアップストリーミング」および「ライブストリーム再生」をご参照ください。
アップストリーミング URL の検証
-
Android または iOS モバイルデバイスで、QR コードをスキャンして ApsaraVideo Live デモアプリをダウンロードし、インストールします。
説明iOS では、インストール中に "Untrusted Enterprise Developer" というプロンプトが表示された場合、 [設定] > [一般] > [VPN とデバイス管理] に移動し、Taobao のプロファイルを見つけて、 [信頼] をタップしてください。
-
デモアプリを開き、カメラ取り込み または [画面共有] を選択します。インジェスト URL フィールドに、生成した URL を入力します。コンソールから QR コードをスキャンして URL を自動入力することもできます。


-
[開始] をタップします。これで、ライブストリームが開始されました。
ApsaraVideo Live コンソールの ストリーム管理 ページにアクセスして、アクティブなストリームを表示できます。ストリームが表示されない場合は、前の手順を見直して、正しく完了していることを確認してください。
ストリーミング URL の検証
ストリームを再生するには、アップストリーミングクライアントがアクティブにストリーミングしていることを確認してください。そうでない場合、再生は失敗します。
-
VLC media player をダウンロードしてインストールします。
-
VLC media player を開きます。
-
メニューバーから、[メディア > ネットワークストリームを開く] を選択します。
-
[ネットワーク] タブに、生成したストリーミング URL を入力します。 例:
rtmp://pull-singapore.cloud-example.net/testApp/testStream?auth_key=1750150177-0-0-9b7*******31acc543a99c69********[再生] をクリックします。VLC メディアプレーヤーがストリームを正常に取得して再生する場合、アップストリーミングと再生の設定は正しく機能しています。
API を呼び出して検証
GUI を使用せずに API または CLI コマンドを使用してストリームをプッシュおよびプルする場合、DescribeLiveStreamsOnlineList 操作を呼び出して、アクティブなストリームのリストをクエリし、ストリームが正常に取り込まれているかどうかを確認します。
CLI の例:
aliyun live DescribeLiveStreamsOnlineList --RegionId cn-hangzhou --DomainName <your streaming domain> --AppName <your app name> --StreamName <your stream name>
パラメーター:
-
DomainName: ストリーミングドメイン。このパラメーターは必須です。 -
AppName: アプリケーション名。 -
StreamName: ストリームの名前。 -
StreamTypeはストリームの種類です。 有効な値は、all(デフォルト)、raw(生のストリーム)、およびtrans(トランスコードされたストリーム) です。
レスポンスフィールド:
-
StreamName:ストリームの名前。 -
AppName: アプリケーションの名前。 -
PublishTime: ストリームの取り込みが開始された時刻。
この API は、アクティブなストリームのリストを返します。指定したストリームがリストに含まれており、アクティブな場合、アップストリーミングは正しく機能しています。この方法は、ApsaraVideo Live コンソールの ストリーム管理 ページでアクティブなストリームを表示することを補完します。
トラブルシューティング
アップストリーミングまたは再生中に問題が発生した場合は、トラブルシューティングツールを使用して URL と認証情報を検証してください。