ライブストリームのカプセル化は、ライブストリームを異なるコンテナフォーマットに変換し、さまざまなストリーミングプロトコルで低遅延再生を可能にします。
サポートされるコンテナフォーマット
ApsaraVideo Live は、Real-Time Messaging Protocol (RTMP)、HTTP-FLV、および HTTP Live Streaming (HLS) をサポートしています。遅延を削減し、互換性を向上させるため、ライブストリームのカプセル化は、配信前にクラウド内でストリームを異なるコンテナフォーマットに変換します。
次の表に、サポートされるコンテナフォーマットを示します。
コンテナフォーマット | サポートされるストリーミングプロトコル | サポートされるコーデック |
TS | 低遅延 HLS (LL-HLS) | オーディオ: AAC、OPUS、AC3、EAC3、MP3 ビデオ: H.264、H.265 |
CMAF | LL-HLS、HLS、DASH | オーディオ: AAC ビデオ: H.264、H.265 |
仕組み
ライブストリームのカプセル化は、ストリームを TS または CMAF 形式のセグメントに分割します。システムは、HLS、LL-HLS、または DASH プロトコルを介してセグメントを配信します。各ストリームに対して、システムはセグメント URL を順番に記録したマニフェストファイルを生成します。クライアントがライブストリームをリクエストすると、サーバーは最新のマニフェストを返します。
この機能をライブストリームトランスコーディングおよびタイムシフトと組み合わせることで、ストリーミング体験を向上させることができます。
メリット
低遅延ライブストリーミングの実現
標準的な HLS と比較して、LL-HLS はストリームをより小さな パーシャルセグメント (200 ms ~ 1 秒) に分割します。このアプローチは、プレイリストの再読み込みをブロックし、エンドツーエンドの遅延を 3~5 秒に短縮します。
複数のデバイスとの互換性を向上
デフォルトでは、ApsaraVideo Live は TS コンテナフォーマットを使用して HLS 経由でライブストリームを配信します。この形式は、一部のデバイスやブラウザと互換性がありません。カプセル化を使用してコンテンツを CMAF 形式にパッケージ化することで、より幅広いデバイス、プラットフォーム、およびコーデック (H.265 を含む) をサポートできます。
既存のストリームに影響を与えない
ライブストリームのカプセル化を有効にしても、既存のストリームには影響しません。元の取り込みストリームに基づいて、追加のカプセル化された再生ストリームが生成されるだけです。既存の RTMP、HTTP-FLV、および HLS ストリームは以前と同様に機能し、録画設定も影響を受けません。カプセル化を有効にすると、CMAF および低遅延 HLS (LL-HLS) 形式の新しいストリーミング URL が利用可能になります。
制限事項
GOP サイズ
取り込みストリームの GOP サイズは一貫している必要があります。トランスコードされたストリームをカプセル化する場合は、その GOP サイズも安定していることを確認してください。
各セグメント期間は、GOP サイズの倍数である必要があります。
LL-HLS プロトコル
ネットワーク状態が悪い場合、スタッタリングが増加する可能性があります。カプセル化をマルチビットレートトランスコーディングと併用することを推奨します。これにより、ビットレートが自動的に調整されます。
スタッタリングや再生失敗を防ぐため、GOP サイズを 1 秒または 2 秒に設定してください。
メインストリーミングドメインは、最大 100,000 人の視聴者をサポートできます。この制限を引き上げるには、チケットを送信してください。
設定の伝播
初めてカプセル化設定を追加すると、システムはコンテンツ配信設定を更新します。これらの変更が有効になるまで 3~5 分かかります。
カプセル化設定の作成
コンソールまたは API オペレーションを呼び出して、カプセル化設定を作成します。
進行中のストリームの場合、設定はストリームを再取り込みした後にのみ有効になります。
コンソール
ApsaraVideo Live コンソールにログインします。
左側メニューで、機能管理 > ライブストリームのカプセル化 を選択します。
ストリーミングドメインを選択し、追加 をクリックします。
[カプセル化設定] ダイアログボックスで、次のパラメータを設定します。
パラメータ
説明
AppName
すべてのアプリケーションに適用するには、アスタリスク (
*) を入力します。特定のアプリケーションを対象とするには、取り込み URL のAppNameを入力します。値は 255 文字以内にする必要があります。StreamName
すべてのストリームに適用するには、アスタリスク (
*) を入力します。特定のストリームを対象とするには、ストリーム名を入力します。値は 255 文字以内にする必要があります。プロトコル
コンテナフォーマットと再生プロトコルを選択します。有効な値:
HLS - CMAF
LL-HLS - CMAF
LL-HLS - TS
DASH - CMAF
HLS & DASH - CMAF
セグメント数
マニフェストファイルあたりのセグメント数を指定します。有効な値: 3~5。
セグメント長 (秒)
HLS または DASH の場合: 1~10 の整数を入力します。GOP サイズの倍数に設定してください (推奨 GOP: 5 秒)。
LL-HLS の場合: 1 または 2 を入力します。GOP サイズの倍数に設定してください (推奨 GOP: 1 秒)。
パート長 (ミリ秒)
(LL-HLS のみ): パーシャルセグメントの期間を指定します。有効な値: 200~1,000。セグメント長の 3 分の 1 よりわずかに大きい値を推奨します。
トランスコードストリーム
トランスコードされたストリームをカプセル化するかどうかを指定します。有効な値:
ソースストリームのみ
トランスコードストリームを含む
説明ストリーミングドメインが中国本土以外のライブセンター (シンガポール、ドイツ、日本、またはインドネシア) を使用している場合、再生遅延が増加する可能性があります。本番環境で使用する前に、設定をテストしてください。
[OK] をクリックします。
API
AddLivePackageConfig API を呼び出して、カプセル化設定を追加します。
<Your RegionId>、<Your DomainName>、<Your AppName>、<Your StreamName> などのプレースホルダーを置き換えてください。
有効なプロトコル値については、「AddLivePackageConfig」をご参照ください。
サンプルコード
// このファイルは自動生成されています。編集しないでください。
package demo;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.core.http.HttpClient;
import com.aliyun.core.http.HttpMethod;
import com.aliyun.core.http.ProxyOptions;
import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder;
import com.aliyun.sdk.service.live20161101.models.*;
import com.aliyun.sdk.service.live20161101.*;
import com.google.gson.Gson;
import darabonba.core.RequestConfiguration;
import darabonba.core.client.ClientOverrideConfiguration;
import darabonba.core.utils.CommonUtil;
import darabonba.core.TeaPair;
//import javax.net.ssl.KeyManager;
//import javax.net.ssl.X509TrustManager;
import java.net.InetSocketAddress;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.io.*;
public class AddLivePackageConfig {
public static void main(String[] args) throws Exception {
// HttpClient を設定します。
/*HttpClient httpClient = new ApacheAsyncHttpClientBuilder()
.connectionTimeout(Duration.ofSeconds(10)) // 接続タイムアウト時間を設定します。デフォルトは 10 秒です。
.responseTimeout(Duration.ofSeconds(10)) // レスポンスタイムアウト時間を設定します。デフォルトは 20 秒です。
.maxConnections(128) // 接続プールサイズを設定します。
.maxIdleTimeOut(Duration.ofSeconds(50)) // 接続プールタイムアウトを設定します。デフォルトは 30 秒です。
// プロキシを設定します。
.proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<YOUR-PROXY-HOSTNAME>", 9001))
.setCredentials("<YOUR-PROXY-USERNAME>", "<YOUR-PROXY-PASSWORD>"))
// https 接続の場合は、証明書を設定するか、証明書を無視する必要があります (.ignoreSSL(true))。
.x509TrustManagers(new X509TrustManager[]{})
.keyManagers(new KeyManager[]{})
.ignoreSSL(false)
.build();*/
// 認証情報 (ak、secret、token を含む) を設定します。
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// 環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されていることを確認してください。
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // STS トークンを使用します。
.build());
// クライアントを設定します。
AsyncClient client = AsyncClient.builder()
.region("<Your RegionId>") // リージョン ID
//.httpClient(httpClient) // 設定された HttpClient を使用します。それ以外の場合は、デフォルトの HttpClient (Apache HttpClient) を使用します。
.credentialsProvider(provider)
//.serviceConfiguration(Configuration.create()) // サービスレベルの設定
// クライアントレベルの設定を上書きし、エンドポイント、HTTP リクエストパラメータなどを設定できます。
.overrideConfiguration(
ClientOverrideConfiguration.create()
// エンドポイントについては、https://api.alibabacloud.com/product/live を参照してください。
.setEndpointOverride("live.aliyuncs.com")
//.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
// API リクエストのパラメータを設定します。
AddLivePackageConfigRequest addLivePackageConfigRequest = AddLivePackageConfigRequest.builder()
.regionId("<Your RegionId>")
.domainName("<Your DomainName>")
.appName("<Your AppName>")
.streamName("<Your StreamName>")
.protocol("<Protocol>")
// リクエストレベルの設定を上書きし、HTTP リクエストパラメータなどを設定できます。
// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
.build();
// API リクエストの戻り値を非同期で取得します。
CompletableFuture<AddLivePackageConfigResponse> response = client.addLivePackageConfig(addLivePackageConfigRequest);
// API リクエストの戻り値を同期的に取得します。
AddLivePackageConfigResponse resp = response.get();
System.out.println(new Gson().toJson(resp));
// 戻り値の非同期処理
/*response.thenAccept(resp -> {
System.out.println(new Gson().toJson(resp));
}).exceptionally(throwable -> { // 例外処理
System.out.println(throwable.getMessage());
return null;
});*/
// 最後に、クライアントを閉じます。
client.close();
}
}SDK のセットアップ手順については、「Java SDK の使用」をご参照ください。
設定後も、ソース品質のストリーミング URL には引き続きアクセスできます。
カプセル化されたストリームの取り込みと再生
ストリームの取り込み
スムーズな再生のために、取り込みストリームの GOP サイズを一定に保ってください。
Open Broadcaster Software (OBS) を使用し、次の推奨設定を適用してください。

カプセル化されたストリームの再生
ストリーミング URL を取得します。形式はプロトコルによって異なります。
プロトコル
URL 形式
HLS
http://<DomainName>/<AppName>/<StreamName>.m3u8?aliyunols=on&auth_key=<AuthKey>DASH
http://<DomainName>/<AppName>/<StreamName>.mpd?aliyunols=on&auth_key=<AuthKey>LL-HLS
http://<DomainName>/<AppName>/<StreamName>-llhls.m3u8?aliyunols=on&auth_key=<AuthKey>重要カプセル化されたストリーム URL には、
aliyunols=onパラメータが必須です。URL ジェネレーターを使用してストリーミング URL を生成できます。URL 形式は設定によって異なります。
コンテナフォーマット
プロトコル
生成される URL タイプ
TS
LL-HLS
LL-HLS および HLS
CMAF
LL-HLS
LL-HLS および HLS
CMAF
HLS
HLS
CMAF
DASH
DASH
CMAF
HLS & DASH
HLS および DASH
互換性のあるプレーヤーでストリームを再生します。ApsaraVideo Player を推奨します。
ApsaraVideo Player Web デモを使用するには:

a. [ビデオタイプ] を [ブロードキャスト] に設定します。
b. ストリーミング URL を入力します。
c. [プレビュー] タブをクリックして、ビデオをプレビューします。
重要ApsaraVideo Player Web バージョンを使用するには、HTTPS 証明書を設定し、クロスドメインアクセス用に
Access-Control-Allow-Originヘッダーを設定する必要があります。詳細については、「HTTPS 設定」および「HTTP ヘッダーの設定」をご参照ください。
高度な使用方法
トランスコードストリームのカプセル化
カプセル化とトランスコーディングを組み合わせて、トランスコードされたストリームをパッケージ化できます。
操作手順
ソースストリームのトランスコーディングを設定します。詳細については、「ユースケース」をご参照ください。
カプセル化設定を作成する際、コンソールで [トランスコードストリーム] を [トランスコードストリームを含む] に設定するか、AddLivePackageConfig API で
IgnoreTranscodeをfalseに設定します。// カプセル化プロセスにトランスコードストリームを含めます (デフォルト: true = 除外)。 addLivePackageConfigRequest.setIgnoreTranscode(false);カプセル化されたトランスコードストリームのストリーミング URL を生成します。
デフォルトまたはカスタムトランスコーディングテンプレート:
StreamNameに_<template-id>を追加します。例:http://<DomainName>/<AppName>/<StreamName>_<template-id>-llhls.m3u8?aliyunols=on&auth_key=<AuthKey>マルチビットレートトランスコーディングテンプレート:
StreamNameに_<template-group-id>を追加します。
説明カプセル化とマルチビットレートトランスコーディングを組み合わせることで、アダプティブ再生が可能になり、ネットワーク状態が悪い場合にプレーヤーが自動的に低いビットレートに切り替えることができます。
出力 URL の動作は、使用するトランスコーディングテンプレートのタイプによって異なります。
マルチビットレートトランスコーディングの場合:
カプセル化設定は、トランスコードされたストリームの出力形式を上書きします。たとえば、
DASH - CMAFのカプセル化形式を指定すると、システムはマルチビットレートストリームに対して DASH - CMAF URL のみを生成し、HLS URL は生成しません。デフォルトまたはカスタムトランスコーディングの場合:
元のトランスコードストリーム URL は影響を受けません。代わりに、システムはそれらのトランスコードされたストリームに対して追加のカプセル化された URL を生成します。
互換性のあるプレーヤーでストリームを再生します。
カプセル化されたストリームのタイムシフト
カプセル化されたストリームでタイムシフトを使用できます。詳細については、「タイムシフト」をご参照ください。
タイムシフトが有効になっている場合、タイムシフトされたセグメントの形式は、カプセル化設定で指定されたセグメント長と形式を継承します。
HLS または LL-HLS (CMAF): タイムシフトされたセグメントは CMAF 形式です。
LL-HLS (TS): タイムシフトされたセグメントは TS 形式です。