ApsaraVideo Live は、オンデマンドのストリームのアップストリーミングと再生をサポートしており、事前にリソースを作成する必要はありません。アップストリーミング ドメインとストリーミング ドメインを追加した後、URL を生成できます。このトピックでは、アップストリーミング URL とストリーミング URL を構築する方法について説明します。
使用上の注意
複数のアップストリーミング URL とストリーミング URL を生成して、複数のライブ ストリームを同時に実行できます。ただし、各アップストリーミング ドメインでは、同時ストリーム数が制限されています。ライブストリーミングを行う前に、制限を確認して、ビジネス ニーズに合致していることを確認してください。そうでない場合は、クォータセンター でクォータを増やすか、お問い合わせください。
デフォルトでは、アップストリーミング ドメインとストリーミング ドメインに対して URL 署名 が有効になっています。生成された URL には、アクセストークンを含める必要があります。そうでない場合、アップストリーミングと再生は失敗します。
URL 形式
アップストリーミング URL
連結ルール: アップストリーミング ドメイン + AppName + StreamName + {アクセストークン}
AppName
とStreamName
はカスタマイズできます。ApsaraVideo Live は、
AppName
ではなくStreamName
に基づいてストリームが一意かどうかを判断します。2 つのストリームを区別するには、ストリーム名が異なっている必要があります。同じドメインで異なる AppName を使用して同一のストリーム (StreamName) をアップストリーミングする場合は、お問い合わせ いただき、アプリの隔離を有効にしてください。
{アクセストークン} は、MD5 アルゴリズムによって計算された暗号化文字列です。詳細については、「アクセストークンの構造」をご参照ください。
例:
RTMP:
rtmp://demo.aliyundoc.com/app/stream?auth_key={アクセストークン}
ARTC:
artc://demo.aliyundoc.com/app/stream?auth_key= {アクセストークン}
ARTC URL は、リアルタイムストリーミング (RTS) に使用されます。
SRT:
srt://demo.aliyundoc.com:1105?streamid=#!::h=demo.aliyundoc.com,r=/app/stream?auth_key= {アクセストークン} ,m=publish
デフォルトでは、SRT プロトコルは無効になっています。有効にするには、「SRT 経由のストリーム アップストリーミングを構成する」をご参照ください。
アクセストークンには、
m=publish
は含まれていません。
ストリーミング URL
ApsaraVideo Live は、標準ストリームに加えて、トランスコード、遅延、文字起こしされたストリームなど、処理されたストリームの再生をサポートしています。連結ルールとサポートされているプロトコルは、ストリームの種類によって異なります。
連結ルール
標準ストリーム
形式: ストリーミング ドメイン + AppName + StreamName + {アクセストークン}
例:
rtmp://example.aliyundoc.com/app/stream?auth_key={アクセストークン}
デフォルトまたはカスタム トランスコーディングを使用したトランスコード ストリーム
形式: ストリーミング ドメイン + AppName + StreamName
_テンプレート ID
+ {アクセストークン}例:
rtmp://example.aliyundoc.com/app/stream_{テンプレート ID}?auth_key={アクセストークン}
要件: デフォルトまたはカスタム トランスコーディング テンプレート を作成する必要があります。
マルチビットレート トランスコーディングを使用したトランスコード ストリーム
形式: ストリーミング ドメイン + AppName + StreamName
_テンプレート グループ ID
+aliyunols=on
+ {アクセストークン}例:
http://example.aliyundoc.com/app/stream_{テンプレート グループ ID}.m3u8?aliyunols=on&auth_key={アクセストークン}
要件: マルチビットレート トランスコーディング テンプレート グループ を作成する必要があります。
遅延ストリーム
形式: ストリーミング ドメイン + AppName + StreamName
-alidelay
+ {アクセストークン}例:
rtmp://example.aliyundoc.com/app/stream-alidelay?auth_key={アクセストークン}
要件: ストリームに対して ストリーム遅延を構成 する必要があります。そうでない場合、生成された URL を介して再生することはできません。
ライブ字幕付きストリーム
形式: ストリーミング ドメイン + AppName + StreamName
_字幕テンプレート名
+ {アクセストークン}例:
rtmp://example.aliyundoc.com/app/stream_{字幕テンプレート名}?auth_key={アクセストークン}
要件: ライブ字幕テンプレートとルールを作成 する必要があります。
サポートされているプロトコル
ストリームの種類 | RTMP | FLV | HLS | ARTC (RTS 用) |
ストリームの種類 | RTMP | FLV | HLS | ARTC (RTS 用) |
標準ストリーム | ✔️ | ✔️ | ✔️ | ✔️ |
トランスコード ストリーム (デフォルト/カスタム) | ✔️ | ✔️ | ✔️ | ✔️ |
トランスコード ストリーム (マルチビットレート) | ❌ | ❌ | ✔️ | ❌ |
遅延ストリーム | ✔️ | ✔️ | ✔️ | ✔️ |
ライブ字幕付きストリーム | ✔️ | ✔️ | ✔️ | ❌ |
例
RTMP:
rtmp://example.aliyundoc.com/app/stream?auth_key={アクセストークン}
FLV:
http://example.aliyundoc.com/app/stream.flv?auth_key={アクセストークン}
HLS:
http://example.aliyundoc.com/app/stream.m3u8?auth_key={アクセストークン}
ARTC:
artc://example.aliyundoc.com/app/stream?auth_key={アクセストークン}
SRT 経由でアップストリーミングされたストリームの場合、次の再生プロトコルがサポートされています: RTMP、FLV、HLS、ARTC。SRT 経由でストリームを再生する場合は、アカウント マネージャーに相談するか、お問い合わせください。
URL を生成する
ApsaraVideo Live は、コンソールまたはプログラムでアップストリーミング URL とストリーミング URL を生成することをサポートしています。
コンソールで URL を生成する
ライブ URL ジェネレーター を使用してこれを行うことができます。
最初に アップストリーミング ドメインをストリーミング ドメインに関連付ける 必要があります。
生成された URL には、アクセストークンが含まれています。
このメソッドは、ライブ字幕付きストリームの URL 生成をサポートしていません。
コードを使用して URL を生成する
ステップ 1: 暗号鍵を取得する
署名付き URL を生成する前に、暗号化用のキーを取得する必要があります。
アップストリーミング URL を生成するには、アップストリーミング ドメインのキーを取得します。
ストリーミング URL を生成するには、ストリーミング ドメインのキーを取得します。
コンソール で、または DescribeLiveDomainConfigs を呼び出すことによって、両方取得できます。
ステップ 2: 署名付き URL を生成する
次のサンプルコードは、RTMP プロトコルを使用して署名付き URL を生成する方法を示しています。
生成する前に、「署名付き URL の構成」をご参照ください。
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。次の例では、ドメイン名は example.aliyundoc.com、AppName は liveApp、StreamName は liveStream です。
// アップストリーミング URL とストリーミング URL は同じメソッドを使用して暗号化されます。
// AppName と StreamName は、文字、数字、ハイフン (-)、アンダースコア (_)、等号 (=) をサポートしています。最大長は 256 文字です。
String uri = "rtmp://example.aliyundoc.com/liveApp/liveStream";
// キー。アップストリーミング URL を生成するには、アップストリーミング ドメインのキーを使用します。ストリーミング URL を生成するには、ストリーミング ドメインのキーを使用します。
String key = "<input private key>";
// exp 値は、秒単位で測定される UNIX タイムスタンプです。実際の有効期限は、exp 値 + ドメイン名に設定された有効期間です。
// たとえば、exp を現在の時刻 + 3600 秒に設定した場合、実際の有効期限は現在の時刻 + 3600 秒 + 有効期間になります。現在の時刻に設定した場合、有効期限は現在の時刻 + 有効期間になります。
long exp = System.currentTimeMillis() / 1000 + 1 * 3600;
String authUri = aAuth(uri, key, exp);
System.out.printf("URL : %s\nAuth: %s", uri, authUri); // URL、認証済み
}
}
import re
import time
import hashlib
import datetime
def md5sum(src):
m = hashlib.md5()
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。次の例では、ドメイン名は example.aliyundoc.com、AppName は liveApp、StreamName は liveStream です。
# アップストリーミング URL とストリーミング URL は同じメソッドを使用して暗号化されます。
# AppName と StreamName は、文字、数字、ハイフン (-)、アンダースコア (_)、等号 (=) をサポートしています。最大長は 256 文字です。
uri = "rtmp://example.aliyundoc.com/liveApp/liveStream"
# キー。アップストリーミング URL を生成するには、アップストリーミング ドメインのキーを使用します。ストリーミング URL を生成するには、ストリーミング ドメインのキーを使用します。
key = "<input private key>"
# exp 値は、秒単位で測定される UNIX タイムスタンプです。実際の有効期限は、exp 値 + ドメイン名に設定された有効期間です。
# たとえば、exp を現在の時刻 + 3600 秒に設定した場合、実際の有効期限は現在の時刻 + 3600 秒 + 有効期間になります。現在の時刻に設定した場合、有効期限は現在の時刻 + 有効期間になります。
exp = int(time.time()) + 1 * 3600
authuri = a_auth(uri, key, exp)
print("URL : %s\nAUTH: %s" %(uri, authuri)) # URL、認証済み
if__name__ == "__main__":
main()
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。次の例では、ドメイン名は example.aliyundoc.com、AppName は liveApp、StreamName は liveStream です。
// アップストリーミング URL とストリーミング URL は同じメソッドを使用して暗号化されます。
// AppName と StreamName は、文字、数字、ハイフン (-)、アンダースコア (_)、等号 (=) をサポートしています。最大長は 256 文字です。
uri := "rtmp://example.aliyundoc.com/liveApp/liveStream"
// キー。アップストリーミング URL を生成するには、アップストリーミング ドメインのキーを使用します。ストリーミング URL を生成するには、ストリーミング ドメインのキーを使用します。
key := "<input private key>"
// exp 値は、秒単位で測定される UNIX タイムスタンプです。実際の有効期限は、exp 値 + ドメイン名に設定された有効期間です。
// たとえば、exp を現在の時刻 + 3600 秒に設定した場合、実際の有効期限は現在の時刻 + 3600 秒 + 有効期間になります。現在の時刻に設定した場合、有効期限は現在の時刻 + 有効期間になります。
exp := time.Now().Unix() + 3600
authuri := a_auth(uri, key, exp)
fmt.Printf("URL : %s\nAUTH: %s", uri, authuri) // URL、認証済み
}
<?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。次の例では、ドメイン名は example.aliyundoc.com、AppName は liveApp、StreamName は liveStream です。
// アップストリーミング URL とストリーミング URL は同じメソッドを使用して暗号化されます。
// AppName と StreamName は、文字、数字、ハイフン (-)、アンダースコア (_)、等号 (=) をサポートしています。最大長は 256 文字です。
$uri = "rtmp://example.aliyundoc.com/liveApp/liveStream";
// キー。アップストリーミング URL を生成するには、アップストリーミング ドメインのキーを使用します。ストリーミング URL を生成するには、ストリーミング ドメインのキーを使用します。
$key = "<input private key>";
// exp 値は、秒単位で測定される UNIX タイムスタンプです。実際の有効期限は、exp 値 + ドメイン名に設定された有効期間です。
// たとえば、exp を現在の時刻 + 3600 秒に設定した場合、実際の有効期限は現在の時刻 + 3600 秒 + 有効期間になります。現在の時刻に設定した場合、有効期限は現在の時刻 + 有効期間になります。
$exp = time() + 3600;
$authuri = a_auth($uri, $key, $exp);
echo "URL :" . $uri; // URL
echo PHP_EOL;
echo "AUTH:" . $authuri; // 認証済み
?>
using System;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Text;
public class Test
{
public static void Main()
{
// 暗号化する URL。次の例では、ドメイン名は example.aliyundoc.com、AppName は liveApp、StreamName は liveStream です。
// アップストリーミング 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 タイムスタンプです。実際の有効期限は、exp 値 + ドメイン名に設定された有効期間です。
// たとえば、exp を現在の時刻 + 3600 秒に設定した場合、実際の有効期限は現在の時刻 + 3600 秒 + 有効期間になります。現在の時刻に設定した場合、有効期限は現在の時刻 + 有効期間になります。
string exp = Convert.ToInt64((DateTime.Now - dateStart).TotalSeconds+3600).ToString();
string authUri = aAuth(uri, key, exp);
Console.WriteLine (String.Format("URL :{0}",uri)); // URL
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 を使用してストリームをアップストリーミングおよび再生するには、「ライブ ストリームのアップストリーミング」および「ライブ ストリームの再生」をご参照ください。
Java 用サーバー SDK
SDK の詳細については、「Java 用サーバー SDK を使用する」をご参照ください。
URL 署名
URL 署名の詳細については、「アップストリーミング URL とストリーミング URL の署名」をご参照ください。