Todos os produtos
Search
Central de documentação

ApsaraVideo VOD:Configurar streaming de taxa de bits adaptativa

Última atualização: Jul 02, 2026

O streaming de taxa de bits adaptativa empacota um arquivo de áudio ou vídeo em vários fluxos com diferentes taxas de bits e resoluções e gera um arquivo de manifesto que lista esses fluxos. O player usa esse manifesto para alternar dinamicamente entre os fluxos conforme as condições da rede, melhorando a experiência de visualização.

Nota

HLS e DASH são os formatos mais usados para streaming de taxa de bits adaptativa. Atualmente, o ApsaraVideo VOD oferece suporte à geração de fluxos de taxa de bits adaptativa apenas no formato HLS. Para obter mais informações, consulte Transcodificação de taxa de bits adaptativa.

Introdução

O ApsaraVideo VOD fornece modelos de empacotamento de vídeo e de legendas para gerar arquivos de streaming de taxa de bits adaptativa. Esses arquivos permitem que os espectadores alternem entre diferentes resoluções e idiomas de legenda. Crie esses modelos pelo console do ApsaraVideo VOD ou por chamadas de API.

Diferentemente da reprodução tradicional de taxa de bits única, o streaming de taxa de bits adaptativa permite que o player selecione o fluxo mais adequado com base nas condições de rede e no dispositivo do espectador. Isso melhora significativamente a experiência de visualização. A tabela a seguir descreve as diferenças entre um modelo de empacotamento de vídeo e um modelo de transcodificação comum.

Item

Modelo de empacotamento de vídeo

Modelo de transcodificação comum

Configuração de parâmetros

Requer parâmetros de empacotamento, como tipo de empacotamento e limiar de largura de banda.

Esses parâmetros não são obrigatórios.

Adição de legendas

Adicione legendas incorporadas e externas.

Adicione apenas legendas incorporadas por meio de uma operação de API.

Experiência de reprodução

O player seleciona automaticamente um fluxo para reprodução com base na largura de banda da rede.

Apenas o fluxo especificado pode ser reproduzido.

Observações de uso

  • Os modelos de empacotamento de vídeo não oferecem suporte à criptografia padrão. Para usar criptografia padrão, utilize um modelo de transcodificação comum.

  • Armazene o arquivo de legenda e o arquivo de vídeo source na mesma região e no mesmo bucket do OSS.

  • Não crie nem use um modelo de empacotamento de legendas isoladamente. Use-o sempre em conjunto com um modelo de empacotamento de vídeo.

  • Os modelos de empacotamento de legendas aceitam apenas o formato VTT. Ao substituir parâmetros de legenda via chamada de API, o parâmetro Language serve apenas para identificar o arquivo de legenda a ser substituído; o valor do idioma em si não é modificado. Não substitua uma legenda para um idioma inexistente.

  • A transcodificação é um serviço pago. Para obter mais informações, consulte Preços.

Configurar streaming de taxa de bits adaptativa no console

  1. Crie um grupo de modelos de transcodificação para streaming de taxa de bits adaptativa.

    Nota

    Se precisar apenas de um modelo de empacotamento de vídeo, não crie um modelo comum. Para evitar taxas de transcodificação desnecessárias, exclua os modelos de transcodificação comum que não forem necessários.

    1. Faça login no console do ApsaraVideo VOD. No painel de navegação à esquerda, escolha Configuration Management > Media Processing > Transcoding Template Groups.

    2. Na aba Transcoding Template Groups, clique em Create Transcoding Template Group.

    3. Especifique um nome para o grupo de modelos.

    4. Na seção Audio and Video Packaging Template, clique em Add Template e configure o modelo de empacotamento de vídeo.

      • Na seção Basic Information, o campo Encapsulation Format está fixo como HLS. Os parâmetros da seção Video Packaging Parameters são descritos a seguir:

        • Packaging Type: este parâmetro está fixo como HLS packaging.

        • Bandwidth Threshold: especifica a largura de banda que o player usa para determinar qual fluxo reproduzir com base nas condições atuais da rede. Unidade: bps. Recomendamos o uso das configurações sugeridas.

      • Configure as seções Basic Information, Video Parameters, Audio Parameters e Advanced Parameters da mesma forma que um modelo de transcodificação comum. Para obter mais informações, consulte Modelos de transcodificação.

      • Se necessário, clique em Add Template para criar vários modelos de empacotamento de vídeo com diferentes taxas de bits, resoluções e definições.

    5. Após criar o modelo de empacotamento de vídeo , clique em Save.

  2. Inicie a transcodificação de taxa de bits adaptativa.

    1. No console do ApsaraVideo VOD, escolha Media Files > Audio/Video.

    2. Na página Audio/Video, localize o vídeo que deseja processar e clique em Processing na coluna Actions.

    3. Defina Use Transcoding Template Group como Use Transcoding Template Group. Selecione o grupo de modelos de transcodificação criado na etapa anterior e clique em OK para iniciar o job de processamento de mídia.

  3. Visualize o resultado.

    • Visualize os fluxos empacotados (dois fluxos transcodificados e um fluxo adaptativo)

      No console do ApsaraVideo VOD, escolha Media Files > Audio/Video. Localize o vídeo processado, clique em Manage e, em seguida, clique na aba Video URL.

      A aba Video URL exibe quatro entradas: Original File (MP4, 1920×1080, 293,17 MB), HD (M3U8, criptografia privada, 1280×720, 48,24 MB), Fluent (M3U8, 640×360, 14,55 MB) e Adaptive (M3U8).

    • Visualize o resultado da reprodução (reproduza o fluxo adaptativo)

      Na aba Basic Configuration do ApsaraVideo Player, insira a URL do fluxo adaptativo obtida na aba Video URL e clique na aba Preview para visualizar a reprodução.

      No lado direito do player de vídeo, expanda o painel Subtitles. Após selecionar a faixa de legenda test, as legendas correspondentes em inglês aparecerão na parte inferior da tela do vídeo.

Procedimento

  1. Crie um grupo de modelos de transcodificação para streaming de taxa de bits adaptativa.

    O código de exemplo mostra como configurar um modelo de transcodificação comum, um modelo de empacotamento de vídeo e um modelo de empacotamento de legendas. Utilize as configurações relevantes para o seu cenário.

    Nota

    Se precisar apenas de um modelo de empacotamento de vídeo, não crie um modelo comum. Para evitar taxas de transcodificação desnecessárias, exclua os modelos de transcodificação comum que não forem necessários.

        /**
         * 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. Inicie a transcodificação de taxa de bits adaptativa.

         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. Visualize o resultado.

    • Visualize os fluxos empacotados (dois fluxos transcodificados e um fluxo adaptativo)

      No console do ApsaraVideo VOD, escolha Media Files > Audio/Video. Localize o vídeo processado, clique em Manage e, em seguida, clique na aba Video URL.

      A aba Video URL exibe quatro entradas: Original File (MP4, 1920×1080, 293,17 MB), HD (M3U8, criptografia privada, 1280×720, 48,24 MB), Fluent (M3U8, 640×360, 14,55 MB) e Adaptive (M3U8).

    • Visualize o resultado da reprodução (reproduza o fluxo adaptativo)

      Na aba Basic Configuration do ApsaraVideo Player, insira a URL do fluxo adaptativo obtida na aba Video URL e clique na aba Preview para visualizar a reprodução.

      No lado direito do player de vídeo, expanda o painel Subtitles. Após selecionar a faixa de legenda test, as legendas correspondentes em inglês aparecerão na parte inferior da tela do vídeo.