ApsaraVideo VOD は、ビデオをさまざまなビットレートのビデオストリームにトランスコードし、これらのストリームを単一のファイルにパッケージングします。このファイルは、利用可能なビットレートや解像度などの情報を含むストリーミングプロファイルも提供します。これにより、メディアプレーヤーはネットワーク状況に応じて可変ビットレートを切り替えることができます。
最も広く使用されているアダプティブビットレートストリーミングプロトコルは、HTTP Live Streaming (HLS) と Dynamic Adaptive Streaming over HTTP (DASH) です。ApsaraVideo VOD は、HLS アダプティブビットレートストリーミングのみをサポートしています。詳細については、「アダプティブビットレートストリーミング」をご参照ください。
概要
ApsaraVideo VOD では、ビデオパッケージングテンプレートと字幕パッケージングテンプレートを使用して、異なるビットレートのビデオストリームと異なる言語の字幕をパッケージングできます。これにより、メディアプレーヤーはビットレートと字幕を切り替えることができます。アダプティブビットレートストリーミング用のテンプレートは、コンソールおよび API 操作を使用して作成できます。
アダプティブビットレートストリーミングにより、メディアプレーヤーはネットワーク状況やストリーミングデバイスに基づいて、最適なビデオストリームに自動的に切り替えることができます。これにより、ビデオ再生の品質が大幅に向上します。次の表では、ビデオパッケージングテンプレートと通常のトランスコーディングテンプレートの違いについて説明します。
相違点 | ビデオパッケージングテンプレート | 通常のトランスコーディングテンプレート |
パラメーター設定 | パッケージングタイプや帯域幅しきい値など、パッケージングパラメーターが必要です。 | このパラメーターは設定されません。 |
字幕 | 埋め込み字幕とサイドカー字幕がサポートされています。 | 字幕は API 操作の呼び出しによってのみ埋め込むことができます。 |
ストリーミングパフォーマンス | メディアプレーヤーは、ネットワーク帯域幅に基づいて最適なビットレートに自動的に切り替えます。 | 指定されたストリームのみを再生できます。 |
注意事項
ビデオパッケージングテンプレートは標準暗号化をサポートしていません。標準暗号化が必要な場合は、通常のトランスコーディングテンプレートを使用してください。
字幕ファイルとビデオメザニンファイルは、同一リージョンの同じ Object Storage Service (OSS) バケットに保存する必要があります。
字幕パッケージングテンプレートは単独では作成できません。字幕パッケージングテンプレートを使用するには、ビデオパッケージングテンプレートに関連付ける必要があります。
字幕パッケージングテンプレートは、Web Video Text Tracks (WebVTT) 形式の字幕ファイルのみをサポートしています。API 操作を呼び出して `Language` パラメーターを変更する場合、元の `Language` パラメーターの値を使用して字幕ファイルを検索し、そのファイルを `Language` パラメーターの新しい値として指定した言語の字幕ファイルに置き換えることができます。ファイル内の字幕の言語を直接変更することはできません。元の `Language` パラメーターの値で示された言語の字幕ファイルが見つからない場合、操作は失敗します。
トランスコーディングサービスは課金対象です。詳細については、「課金」をご参照ください。
コンソールでの操作
アダプティブビットレートストリーミング用のトランスコーディングテンプレートグループを作成します。
説明アダプティブビットレートストリーミング用のパッケージングテンプレートのみが必要な場合は、通常のトランスコーディングテンプレートを作成する必要はありません。不要なトランスコーディング料金を避けるために、既存のすべての通常のトランスコーディングテンプレートを削除する必要があります。
ApsaraVideo VOD コンソールにログインします。左側のナビゲーションウィンドウで、設定の管理 > ApsaraVideo Media Processing の設定 > トランスコードテンプレートグループ を選択します。
[トランスコーディングテンプレートグループ] タブで、トランスコードテンプレートグループの追加 をクリックして、[トランスコーディングテンプレートの追加] ページに移動します。
テンプレートグループの名前を設定します。
[オーディオ/ビデオパッケージングテンプレート] セクションで、テンプレートの追加 をクリックしてテンプレートパラメーターを設定します。
基本情報 セクションの カプセル化形式 が HLS に設定されている場合、オーディオとビデオのパッケージングパラメーターセクションで次のパラメーターを使用できます。
パッケージングタイプ を HLS パッケージング に設定します。
帯域幅のしきい値:メディアプレーヤーが現在のネットワーク状況に基づいてストリームを選択するために使用するしきい値 (単位:bit/s) です。推奨値を使用することを推奨します。
基本情報、ビデオパラメーター、オーディオパラメーター、および高度なパラメーターセクションでパラメーターを設定する方法の詳細については、「トランスコードテンプレート」をご参照ください。
テンプレートの追加 をクリックして、異なるビットレート、解像度、および定義を持つ複数のビデオパッケージングテンプレートを作成します。
オーディオ/ビデオパッケージングテンプレートを設定した後、保存 をクリックします。
ビデオを異なるビットレートのストリームにトランスコードします。
ApsaraVideo VOD コンソールで、メディアファイル > [オーディオ/ビデオ] を選択します。
[オーディオ/ビデオ] ページで、対象のビデオの 処理 をクリックします。
[処理タイプ] で トランスコードテンプレートグループでの処理 を選択します。[トランスコーディングテンプレートグループ] で、ステップ 1 で作成したトランスコーディングテンプレートグループを選択し、OK をクリックしてメディア処理を開始します。

結果の表示
アダプティブビットレートパッケージングによって生成されたストリームを表示します。出力には、2 つのトランスコード済みストリームと 1 つのアダプティブストリームが含まれます。
ApsaraVideo VOD コンソールで、メディアファイル > [オーディオ/ビデオ] を選択します。前のステップで処理したビデオが含まれる行で、管理 をクリックします。次に、ビデオ URL タブを選択します。

再生をプレビューします。この例では、アダプティブストリームが再生に使用されます。
ApsaraVideo Player の [基本設定] ページで、再生 URL ([ビデオ URL] タブのアダプティブ URL) を入力します。[再生プレビュー] ページで、再生をプレビューできます。
操作手順
アダプティブビットレートストリーミング用のトランスコーディングテンプレートグループを作成します。
次のサンプルコードでは、一般的なトランスコーディングテンプレート、アダプティブビットレートストリーミング用のパッケージングテンプレート、および字幕パッケージングテンプレートが設定されています。要件に応じてサンプルコードを使用できます。
説明アダプティブビットレートストリーミング用のパッケージングテンプレートのみが必要な場合は、一般的なトランスコーディングテンプレートを作成する必要はありません。既存のすべての一般的なトランスコーディングテンプレートを削除する必要があります。そうしないと、これらの一般的なトランスコーディングテンプレートに対して課金される可能性があります。
/** * サンプルコード */ public static void main(String[] args) throws ClientException { // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対するアクセス権限を持っています。RAM ユーザーの AccessKey ペアを使用して API 操作を呼び出すか、日常の O&M を実行することを推奨します。 // AccessKey ペア (AccessKey ID と AccessKey Secret) をプロジェクトコードにハードコーディングしないことを推奨します。ハードコーディングすると、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 // この例では、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", "General transcoding template for 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 エンドポイント。HTTPS URL はサポートされていません。 subtitle.put("SubtitleUrl", "http://outin-8db8d2****3e1c9256.oss-cn-shanghai.aliyuncs.com/subtitle/3215879C9F724A43BC84C63BE2AA19AF****.srt"); //字幕コンテンツのエンコード形式。有効な値:auto、UTF-8、GBK、BIG5。auto に設定すると、システムは自動的にエンコード形式を選択します。 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(); //パッケージングタイプ。値を 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 エンドポイント。CDN の HTTPS URL およびドメイン名はサポートされていません。 注意:字幕ファイルとビデオソースファイルは、cn-shanghai など、同一リージョンの同じ OSS バケットに保存する必要があります。 */ //字幕パッケージングテンプレート。 JSONObject subtitlePackageConfig = new JSONObject(); subtitlePackageConfig.put("Type","SubtitlePackage"); //字幕パッケージング設定。 JSONObject subtitlePackageSetting = new JSONObject(); //パッケージングタイプ。値を 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 Secret をプロジェクトコードにハードコーディングしないことを強く推奨します。ハードコーディングすると、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。 // この例では、環境変数から AccessKey ペアを読み取って API 認証を実装する方法を示します。サンプルコードを実行する前に、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 タブを選択します。

再生をプレビューします。この例では、アダプティブストリームが再生に使用されます。
ApsaraVideo Player の [基本設定] ページで、再生 URL ([ビデオ URL] タブのアダプティブ URL) を入力します。[再生プレビュー] ページで、再生をプレビューできます。