アダプティブビットレートストリーミングは、音声または動画ファイルを異なるビットレートと解像度の複数のストリームにパッケージ化し、これらのストリームをリストしたマニフェストファイルを生成します。プレーヤーは、このマニフェストを使用して、ネットワーク状況に基づいてストリームを動的に切り替え、視聴体験を向上させます。
アダプティブビットレートストリーミングで最も広く使用されている形式は HLS と DASH です。現在、ApsaraVideo VOD は HLS 形式のアダプティブビットレートストリームの生成のみをサポートしています。詳細については、「アダプティブビットレートトランスコーディング」をご参照ください。
概要
ApsaraVideo VOD は、動画パッケージングテンプレートと字幕パッケージングテンプレートを提供し、視聴者が異なる解像度や字幕言語を切り替えられるアダプティブビットレートストリーミングファイルを生成します。これらのテンプレートは、ApsaraVideo VOD コンソールを使用するか、API を呼び出すことで作成できます。
従来の単一ビットレート再生と比較して、アダプティブビットレートストリーミングでは、プレーヤーが視聴者のネットワーク状況とデバイスに基づいて最適なストリームを選択できます。これにより、視聴体験が大幅に向上します。次の表に、動画パッケージングテンプレートと通常トランスコードテンプレートの違いを示します。
|
項目 |
動画パッケージングテンプレート |
通常トランスコードテンプレート |
|
パラメーター設定 |
パッケージングタイプや帯域幅しきい値などのパッケージングパラメーターが必要です。 |
これらのパラメーターは不要です。 |
|
字幕の追加 |
埋め込み字幕とサイドカー字幕を追加できます。 |
API の呼び出しによってのみ、埋め込み字幕を追加できます。 |
|
再生体験 |
プレーヤーは、ネットワーク帯域幅に基づいて再生するストリームを自動的に選択します。 |
指定されたストリームのみ再生できます。 |
注意事項
-
動画パッケージングテンプレートは、標準暗号化をサポートしていません。標準暗号化を使用するには、通常トランスコードテンプレートを使用する必要があります。
-
字幕ファイルとソース動画ファイルは、同じリージョンの同じ OSS バケットに保存する必要があります。
-
字幕パッケージングテンプレートは、単独で作成または使用することはできません。動画パッケージングテンプレートと一緒に使用する必要があります。
-
字幕パッケージングテンプレートは VTT 形式のみをサポートします。API 呼び出しで字幕パラメーターをオーバーライドする場合、
Languageパラメーターは置換する字幕ファイルを特定するためにのみ使用され、言語の値自体は変更されません。存在しない言語の字幕を置き換えることはできません。 -
トランスコーディングは有料サービスです。詳細については、「料金」をご参照ください。
コンソールでのアダプティブビットレートストリーミングの設定
-
アダプティブビットレートストリーミング用のトランスコードテンプレートグループを作成します。
説明動画パッケージングテンプレートのみが必要な場合は、通常トランスコードテンプレートを作成する必要はありません。不要なトランスコーディング料金を避けるため、不要な通常トランスコードテンプレートは削除できます。
-
ApsaraVideo VOD コンソールにログインします。 左側のナビゲーションペインで、設定の管理 > ApsaraVideo Media Processing の設定 > トランスコードテンプレートグループを選択します。
-
「トランスコードテンプレートグループ」タブで、トランスコードテンプレートグループの追加 をクリックします。
-
テンプレートグループの名前を指定します。
-
オーディオ/ビデオパッケージングテンプレートセクションで、テンプレートの追加 をクリックして、ビデオパッケージングテンプレートを設定します。
-
基本情報 セクションでは、カプセル化形式 は HLS に固定されています。動画パッケージングパラメーターセクションのパラメーターは次のとおりです。
-
[パッケージングタイプ]: このパラメーターはHLS パッケージングに固定されています。
-
帯域幅のしきい値:プレーヤーが現在のネットワーク状況に基づいて再生するストリームを決定するために使用する帯域幅を指定します。単位:bps。推奨設定の使用を推奨します。
-
-
基本情報、ビデオパラメーター、オーディオパラメーター、および高度なパラメーター の各セクションは、通常のトランスコードテンプレートと同様に設定します。 詳細については、「トランスコードテンプレート」をご参照ください。
-
必要に応じて、テンプレートの追加 をクリックし、ビットレート、解像度、画質が異なる複数のビデオパッケージングテンプレートを作成します。
-
-
ビデオパッケージングテンプレートを作成した後、保存をクリックします。
-
-
アダプティブビットレートトランスコーディングを開始します。
-
ApsaraVideo VOD コンソールで、メディアファイル > [オーディオ/ビデオ] を選択します。
-
[音声/動画] ページで、処理したい動画を探し、「操作」列にある処理をクリックします。
-
トランスコードテンプレートグループでの処理 を トランスコードテンプレートグループでの処理 に設定します。 前の手順で作成したトランスコードテンプレートグループを選択し、OK をクリックしてメディア処理ジョブを開始します。
-
-
結果を表示します。
-
パッケージ化されたストリーム (2 つのトランスコード済みストリームと 1 つのアダプティブストリーム) を表示します。
ApsaraVideo VOD コンソールで、メディアファイル > [オーディオ/ビデオ] の順に選択し、処理済みの動画を見つけて 管理 をクリックした後、ビデオ URL タブをクリックします。
[動画 URL] タブには、[オリジナルファイル] (MP4、1920×1080、293.17 MB)、[HD] (M3U8、プライベート暗号化、1280×720、48.24 MB)、[スムーズ] (M3U8、640×360、14.55 MB)、[アダプティブ] (M3U8) の 4 つのエントリが表示されます。
-
再生結果 (アダプティブストリームの再生) を表示します。
ApsaraVideo Player の [基本設定] タブで、[動画 URL] タブのアダプティブストリーム URL を入力し、[プレビュー] タブをクリックして再生を確認します。
動画プレーヤーの右側で、[字幕] パネルを展開します。「Chinese-test」や「English-test」などの字幕トラックが表示されます。「English-test」を選択すると、対応する英語の字幕が動画画面の下部に表示されます。
-
操作手順
-
アダプティブビットレートストリーミング用のトランスコードテンプレートグループを作成します。
サンプルコードは、通常トランスコードテンプレート、動画パッケージングテンプレート、および字幕パッケージングテンプレートの設定方法を示しています。シナリオに関連する設定を使用してください。
説明動画パッケージングテンプレートのみが必要な場合は、通常トランスコードテンプレートを作成する必要はありません。不要なトランスコーディング料金を避けるため、不要な通常トランスコードテンプレートは削除できます。
/** * 次のコードは、API を呼び出す方法の例を示しています。 */ public static void main(String[] args) throws ClientException { // Alibaba Cloud アカウントの AccessKey ペアは、すべての API を呼び出す権限を持っています。RAM ユーザーを使用して API を呼び出すか、日常の O&M を実行することを推奨します。 // AccessKey ID と AccessKey シークレットをプロジェクトコードに保存しないことを強く推奨します。保存すると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが脅かされる可能性があります。 // この例では、環境変数を使用して ID 検証用の AccessKey ペアを取得する方法を示します。サンプルコードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。 DefaultAcsClient client = initVodClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); AddTranscodeTemplateGroupResponse response = new AddTranscodeTemplateGroupResponse(); try { response = addTranscodeTemplateGroup(client); System.out.println("TranscodeTemplateGroupId = " + response.getTranscodeTemplateGroupId()); } catch (Exception e) { System.out.println("ErrorMessage = " + e.getLocalizedMessage()); } System.out.println("RequestId = " + response.getRequestId()); } /** * トランスコードテンプレートグループを追加します。 */ public static AddTranscodeTemplateGroupResponse addTranscodeTemplateGroup(DefaultAcsClient client) throws Exception { AddTranscodeTemplateGroupRequest request = new AddTranscodeTemplateGroupRequest(); request.setName("grouptest2"); JSONArray transcodeTemplateList = new JSONArray(); // 通常トランスコードテンプレートを設定します。 transcodeTemplateList.add(buildNormalTranscodeConfig()); // 動画パッケージングテンプレートを設定します。 transcodeTemplateList.add(buildVideoPackageConfig()); // 字幕パッケージングテンプレートを設定します。 transcodeTemplateList.add(buildSubtitlePackageConfig()); request.setTranscodeTemplateList(transcodeTemplateList.toJSONString()); System.out.println("request = " + JSONObject.toJSONString(request)); return client.getAcsResponse(request); } /** * 追加するトランスコードテンプレートの設定データを構築します。 * * @return */ public static JSONObject buildNormalTranscodeConfig() { JSONObject transcodeTemplate = new JSONObject(); // テンプレートのタイプ。有効な値:Normal (通常トランスコードテンプレート)、VideoPackage (動画パッケージングテンプレート)、SubtitlePackage (字幕パッケージングテンプレート)。 transcodeTemplate.put("Type","Normal"); // テンプレートの名前。 transcodeTemplate.put("TemplateName", "regular_transcoding_template_mp4"); // 画質。 transcodeTemplate.put("Definition", "HD"); // 動画ストリームのトランスコーディング設定。 JSONObject video = new JSONObject(); video.put("Width", 1280); //video.put("Height", 720); video.put("Bitrate", 1500); video.put("Fps", 25); //video.put("Remove", false); video.put("Codec", "H.264"); video.put("Gop", "250"); video.put("LongShortMode", false); transcodeTemplate.put("Video", video); // 音声ストリームのトランスコーディング設定。 JSONObject audio = new JSONObject(); audio.put("Codec", "AAC"); audio.put("Bitrate", "64"); audio.put("Channels", "2"); audio.put("Samplerate", "32000"); transcodeTemplate.put("Audio", audio); // コンテナ形式。 JSONObject container = new JSONObject(); container.put("Format", "mp4"); transcodeTemplate.put("Container", container); // 字幕置換設定。 JSONObject subtitleSetting = new JSONObject(); JSONArray subtitleList = new JSONArray(); JSONObject subtitle = new JSONObject(); // 字幕ファイルの OSS URL。HTTPS URL はサポートされていません。 subtitle.put("SubtitleUrl", "http://outin-8db8d2****3e1c9256.oss-cn-shanghai.aliyuncs.com/subtitle/3215879C9F724A43BC84C63BE2AA19AF****.srt"); // 字幕コンテンツの文字エンコーディング。有効な値:auto (自動検出)、UTF-8、GBK、BIG5。 subtitle.put("CharEncode", "UTF-8"); subtitleList.add(subtitle); transcodeTemplate.put("SubtitleList", subtitleList); return transcodeTemplate; } /** * 動画パッケージング設定。 * * @return */ private static JSONObject buildVideoPackageConfig() { JSONObject transcodeTemplate = new JSONObject(); // テンプレートのタイプ。有効な値:Normal (通常トランスコードテンプレート)、VideoPackage (動画パッケージングテンプレート)、SubtitlePackage (字幕パッケージングテンプレート)。 transcodeTemplate.put("Type","VideoPackage"); // テンプレートの名前。 transcodeTemplate.put("TemplateName", "HLS_LD_packaging"); // 画質。 transcodeTemplate.put("Definition", "LD"); // 動画ストリームのトランスコーディング設定。 JSONObject video = new JSONObject(); video.put("Width", 1280); //video.put("Height", 720); video.put("Bitrate", 1500); video.put("Fps", 25); //video.put("Remove", false); video.put("Codec", "H.264"); video.put("Gop", "250"); video.put("LongShortMode", false); transcodeTemplate.put("Video", video); // 音声ストリームのトランスコーディング設定。 JSONObject audio = new JSONObject(); audio.put("Codec", "AAC"); audio.put("Bitrate", "64"); audio.put("Channels", "2"); audio.put("Samplerate", "32000"); transcodeTemplate.put("Audio", audio); // コンテナ形式。 JSONObject container = new JSONObject(); container.put("Format", "m3u8"); transcodeTemplate.put("Container", container); // コンテナ形式が M3U8 に設定されている場合は、MuxConfig を設定する必要があります。 JSONObject muxConfig = new JSONObject(); JSONObject segment = new JSONObject(); segment.put("Duration", "10");// 単位:秒。 muxConfig.put("Segment", segment); transcodeTemplate.put("MuxConfig",muxConfig); // パッケージング設定。 JSONObject packageSetting = new JSONObject(); // パッケージングタイプ。HLS アダプティブビットレートパッケージングの場合は、値を HLSPackage に設定します。 packageSetting.put("PackageType","HLSPackage"); JSONObject packageConfig = new JSONObject(); packageConfig.put("BandWidth","500000"); packageSetting.put("PackageConfig",packageConfig); transcodeTemplate.put("PackageSetting",packageSetting); return transcodeTemplate; } /** * 字幕パッケージング設定。 * * @return */ private static JSONObject buildSubtitlePackageConfig() { JSONObject transcodeTemplate = new JSONObject(); // テンプレートのタイプ。有効な値:Normal (通常トランスコードテンプレート)、VideoPackage (動画パッケージングテンプレート)、SubtitlePackage (字幕パッケージングテンプレート)。 transcodeTemplate.put("Type","SubtitlePackage"); // テンプレートの名前。 transcodeTemplate.put("TemplateName", "multi_subtitle_packaging"); // 画質。 transcodeTemplate.put("Definition", "HD"); // 動画ストリームのトランスコーディング設定。 JSONObject video = new JSONObject(); video.put("Width", 1280); //video.put("Height", 720); video.put("Bitrate", 1500); video.put("Fps", 25); //video.put("Remove", false); video.put("Codec", "H.264"); video.put("Gop", "250"); video.put("LongShortMode", false); transcodeTemplate.put("Video", video); // 音声ストリームのトランスコーディング設定。 JSONObject audio = new JSONObject(); audio.put("Codec", "AAC"); audio.put("Bitrate", "64"); audio.put("Channels", "2"); audio.put("Samplerate", "32000"); transcodeTemplate.put("Audio", audio); // コンテナ形式。 JSONObject container = new JSONObject(); container.put("Format", "m3u8"); transcodeTemplate.put("Container", container); // コンテナ形式が M3U8 に設定されている場合は、MuxConfig を設定する必要があります。 JSONObject muxConfig = new JSONObject(); JSONObject segment = new JSONObject(); segment.put("Duration", "10");// 単位:秒。 muxConfig.put("Segment", segment); transcodeTemplate.put("MuxConfig",muxConfig); /* 字幕ファイルの OSS URL。HTTPS URL と CDN アクセラレーションドメイン名はサポートされていません。 注:字幕ファイルは、ソース動画ファイルと同じリージョンおよび OSS バケット (例:cn-shanghai) にある必要があります。 */ // 字幕パッケージングテンプレート。 JSONObject subtitlePackageConfig = new JSONObject(); subtitlePackageConfig.put("Type","SubtitlePackage"); // 字幕パッケージング設定。 JSONObject subtitlePackageSetting = new JSONObject(); // パッケージングタイプ。HLS アダプティブビットレートパッケージングの場合は、値を HLSPackage に設定します。 subtitlePackageSetting.put("PackageType","HLSPackage"); JSONArray subtitleExtractConfigs = new JSONArray(); // 字幕 1 JSONObject subtitleExtractConfig = new JSONObject(); JSONArray subtitleUrlList = new JSONArray(); subtitleUrlList.add("http://outin-bfefbb9****e1c7426.oss-cn-shanghai.aliyuncs.com/subtitle/260447BA31D24F9E9E7752BF73F1319B****.vtt"); subtitleExtractConfig.put("SubtitleUrlList",subtitleUrlList); subtitleExtractConfig.put("Language","cn"); subtitleExtractConfig.put("Format","vtt"); subtitleExtractConfig.put("Name","Chinese-test"); // 字幕 2 JSONObject subtitleExtractConfig2 = new JSONObject(); JSONArray subtitleUrlList2 = new JSONArray(); subtitleUrlList2.add("http://outin-bfefbb9****3e1c7426.oss-cn-shanghai.aliyuncs.com/subtitle/661C67325E0543F0BB8CA7AAB756E6D8****.vtt"); subtitleExtractConfig2.put("SubtitleUrlList",subtitleUrlList2); subtitleExtractConfig2.put("Language","en-US"); subtitleExtractConfig2.put("Format","vtt"); subtitleExtractConfig2.put("Name","English-test"); subtitleExtractConfigs.add(subtitleExtractConfig); subtitleExtractConfigs.add(subtitleExtractConfig2); subtitlePackageSetting.put("SubtitleExtractConfigList",subtitleExtractConfigs); transcodeTemplate.put("PackageSetting",subtitlePackageSetting); return transcodeTemplate; } public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException { // ApsaraVideo VOD が有効化されているリージョン。 String regionId = "cn-shanghai"; DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; } -
アダプティブビットレートトランスコーディングを開始します。
public static void main(String[] args) { // サービスのアクセスポイントに基づいて regionId を設定します。たとえば、上海からサービスにアクセスする場合は、値を cn-shanghai に設定します。 String regionId = "cn-shanghai"; // Alibaba Cloud アカウントの AccessKey ペアは、すべての API を呼び出す権限を持っています。RAM ユーザーを使用して API を呼び出すか、日常の O&M を実行することを推奨します。 // AccessKey ID と AccessKey シークレットをプロジェクトコードに保存しないことを強く推奨します。保存すると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが脅かされる可能性があります。 // この例では、環境変数を使用して ID 検証用の AccessKey ペアを取得する方法を示します。サンプルコードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。 DefaultProfile profile = DefaultProfile.getProfile(regionId, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IAcsClient client = new DefaultAcsClient(profile); String videoId = "76913816d****8e57e8c2952"; String templateId = "4733b3a5****ae36ac22d34"; try { SubmitTranscodeJobsResponse response = submitTranscodeJobs(client,videoId,templateId); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } } /** * トランスコーディングジョブを送信します。 * 動画 ID とテンプレートグループ ID が渡されます。 * * @param client * @param videoId * @param templateGroupId * @return * @throws Exception */ public static SubmitTranscodeJobsResponse submitTranscodeJobs(DefaultAcsClient client, String videoId, String templateGroupId) throws Exception { SubmitTranscodeJobsRequest request = new SubmitTranscodeJobsRequest(); // トランスコードする動画の ID。 request.setVideoId(videoId); // トランスコードテンプレートグループの ID。 request.setTemplateGroupId(templateGroupId); // トランスコーディングジョブの優先度。デフォルト値:6。値が大きいほど優先度が高くなります。有効な値:1〜10。 request.setPriority("8"); JSONObject overrideParams = buildOverrideParams(); // オーバーライドパラメーター。 request.setOverrideParams(overrideParams.toJSONString()); return client.getAcsResponse(request); } // 次のコードは、字幕置換のためのオーバーライドパラメーターを構築する方法の例を示しています。 public static JSONObject buildOverrideParams() { JSONObject overrideParams = new JSONObject(); // パッケージ化された字幕のオーバーライド設定。 JSONObject packageSubtitleSetting = new JSONObject(); JSONArray packageSubtitleList = new JSONArray(); JSONObject packageSubtitle = new JSONObject(); // トランスコードテンプレートグループでオーバーライドされる字幕テンプレートの ID。 packageSubtitle.put("SubtitlePackageTemplateId", "69fa6ee58****e8492c76168****"); // Language パラメーターは、置換する字幕ファイルを見つけるためにのみ使用されます。言語の値自体は置換されません。指定された言語が存在しない場合、置換は失敗します。 packageSubtitle.put("Language", "cn"); // 字幕ファイルの OSS URL。HTTPS URL はサポートされていません。字幕ファイルは動画と同じリージョンにある必要があります。 packageSubtitle.put("SubtitleUrl", "http://outin-bfefbb9****3e1c7426.oss-cn-shanghai.aliyuncs.com/subtitle/043956117D0C475EAB0CE8C4F7294221****.vtt"); packageSubtitleList.add(packageSubtitle); packageSubtitleSetting.put("PackageSubtitleList", packageSubtitleList); overrideParams.put("PackageSubtitleSetting", packageSubtitleSetting); return overrideParams; } -
結果を表示します。
-
パッケージ化されたストリーム (2 つのトランスコード済みストリームと 1 つのアダプティブストリーム) を表示します。
ApsaraVideo VOD コンソールで、メディアファイル > [オーディオ/ビデオ] の順に選択し、処理済みの動画を見つけて 管理 をクリックした後、ビデオ URL タブをクリックします。
[動画 URL] タブには、[オリジナルファイル] (MP4、1920×1080、293.17 MB)、[HD] (M3U8、プライベート暗号化、1280×720、48.24 MB)、[スムーズ] (M3U8、640×360、14.55 MB)、[アダプティブ] (M3U8) の 4 つのエントリが表示されます。
-
再生結果 (アダプティブストリームの再生) を表示します。
ApsaraVideo Player の [基本設定] タブで、[動画 URL] タブのアダプティブストリーム URL を入力し、[プレビュー] タブをクリックして再生を確認します。
動画プレーヤーの右側で、[字幕] パネルを展開します。「Chinese-test」や「English-test」などの字幕トラックが表示されます。「English-test」を選択すると、対応する英語の字幕が動画画面の下部に表示されます。
-