すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo VOD:アダプティブビットレートストリーミングを実装する

最終更新日:Jul 10, 2025

ApsaraVideo VOD は、動画をさまざまなビットレートのビデオストリームにトランスコードし、これらのビデオストリームを1つのファイルにパッケージ化します。 このファイルは、利用可能なビットレートや解像度などの情報を含むストリーミングプロファイルも提供します。 これにより、メディアプレーヤーはネットワークの状態に基づいて可変ビットレート間で切り替えることができます。

説明

最も広く使用されているアダプティブビットレートストリーミングプロトコルは、HTTP Live Streaming(HLS)とDynamic Adaptive Streaming over HTTP(DASH)です。 ApsaraVideo VOD は HLS アダプティブビットレートストリーミングのみをサポートしています。 詳細については、「アダプティブビットレートストリーミング」をご参照ください。

説明

ApsaraVideo VOD では、ビデオパッケージングテンプレートと字幕パッケージングテンプレートを使用して、異なるビットレートのビデオストリームと異なる言語の字幕をパッケージ化できます。 これにより、メディアプレーヤーはビットレートと字幕を切り替えることができます。 コンソールと API 操作を使用して、アダプティブビットレートストリーミング用のテンプレートを作成できます。

アダプティブビットレートストリーミングにより、メディアプレーヤーは、ネットワークの状態とストリーミングデバイスに基づいて、最適なビデオストリームに自動的に切り替えることができます。 これにより、ビデオ再生の品質が大幅に向上します。 次の表は、ビデオパッケージングテンプレートと通常のトランスコードテンプレートの違いを示しています。

項目

ビデオパッケージングテンプレート

通常のトランスコードテンプレート

パラメーター構成

パッケージングタイプや帯域幅のしきい値など、パッケージングパラメーターが必要です。

なし。

字幕

埋め込み字幕とサイドカー字幕がサポートされています。

API 操作を呼び出すことによってのみ、字幕を埋め込むことができます。

ストリーミングパフォーマンス

メディアプレーヤーは、ネットワーク帯域幅に基づいて、最適なビットレートに自動的に切り替えます。

指定されたビットレートのストリームが再生されます。

使用上の注意

  • ビデオパッケージングテンプレートは、HLS 暗号化をサポートしていません。 HLS 暗号化が必要な場合は、通常のトランスコードテンプレートを使用してください。

  • 字幕ファイルとビデオソースファイルは、同じ Object Storage Service(OSS)バケットに保存する必要があります。

  • 字幕パッケージングテンプレートは個別に作成できません。 字幕パッケージングテンプレートを使用するには、ビデオパッケージングテンプレートに関連付ける必要があります。

  • 字幕パッケージングテンプレートは、Web Video Text Tracks(WebVTT)形式の字幕ファイルのみをサポートしています。 API 操作を呼び出して Language パラメーターを変更する場合、Language パラメーターの元の値を使用して字幕ファイルを検索し、そのファイルを Language パラメーターの新しい値として指定した言語の字幕ファイルに置き換えることができます。 ファイル内の字幕の言語を直接変更することはできません。 Language パラメーターの元の値で示された言語の字幕ファイルが見つからない場合、操作は失敗します。

  • トランスコードには料金が発生します。 詳細については、ApsaraVideo VOD 料金ページをご覧ください。

コンソールの使用

  1. アダプティブビットレートストリーミング用のトランスコードテンプレートグループを作成します。

    説明

    アダプティブビットレートストリーミングのパッケージングテンプレートのみが必要な場合は、通常のトランスコードテンプレートを作成する必要はありません。 不要なトランスコード料金を避けるために、既存の通常のトランスコードテンプレートをすべて削除する必要があります。

    1. ApsaraVideo VOD コンソールにログオンします。 左側のナビゲーションウィンドウで、[構成管理] > [メディア処理] > [トランスコードテンプレートグループ] を選択します。

    2. トランスコードテンプレートグループページで、[トランスコードテンプレートグループの作成] をクリックします。

    3. 表示されるページで、テンプレートグループの名前を指定します。

    4. [オーディオとビデオのパッケージングテンプレート] セクションで、[テンプレートの追加] をクリックし、パラメーターを設定します。

      • [基本情報] セクションでは、[カプセル化形式][HLS] に固定されています。 [ビデオパッケージング] セクションには、次のパラメーターが含まれています。

        • [パッケージングタイプ]:値は [HLS パッケージング] に固定されています。

        • [帯域幅のしきい値]:メディアプレーヤーが特定のビットレートのビデオストリームを選択する基準となるネットワーク帯域幅。 単位:bit/s。 デフォルト値を保持することをお勧めします。

      • 通常のトランスコードテンプレートを作成するのと同じ方法で、[基本情報][ビデオパラメーター][オーディオパラメーター][詳細パラメーター] を構成できます。 詳細については、「トランスコードテンプレート」をご参照ください。

      • [テンプレートの追加] を使用して、ビジネス要件に基づいて、異なるビットレート、解像度、ビデオ品質の複数のビデオパッケージングテンプレートを作成できます。 ビデオ品質には、高解像度、標準解像度、低解像度が含まれます。

    5. パラメーターを構成した後、[保存] をクリックします。

  2. 動画をさまざまなビットレートのストリームにトランスコードします。

    1. ApsaraVideo VOD コンソールで、[メディアファイル] > [オーディオ/ビデオ] を選択します。

    2. [ビデオとオーディオ] ページで、トランスコードするビデオを見つけ、「操作」列の [メディア処理] をクリックします。

    3. メディア処理ダイアログボックスで、処理タイプを [トランスコードテンプレートグループを使用] に設定し、手順 1 で作成したトランスコードテンプレートグループを選択して、[OK] をクリックしてメディア処理を開始します。

    image

  3. ビデオストリームを表示します。

    • 次の図は、アダプティブビットレートストリーミングの実装後に生成されるビデオストリームを示しています。 この例では、2つのストリームは固定ビットレートを使用し、1つのストリームはネットワーク帯域幅に基づいてビットレートを調整します。

      ApsaraVideo VOD コンソールで、[メディアファイル] > [オーディオ/ビデオ] を選択し、前の手順で処理したビデオを見つけ、「操作」列の [管理] をクリックします。 表示されるページで、[ビデオ URL] タブをクリックします。

      效果展示_1

    • 前の図のアダプティブビットレートストリームの URL は、再生に使用されます。

      ApsaraVideo Player のオンライン設定ページの [基本] タブで、アダプティブビットレートストリームの URL を入力し、[プレビュー] タブでビデオ再生効果を確認します。

手順

  1. アダプティブビットレートストリーミング用のトランスコードテンプレートグループを作成します。

    次のサンプルコードは、通常のトランスコードテンプレート、アダプティブビットレートストリーミングのパッケージングテンプレート、および字幕パッケージングテンプレートを構成するために使用されます。 要件に基づいてサンプルコードを使用できます。

    説明

    アダプティブビットレートストリーミングのパッケージングテンプレートのみが必要な場合は、通常のトランスコードテンプレートを作成する必要はありません。 不要なトランスコード料金を避けるために、既存の通常のトランスコードテンプレートをすべて削除する必要があります。

        /**
         * サンプルコード
         */
        public static void main(String[] args) throws ClientException {
            // Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作を呼び出す権限があります。 API 操作の呼び出しや日常の O&M の実行には、RAM ユーザーの AccessKey ペアを使用することをお勧めします。
            // AccessKey ペア(AccessKey ID と AccessKey シークレット)をプロジェクトコードに含めないでください。 そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。
            // この例では、ApsaraVideo VOD は環境変数から AccessKey ペアを読み取り、API アクセスのための ID 検証を実装します。 サンプルコードを実行する前に、環境変数 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", "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 パッケージング");
            // 定義。
            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", "複数字幕パッケージング");
            // 定義。
            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 エンドポイント。 HTTPS URL と Alibaba Cloud CDN のドメイン名はサポートされていません。
            注:字幕ファイルとビデオソースファイルは、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","中国語-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","英語-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;
        }
  2. 動画をさまざまなビットレートのストリームにトランスコードします。

         public static void main(String[] args) {
           // cn-shanghai など、ApsaraVideo VOD にアクセスするリージョンに基づいて regionId パラメーターを設定します。
           String regionId = "cn-shanghai";
           // Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作を呼び出す権限があります。 API 操作の呼び出しや日常の O&M の実行には、RAM ユーザーの AccessKey ペアを使用することをお勧めします。
           // AccessKey ペア(AccessKey ID と AccessKey シークレット)をプロジェクトコードに含めないでください。 そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。
           // この例では、ApsaraVideo VOD は環境変数から AccessKey ペアを読み取り、API アクセスのための ID 検証を実装します。 サンプルコードを実行する前に、環境変数 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();
            // overrideParams パラメーター。
            request.setOverrideParams(overrideParams.toJSONString());
            return client.getAcsResponse(request);
        }
    
        // overrideParams パラメーターを構成するためのサンプルコード。
        public static JSONObject buildOverrideParams() {
            JSONObject overrideParams = new JSONObject();
            // パッケージ化された字幕ファイルを置き換えるための設定。
            JSONObject packageSubtitleSetting = new JSONObject();
            JSONArray packageSubtitleList = new JSONArray();
            JSONObject packageSubtitle = new JSONObject();
          // 置き換える字幕ファイルの OSS エンドポイントを含む字幕テンプレートの ID。
            packageSubtitle.put("SubtitlePackageTemplateId", "69fa6ee58****e8492c76168****");
          // Language パラメーターの値は、置き換える字幕ファイルを検索するためにのみ使用されます。 ファイル内の字幕の言語は変更されません。 指定された言語の字幕ファイルが存在しない場合、置換は失敗します。
            packageSubtitle.put("Language", "cn");
            // 字幕ファイルの OSS エンドポイント。 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;
        }
  3. ビデオストリームを表示します。

    • 次の図は、アダプティブビットレートストリーミングの実装後に生成されるビデオストリームを示しています。 この例では、2 つのストリームは固定ビットレートを使用し、1 つのストリームはネットワーク帯域幅に基づいてビットレートを調整します。

      ApsaraVideo VOD コンソールで、[メディアファイル] > [オーディオ/ビデオ] を選択し、前の手順で処理したビデオを見つけ、「操作」列の [管理] をクリックします。 表示されるページで、[ビデオ URL] タブをクリックします。

      效果展示_1

    • 前の図のアダプティブビットレートストリームの URL は、再生に使用されます。

      ApsaraVideo Player のオンライン設定ページの [基本] タブで、アダプティブビットレートストリームの URL を入力し、[プレビュー] タブでビデオ再生効果を確認します。