Tous les produits
Search
Centre de documentation

ApsaraVideo VOD:Configurer la diffusion adaptative

Dernière mise à jour :Aug 10, 2026

La diffusion adaptative (Adaptive Bitrate Streaming) conditionne un fichier audio ou vidéo en plusieurs flux présentant différents débits et résolutions, puis génère un fichier manifeste répertoriant ces flux. Le lecteur utilise ce manifeste pour basculer dynamiquement entre les flux en fonction des conditions réseau, améliorant ainsi l'expérience de visionnage.

Remarque

HLS et DASH sont les formats les plus couramment utilisés pour la diffusion adaptative. ApsaraVideo VOD prend actuellement en charge la génération de flux adaptatifs uniquement au format HLS. Pour plus d'informations, consultez la rubrique Transcodage à débit adaptatif.

Présentation

ApsaraVideo VOD propose des modèles de conditionnement vidéo et des modèles de conditionnement de sous-titres afin de générer des fichiers de diffusion adaptative permettant aux spectateurs de basculer entre différentes résolutions et langues de sous-titres. Créez ces modèles via la console ApsaraVideo VOD ou en appelant des opérations API.

Contrairement à la lecture traditionnelle à débit unique, la diffusion adaptative permet au lecteur de sélectionner le flux le plus approprié en fonction des conditions réseau et de l'appareil du spectateur. Cette approche améliore considérablement l'expérience utilisateur. Le tableau ci-dessous présente les différences entre un modèle de conditionnement vidéo et un modèle de transcodage standard.

Élément

Modèle de conditionnement vidéo

Modèle de transcodage standard

Configuration des paramètres

Nécessite des paramètres de conditionnement, tels que le type de conditionnement et le seuil de bande passante.

Ces paramètres ne sont pas requis.

Ajout de sous-titres

Ajoutez des sous-titres intégrés et externes.

L'ajout de sous-titres intégrés est possible uniquement via un appel d'API.

Expérience de lecture

Le lecteur sélectionne automatiquement le flux à lire en fonction de la bande passante réseau.

Seul le flux spécifié peut être lu.

Notes d'utilisation

  • Les modèles de conditionnement vidéo ne prennent pas en charge le chiffrement standard. Pour utiliser le chiffrement standard, utilisez un modèle de transcodage standard.

  • Le fichier de sous-titres et le fichier vidéo source doivent être stockés dans la même région et dans le même bucket OSS.

  • Un modèle de conditionnement de sous-titres ne peut ni être créé ni utilisé seul. Il doit impérativement être associé à un modèle de conditionnement vidéo.

  • Les modèles de conditionnement de sous-titres prennent uniquement en charge le format VTT. Lors de la substitution des paramètres de sous-titres via un appel d'API, le paramètre Language sert uniquement à identifier le fichier de sous-titres à remplacer ; la valeur linguistique elle-même n'est pas modifiée. Il est impossible de remplacer un sous-titre pour une langue qui n'existe pas déjà.

  • Le transcodage est un service payant. Pour plus d'informations, consultez les pages Tarification.

Configurer la diffusion adaptative dans la console

  1. Créez un groupe de modèles de transcodage dédié à la diffusion adaptative.

    Remarque

    Si vous avez uniquement besoin d'un modèle de conditionnement vidéo, la création d'un modèle standard n'est pas obligatoire. Afin d'éviter des frais de transcodage inutiles, supprimez les modèles de transcodage standard dont vous n'avez pas besoin.

    1. Connectez-vous à la console ApsaraVideo VOD. Dans le volet de navigation de gauche, cliquez sur Configuration Management > Media Processing > Transcoding Template Groups.

    2. Sous l'onglet Transcoding Template Groups, cliquez sur Create Transcoding Template Group.

    3. Spécifiez un nom pour le groupe de modèles.

    4. Dans la section Audio and Video Packaging Template, cliquez sur Add Template et configurez le modèle de conditionnement vidéo.

      • Dans la section Basic Information, le paramètre Encapsulation Format est fixé à HLS. Les paramètres de la section Video Packaging Parameters sont décrits ci-dessous :

        • Packaging Type : ce paramètre est défini sur HLS packaging.

        • Bandwidth Threshold : indique la bande passante utilisée par le lecteur pour déterminer quel flux lire selon les conditions réseau actuelles. Unité : bps. Nous vous recommandons d'utiliser les paramètres suggérés.

      • Les sections Basic Information, Video Parameters, Audio Parameters et Advanced Parameters se configurent de la même manière qu'un modèle de transcodage standard. Pour plus de détails, consultez la rubrique Modèles de transcodage.

      • Si nécessaire, cliquez sur Add Template afin de créer plusieurs modèles de conditionnement vidéo avec des débits, des résolutions et des définitions variés.

    5. Une fois le modèle de conditionnement vidéo , cliquez sur Save.

  2. Lancez le transcodage à débit adaptatif.

    1. Dans la console ApsaraVideo VOD, accédez à Media Files > Audio/Video.

    2. Sur la page Audio/Video, repérez la vidéo à traiter et cliquez sur Processing dans la colonne Actions.

    3. Définissez Use Transcoding Template Group sur Use Transcoding Template Group. Sélectionnez le groupe de modèles de transcodage créé à l'étape précédente, puis cliquez sur OK pour démarrer la tâche de traitement multimédia.

  3. Consultez le résultat.

    • Visualisez les flux conditionnés (deux flux transcodés et un flux adaptatif)

      Dans la console ApsaraVideo VOD, rendez-vous dans Media Files > Audio/Video. Localisez la vidéo traitée, cliquez sur Manage, puis sélectionnez l'onglet Video URL.

      L'onglet Video URL affiche quatre entrées : Original File (MP4, 1920×1080, 293,17 Mo), HD (M3U8, chiffrement privé, 1280×720, 48,24 Mo), Fluent (M3U8, 640×360, 14,55 Mo) et Adaptive (M3U8).

    • Vérifiez le résultat de la lecture (lecture du flux adaptatif)

      Sous l'onglet Basic Configuration du lecteur ApsaraVideo, saisissez l'URL du flux adaptatif obtenue depuis l'onglet Video URL, puis cliquez sur l'onglet Preview pour visualiser la lecture.

      À droite du lecteur vidéo, développez le panneau Subtitles. Après avoir sélectionné la piste de sous-titres test, les sous-titres anglais correspondants s'affichent en bas de l'écran vidéo.

Procédure

  1. Créez un groupe de modèles de transcodage pour la diffusion adaptative.

    L'exemple de code ci-dessous illustre la configuration d'un modèle de transcodage standard, d'un modèle de conditionnement vidéo et d'un modèle de conditionnement de sous-titres. Adaptez les configurations à votre scénario d'utilisation.

    Remarque

    Si vous avez uniquement besoin d'un modèle de conditionnement vidéo, la création d'un modèle standard n'est pas obligatoire. Afin d'éviter des frais de transcodage inutiles, supprimez les modèles de transcodage standard dont vous n'avez pas besoin.

        /**
         * The following code provides an example on how to call the API operation.
         */
        public static void main(String[] args) throws ClientException {
            // The AccessKey pair of an Alibaba Cloud account has permissions to call all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M.
            // We strongly recommend that you do not store the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked, which threatens the security of all your resources.
            // This example shows how to use environment variables to obtain the AccessKey pair for identity verification. Before you run the sample code, configure the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables.
            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());
        }
        /**
         * Add 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 video packaging template.
            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);
        }
        /**
         * Build the configuration data for the transcoding template to be added.
         *
         * @return
         */
        public static JSONObject buildNormalTranscodeConfig() {
            JSONObject transcodeTemplate = new JSONObject();
            // The type of the template. Valid values: Normal (regular transcoding template), VideoPackage (video packaging template), and SubtitlePackage (subtitle packaging template).
            transcodeTemplate.put("Type","Normal");
            // The name of the template.
            transcodeTemplate.put("TemplateName", "regular_transcoding_template_mp4");
            // The definition.
            transcodeTemplate.put("Definition", "HD");
            // The video stream transcoding configuration.
            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 audio stream transcoding configuration.
            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 format.
            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 URL 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 character encoding of the subtitle content. Valid values: auto (automatic detection), UTF-8, GBK, and BIG5.
            subtitle.put("CharEncode", "UTF-8");
            subtitleList.add(subtitle);
            transcodeTemplate.put("SubtitleList", subtitleList);
            return transcodeTemplate;
        }
        /**
         * The video packaging configuration.
         *
         * @return
         */
        private static JSONObject buildVideoPackageConfig() {
            JSONObject transcodeTemplate = new JSONObject();
            // The type of the template. Valid values: Normal (regular transcoding template), VideoPackage (video packaging template), and 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 video stream transcoding configuration.
            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 audio stream transcoding configuration.
            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 format.
            JSONObject container = new JSONObject();
            container.put("Format", "m3u8");
            transcodeTemplate.put("Container", container);
            // If the container format is set to M3U8, you must configure MuxConfig.
            JSONObject muxConfig = new JSONObject();
            JSONObject segment = new JSONObject();
            segment.put("Duration", "10");// Unit: seconds.
            muxConfig.put("Segment", segment);
            transcodeTemplate.put("MuxConfig",muxConfig);
            // The packaging configuration.
            JSONObject packageSetting = new JSONObject();
            // The packaging type. Set the value to HLSPackage for HLS adaptive bitrate packaging.
            packageSetting.put("PackageType","HLSPackage");
            JSONObject packageConfig = new JSONObject();
            packageConfig.put("BandWidth","500000");
            packageSetting.put("PackageConfig",packageConfig);
            transcodeTemplate.put("PackageSetting",packageSetting);
            return transcodeTemplate;
        }
        /**
         * The subtitle packaging configuration.
         *
         * @return
         */
        private static JSONObject buildSubtitlePackageConfig() {
            JSONObject transcodeTemplate = new JSONObject();
            // The type of the template. Valid values: Normal (regular transcoding template), VideoPackage (video packaging template), and 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 video stream transcoding configuration.
            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 audio stream transcoding configuration.
            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 format.
            JSONObject container = new JSONObject();
            container.put("Format", "m3u8");
            transcodeTemplate.put("Container", container);
            // If the container format is set to M3U8, you must configure MuxConfig.
            JSONObject muxConfig = new JSONObject();
            JSONObject segment = new JSONObject();
            segment.put("Duration", "10");// Unit: seconds.
            muxConfig.put("Segment", segment);
            transcodeTemplate.put("MuxConfig",muxConfig);
            /*
            The OSS URL of the subtitle file. HTTPS URLs and CDN-accelerated domain names are not supported.
            Note: The subtitle file must be in the same region and OSS bucket as the source video file, for example, cn-shanghai.
             */
            // The subtitle packaging template.
            JSONObject subtitlePackageConfig = new JSONObject();
            subtitlePackageConfig.put("Type","SubtitlePackage");
            // The subtitle packaging settings.
            JSONObject subtitlePackageSetting = new JSONObject();
            // The packaging type. Set the value to HLSPackage for HLS adaptive bitrate packaging.
            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");
            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 {
            // The region where ApsaraVideo VOD is activated.
            String regionId = "cn-shanghai";
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
            return client;
        }
  2. Lancez le transcodage à débit adaptatif.

         public static void main(String[] args) {
           // Set regionId based on the access point of your service. For example, if you access the service from Shanghai, set the value to cn-shanghai.
           String regionId = "cn-shanghai";
           // The AccessKey pair of an Alibaba Cloud account has permissions to call all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M.
           // We strongly recommend that you do not store the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked, which threatens the security of all your resources.
           // This example shows how to use environment variables to obtain the AccessKey pair for identity verification. Before you run the sample code, configure the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables.
            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());
            }
        }
        /**
         * Submits a transcoding job.
         * The video ID and template group ID are passed.
         *
         * @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 to be transcoded.
            request.setVideoId(videoId);
            // The ID of the transcoding template group.
            request.setTemplateGroupId(templateGroupId);
            // The priority of the transcoding job. Default value: 6. A larger value indicates a higher priority. Valid values: 1 to 10.
            request.setPriority("8");
            JSONObject overrideParams = buildOverrideParams();
            // The override parameters.
            request.setOverrideParams(overrideParams.toJSONString());
            return client.getAcsResponse(request);
        }
        // The following code provides an example on how to build override parameters for subtitle replacement.
        public static JSONObject buildOverrideParams() {
            JSONObject overrideParams = new JSONObject();
            // The override settings for packaged subtitles.
            JSONObject packageSubtitleSetting = new JSONObject();
            JSONArray packageSubtitleList = new JSONArray();
            JSONObject packageSubtitle = new JSONObject();
          // The ID of the subtitle template to be overridden in the transcoding template group.
            packageSubtitle.put("SubtitlePackageTemplateId", "69fa6ee58****e8492c76168****");
          // The Language parameter is used only to locate the subtitle file that you want to replace. The language value itself is not replaced. The replacement fails if the specified language does not exist.
            packageSubtitle.put("Language", "cn");
            // The OSS URL of the subtitle file. HTTPS URLs are not supported. The subtitle file must be in the same region as the video.
            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. Consultez le résultat.

    • Visualisez les flux conditionnés (deux flux transcodés et un flux adaptatif)

      Dans la console ApsaraVideo VOD, rendez-vous dans Media Files > Audio/Video. Localisez la vidéo traitée, cliquez sur Manage, puis sélectionnez l'onglet Video URL.

      L'onglet Video URL affiche quatre entrées : Original File (MP4, 1920×1080, 293,17 Mo), HD (M3U8, chiffrement privé, 1280×720, 48,24 Mo), Fluent (M3U8, 640×360, 14,55 Mo) et Adaptive (M3U8).

    • Vérifiez le résultat de la lecture (lecture du flux adaptatif)

      Sous l'onglet Basic Configuration du lecteur ApsaraVideo, saisissez l'URL du flux adaptatif obtenue depuis l'onglet Video URL, puis cliquez sur l'onglet Preview pour visualiser la lecture.

      À droite du lecteur vidéo, développez le panneau Subtitles. Après avoir sélectionné la piste de sous-titres test, les sous-titres anglais correspondants s'affichent en bas de l'écran vidéo.