ApsaraVideo VODは、ビデオを異なるビットレートのビデオストリームにトランスコードし、これらのビデオストリームを1つのファイルにパッケージ化します。 ファイルは、利用可能なビットレートや解像度などの情報を含むストリーミングプロファイルも提供します。 これにより、メディアプレーヤーは、ネットワーク条件に基づいて可変ビットレートを切り替えることができます。
最も広く使用されている適応型ビットレートストリーミングプロトコルは、HTTPライブストリーミング (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料金ページをご覧ください。
コンソールの使用
適応ビットレートストリーミング用のトランスコードテンプレートグループを作成します。
説明アダプティブビットレートストリーミング用のパッケージテンプレートのみが必要な場合は、通常のトランスコードテンプレートを作成する必要はありません。 不要なトランスコード料金を回避するには、既存の通常のトランスコードテンプレートをすべて削除する必要があります。
ApsaraVideo VODコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[トランスコーディングテンプレートグループ] ページで、[トランスコーディングテンプレートグループの作成] をクリックします。
表示されるページで、テンプレートグループの名前を指定します。
[ビデオパッケージテンプレート] セクションで、[テンプレートの追加] をクリックし、パラメーターを設定します。
基本パラメータセクションでは、カプセル化フォーマットはhlsに固定されています。 ビデオパッケージセクションには、次のパラメーターが含まれます。
パッケージングタイプ: 値はHLSパッケージングに固定されています。
帯域幅のしきい値: 特定のビットレートのビデオストリームを選択するメディアプレーヤーに基づくネットワーク帯域幅。 単位:bit/s。 推奨値を使用することを推奨します。
通常のトランスコードテンプレートを作成するのと同じ方法で、[基本パラメーター] 、[ビデオパラメーター] 、[オーディオパラメーター] 、[詳細パラメーター] 、および [条件付きトランスコードパラメーター] を設定できます。 これらのパラメーターの設定方法の詳細については、「コード変換テンプレート」をご参照ください。
テンプレートの追加を使用すると、ビジネス要件に基づいてビットレート、解像度、ビデオ品質が異なる複数のビデオパッケージテンプレートを作成できます。 ビデオ品質には、高解像度、標準解像度、および低解像度が含まれます。
パラメーターの設定後、 [保存] をクリックします。
ビデオを異なるビットレートのストリームにトランスコードします。
ApsaraVideo VODコンソールで、
を選択します。[オーディオ /ビデオ] ページで、トランスコードするビデオを見つけ、[操作] 列の [メディア処理] をクリックします。
[メディア処理] ダイアログボックスで、処理タイプを [トランスコードテンプレートグループの使用] に設定し、手順1で作成したトランスコードテンプレートグループを選択し、[OK] をクリックしてメディア処理を開始します。
ビデオストリームを表示します。
次の図は、適応ビットレートストリーミングの実装後に生成されるビデオストリームを示しています。 この例では、2つのストリームが固定ビットレートを使用し、1つのストリームがネットワーク帯域幅に基づいてビットレートを調整します。
ApsaraVideo VODコンソールで、
を選択し、前の手順で処理したビデオを見つけて、[操作] 列の [管理] をクリックします。 表示されるページで、[ビデオURL] タブをクリックします。前の図のアダプティブビットレートストリームのURLは、再生に使用されます。
ApsaraVideoプレーヤーのオンライン設定ページの [基本] タブで、アダプティブビットレートストリームのURLを入力し、[プレビュー] タブでビデオ再生効果を表示します。
APIの使用
適応ビットレートストリーミング用のトランスコードテンプレートグループを作成します。
次のサンプルコードは、通常のトランスコードテンプレート、アダプティブビットレートストリーミング用のパッケージテンプレート、および字幕パッケージテンプレートを設定するために使用されます。 要件に基づいてサンプルコードを使用できます。
説明アダプティブビットレートストリーミング用のパッケージテンプレートのみが必要な場合は、通常のトランスコードテンプレートを作成する必要はありません。 不要なトランスコード料金を回避するには、既存の通常のトランスコードテンプレートをすべて削除する必要があります。
/** * Sample code */ public static void main(String[] args) throws ClientException { // The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. // We recommend that you do not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and 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()); } /** * Configure a transcoding template group. */ public static AddTranscodeTemplateGroupResponse addTranscodeTemplateGroup(DefaultAcsClient client) throws Exception { AddTranscodeTemplateGroupRequest request = new AddTranscodeTemplateGroupRequest(); request.setName("grouptest2"); JSONArray transcodeTemplateList = new JSONArray(); // Configure a regular transcoding template. transcodeTemplateList.add(buildNormalTranscodeConfig()); // Configure a packaging template for adaptive bitrate streaming. transcodeTemplateList.add(buildVideoPackageConfig()); // Configure a subtitle packaging template. transcodeTemplateList.add(buildSubtitlePackageConfig()); request.setTranscodeTemplateList(transcodeTemplateList.toJSONString()); System.out.println("request = " + JSONObject.toJSONString(request)); return client.getAcsResponse(request); } /** * Set parameters required for adding a transcoding template. * * @return */ public static JSONObject buildNormalTranscodeConfig() { JSONObject transcodeTemplate = new JSONObject(); // The type of the template. <Normal: regular transcoding template; VideoPackage: video packaging template; SubtitlePackage: subtitle packaging template> transcodeTemplate.put("Type","Normal"); // The name of the template. transcodeTemplate.put("TemplateName", "Regular transcoding template for MP4"); // The definition. transcodeTemplate.put("Definition", "HD"); // The transcoding settings for video streams. 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); // The transcoding settings for audio streams. JSONObject audio = new JSONObject(); audio.put("Codec", "AAC"); audio.put("Bitrate", "64"); audio.put("Channels", "2"); audio.put("Samplerate", "32000"); transcodeTemplate.put("Audio", audio); // The container. JSONObject container = new JSONObject(); container.put("Format", "mp4"); transcodeTemplate.put("Container", container); // The subtitle replacement settings. JSONObject subtitleSetting = new JSONObject(); JSONArray subtitleList = new JSONArray(); JSONObject subtitle = new JSONObject(); // The OSS endpoint of the subtitle file. HTTPS URLs are not supported. subtitle.put("SubtitleUrl", "http://outin-8db8d2****3e1c9256.oss-cn-shanghai.aliyuncs.com/subtitle/3215879C9F724A43BC84C63BE2AA19AF****.srt"); // The encoding format of the subtitle content. Valid values: auto, UTF-8, GBK, and BIG5. If you set the value to auto, the system automatically selects an encoding format. subtitle.put("CharEncode", "UTF-8"); subtitleList.add(subtitle); transcodeTemplate.put("SubtitleList", subtitleList); return transcodeTemplate; } /** * Configure video packaging parameters. * * @return */ private static JSONObject buildVideoPackageConfig() { JSONObject transcodeTemplate = new JSONObject(); // The type of the template. <Normal: regular transcoding template; VideoPackage: video packaging template; SubtitlePackage: subtitle packaging template> transcodeTemplate.put("Type","VideoPackage"); // The name of the template. transcodeTemplate.put("TemplateName", "HLS LD packaging"); // The definition. transcodeTemplate.put("Definition", "LD"); // The transcoding settings for video streams. 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); // The transcoding settings for audio streams. JSONObject audio = new JSONObject(); audio.put("Codec", "AAC"); audio.put("Bitrate", "64"); audio.put("Channels", "2"); audio.put("Samplerate", "32000"); transcodeTemplate.put("Audio", audio); // The container. JSONObject container = new JSONObject(); container.put("Format", "m3u8"); transcodeTemplate.put("Container", container); // Set the container format to m3u8. The MuxConfig parameter is required. JSONObject muxConfig = new JSONObject(); JSONObject segment = new JSONObject(); segment.put("Duration", "10");// Unit: seconds. muxConfig.put("Segment", segment); transcodeTemplate.put("MuxConfig",muxConfig); // The packaging settings. JSONObject packageSetting = new JSONObject(); // The packaging type. Set the value to HLSPackage. packageSetting.put("PackageType","HLSPackage"); JSONObject packageConfig = new JSONObject(); packageConfig.put("BandWidth","500000"); packageSetting.put("PackageConfig",packageConfig); transcodeTemplate.put("PackageSetting",packageSetting); return transcodeTemplate; } /** * Configure subtitle packaging parameters. * * @return */ private static JSONObject buildSubtitlePackageConfig() { JSONObject transcodeTemplate = new JSONObject(); // The type of the template. <Normal: regular transcoding template; VideoPackage: video packaging template; SubtitlePackage: subtitle packaging template> transcodeTemplate.put("Type","SubtitlePackage"); // The name of the template. transcodeTemplate.put("TemplateName", "Multi-subtitle packaging"); // The definition. transcodeTemplate.put("Definition", "HD"); // The transcoding settings for video streams. 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); // The transcoding settings for audio streams. JSONObject audio = new JSONObject(); audio.put("Codec", "AAC"); audio.put("Bitrate", "64"); audio.put("Channels", "2"); audio.put("Samplerate", "32000"); transcodeTemplate.put("Audio", audio); // The container. JSONObject container = new JSONObject(); container.put("Format", "m3u8"); transcodeTemplate.put("Container", container); // Set the container format to m3u8. The MuxConfig parameter is required. JSONObject muxConfig = new JSONObject(); JSONObject segment = new JSONObject(); segment.put("Duration", "10");// Unit: seconds. muxConfig.put("Segment", segment); transcodeTemplate.put("MuxConfig",muxConfig); /* The OSS endpoint of the subtitle file. HTTPS URLs and domain names for Alibaba Cloud CDN are not supported. Note: The subtitle file and video source file must be stored in the same OSS bucket of a region, such as cn-shanghai. */ // The subtitle packaging template. JSONObject subtitlePackageConfig = new JSONObject(); subtitlePackageConfig.put("Type","SubtitlePackage"); // Configure a subtitle packaging template. JSONObject subtitlePackageSetting = new JSONObject(); // The packaging type. Set the value to HLSPackage. subtitlePackageSetting.put("PackageType","HLSPackage"); JSONArray subtitleExtractConfigs = new JSONArray(); // Subtitle 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"); // Subtitle 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"); subtitleExtractConfig 2.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 { // Specify the region from which you want to access 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) { // Set the regionId parameter based on the region from which you want to access ApsaraVideo VOD, such as cn-shanghai. String regionId = "cn-shanghai"; // The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. // We recommend that you do not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and 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()); } } /** * Start a transcoding job. * Pass the video ID and transcoding template group 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(); // The ID of the video that you want to transcode. request.setVideoId(videoId); // The ID of the transcoding template group. request.setTemplateGroupId(templateGroupId); // The transcoding priority. The default value is 6. A larger value indicates a higher priority. The value ranges from 1 to 10. request.setPriority("8"); JSONObject overrideParams = buildOverrideParams(); // The overrideParams parameter. request.setOverrideParams(overrideParams.toJSONString()); return client.getAcsResponse(request); } // The sample code for configuring the overrideParams parameter. public static JSONObject buildOverrideParams() { JSONObject overrideParams = new JSONObject(); // The settings for replacing the packaged subtitle file. JSONObject packageSubtitleSetting = new JSONObject(); JSONArray packageSubtitleList = new JSONArray(); JSONObject packageSubtitle = new JSONObject(); // The ID of the subtitle template that includes the OSS endpoint of the subtitle file you want to replace. packageSubtitle.put("SubtitlePackageTemplateId", "69fa6ee58****e8492c76168****"); // The Language parameter value is only used to search for the subtitle file that you want to replace. The language of subtitles in the file is not changed. The replacement fails if the subtitle file in the specified language does not exist. packageSubtitle.put("Language", "cn"); // The OSS endpoint of the subtitle file. HTTPS URLs are not supported. The subtitle file and video source file must be stored in the same region. 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は、再生に使用されます。
ApsaraVideoプレーヤーのオンライン設定ページの [基本] タブで、アダプティブビットレートストリームのURLを入力し、[プレビュー] タブでビデオ再生効果を表示します。