全部产品
Search
文档中心

ApsaraVideo VOD:Implementasi streaming bitrate adaptif

更新时间:Dec 17, 2025

ApsaraVideo VOD mentranskode video menjadi aliran dengan berbagai bitrate dan mengemasnya ke dalam satu file. File ini mencakup profil streaming yang berisi informasi seperti bitrate dan resolusi yang tersedia, memungkinkan pemain media beralih antar bitrate sesuai kondisi jaringan.

Catatan

Protokol streaming bitrate adaptif yang paling umum digunakan adalah HTTP Live Streaming (HLS) dan Dynamic Adaptive Streaming over HTTP (DASH). ApsaraVideo VOD hanya mendukung HLS adaptive bitrate streaming. Untuk informasi lebih lanjut, lihat Streaming bitrate adaptif.

Deskripsi

Di ApsaraVideo VOD, Anda dapat menggunakan template pengemasan video dan subtitle untuk mengemas aliran video dengan bitrate berbeda serta subtitle dalam berbagai bahasa. Dengan cara ini, pemain media dapat beralih bitrate dan subtitle. Template untuk streaming bitrate adaptif dapat dibuat melalui konsol atau API.

Streaming bitrate adaptif memungkinkan pemain media secara otomatis beralih ke aliran yang paling sesuai berdasarkan kondisi jaringan dan perangkat. Ini meningkatkan kualitas pemutaran video secara signifikan. Tabel berikut menjelaskan perbedaan antara template pengemasan video dan template transkoding biasa.

Item

Template pengemasan video

Template transkoding biasa

Konfigurasi parameter

Parameter pengemasan diperlukan, termasuk jenis pengemasan dan ambang batas bandwidth.

Tidak ada.

Subtitle

Subtitle tersemat dan subtitle samping didukung.

Subtitle hanya dapat disematkan dengan memanggil operasi API.

Kinerja streaming

Pemain media secara otomatis beralih ke bitrate yang paling sesuai berdasarkan lebar pita jaringan.

Stream pada bitrate tertentu diputar.

Catatan penggunaan

  • Template pengemasan video tidak mendukung enkripsi HLS. Jika Anda memerlukan enkripsi HLS, gunakan template transkoding biasa.

  • File subtitle dan file sumber video harus disimpan di Bucket Object Storage Service (OSS) yang sama.

  • Template pengemasan subtitle tidak dapat dibuat secara terpisah. Untuk menggunakannya, Anda harus mengaitkannya dengan template pengemasan video.

  • Template pengemasan subtitle hanya mendukung format Web Video Text Tracks (WebVTT). Saat memodifikasi parameter Language melalui API, nilai asli dari parameter Language digunakan untuk menemukan file subtitle sebelum diganti dengan file baru dalam bahasa yang ditentukan. Operasi gagal jika file subtitle dalam bahasa yang dimaksud tidak ditemukan.

  • Anda akan dikenakan biaya untuk transkoding. Untuk informasi lebih lanjut, kunjungi halaman halaman harga ApsaraVideo VOD.

Menggunakan konsol

  1. Buat kelompok template transkoding untuk streaming bitrate adaptif.

    Catatan

    Jika Anda hanya memerlukan template pengemasan untuk streaming bitrate adaptif, Anda tidak perlu membuat template transkoding biasa. Hapus semua template transkoding biasa yang ada untuk menghindari biaya transkoding yang tidak perlu.

    1. Masuk ke ApsaraVideo VOD console. Di panel navigasi kiri, pilih Configuration Management > Media Processing > Transcoding Template Groups.

    2. Di halaman Kelompok Template Transcoding, klik Create Transcoding Template Group.

    3. Di halaman yang muncul, tentukan nama untuk kelompok template.

    4. Di bagian Audio and Video Packaging Template, klik Add Template, lalu atur parameter:

      • Di bagian Basic Information, tetapkan Encapsulation Format ke HLS. Bagian Video Packaging mencakup parameter berikut:

        • Packaging Type: Tetap pada HLS packaging.

        • Bandwidth Threshold: Bandwidth jaringan yang digunakan pemain media untuk memilih aliran video dengan bitrate tertentu. Unit: bit/detik. Disarankan mempertahankan nilai default.

      • Anda dapat mengonfigurasi Basic Information, Video Parameters, Audio Parameters, dan Advanced Parameters seperti saat membuat template transkoding biasa. Untuk informasi lebih lanjut, lihat Template transkoding.

      • Gunakan Add Template untuk membuat beberapa template pengemasan video dengan bitrate, resolusi, dan kualitas yang berbeda sesuai kebutuhan bisnis Anda. Kualitas video mencakup definisi tinggi, standar, dan rendah.

    5. Setelah parameter dikonfigurasi, klik Save.

  2. Transkode video menjadi stream dengan bitrate berbeda.

    1. Di konsol ApsaraVideo VOD, pilih Media Files > Audio/Video.

    2. Di halaman Video and Audio, temukan video yang ingin Anda transkode, lalu klik Media Processing di kolom Tindakan.

    3. Di kotak dialog Pemrosesan Media, atur Jenis Pemrosesan ke Use Transcoding Template Group, pilih kelompok template transkoding yang Anda buat di Langkah 1, lalu klik OK untuk memulai pemrosesan media.

    image

  3. Lihat aliran video.

    • Gambar berikut menunjukkan aliran video yang dihasilkan setelah implementasi streaming bitrate adaptif. Dalam contoh ini, dua stream menggunakan bitrate tetap, sementara satu stream menyesuaikan bitrate berdasarkan bandwidth jaringan.

      Di konsol ApsaraVideo VOD, pilih Media Files > Audio/Video, temukan video yang diproses sebelumnya, lalu klik Manage di kolom Tindakan. Di halaman yang muncul, klik tab Video URL.

      效果展示_1

    • URL dari stream bitrate adaptif pada gambar di atas digunakan untuk pemutaran.

      Di tab Basic halaman Pengaturan Online di ApsaraVideo Player, masukkan URL dari stream bitrate adaptif dan lihat efek pemutaran video di tab Preview.

Prosedur

  1. Buat kelompok template transkoding untuk streaming bitrate adaptif.

    Kode sampel berikut digunakan untuk mengonfigurasi template transkoding biasa, template pengemasan untuk streaming bitrate adaptif, dan template pengemasan subtitle. Gunakan kode sampel sesuai kebutuhan Anda.

    Catatan

    Jika Anda hanya memerlukan template pengemasan untuk streaming bitrate adaptif, Anda tidak perlu membuat template transkoding biasa. Hapus semua template transkoding biasa yang ada untuk menghindari biaya transkoding yang tidak perlu.

        /**
         * Kode sampel
         */
        public static void main(String[] args) throws ClientException {
            // Pasangan AccessKey dari akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API. Kami sarankan Anda menggunakan pasangan AccessKey dari pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
            // Kami sarankan Anda tidak menyertakan pasangan AccessKey Anda (AccessKey ID dan Rahasia AccessKey) dalam kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya dalam akun Anda mungkin terganggu.
            // Dalam contoh ini, ApsaraVideo VOD membaca pasangan AccessKey dari variabel lingkungan untuk mengimplementasikan verifikasi identitas untuk akses API. Sebelum menjalankan kode sampel, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan 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());
        }
    
        /**
         * Konfigurasikan kelompok template transkoding.
         */
        public static AddTranscodeTemplateGroupResponse addTranscodeTemplateGroup(DefaultAcsClient client) throws Exception {
            AddTranscodeTemplateGroupRequest request = new AddTranscodeTemplateGroupRequest();
            request.setName("grouptest2");
            JSONArray transcodeTemplateList = new JSONArray();
            // Konfigurasikan template transkoding umum.
            transcodeTemplateList.add(buildNormalTranscodeConfig());
            // Konfigurasikan template streaming bitrate adaptif.
            transcodeTemplateList.add(buildVideoPackageConfig());
            // Konfigurasikan template pengemasan subtitle.
            transcodeTemplateList.add(buildSubtitlePackageConfig());
            request.setTranscodeTemplateList(transcodeTemplateList.toJSONString());
            System.out.println("request = " + JSONObject.toJSONString(request));
            return client.getAcsResponse(request);
        }
    
        /**
         * Bangun parameter konfigurasi untuk template transkoding yang ingin Anda tambahkan.
         *
         * @return
         */
        public static JSONObject buildNormalTranscodeConfig() {
            JSONObject transcodeTemplate = new JSONObject();
            // Jenis template. <Normal: template transkoding biasa; VideoPackage: template pengemasan video; SubtitlePackage: template pengemasan subtitle>
            transcodeTemplate.put("Type","Normal");
            // Nama template.
            transcodeTemplate.put("TemplateName", "Template transkoding biasa untuk MP4");
            // Definisi.
            transcodeTemplate.put("Definition", "HD");
            // Pengaturan transkoding untuk aliran video.
            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);
            // Pengaturan transkoding untuk aliran audio.
            JSONObject audio = new JSONObject();
            audio.put("Codec", "AAC");
            audio.put("Bitrate", "64");
            audio.put("Channels", "2");
            audio.put("Samplerate", "32000");
            transcodeTemplate.put("Audio", audio);
            // Kontainer.
            JSONObject container = new JSONObject();
            container.put("Format", "mp4");
            transcodeTemplate.put("Container", container);
            // Pengaturan penggantian subtitle.
            JSONObject subtitleSetting = new JSONObject();
            JSONArray subtitleList = new JSONArray();
            JSONObject subtitle = new JSONObject();
            // Endpoint OSS dari file subtitle. URL HTTPS tidak didukung.
            subtitle.put("SubtitleUrl", "http://outin-8db8d2****3e1c9256.oss-cn-shanghai.aliyuncs.com/subtitle/3215879C9F724A43BC84C63BE2AA19AF****.srt");
            // Format pengkodean konten subtitle. Nilai valid: auto, UTF-8, GBK, dan BIG5. Jika Anda menetapkan nilainya ke auto, sistem secara otomatis memilih format pengkodean.
            subtitle.put("CharEncode", "UTF-8");
            subtitleList.add(subtitle);
            transcodeTemplate.put("SubtitleList", subtitleList);
            return transcodeTemplate;
        }
    
        /**
         * Konfigurasikan parameter pengemasan video.
         *
         * @return
         */
        private static JSONObject buildVideoPackageConfig() {
            JSONObject transcodeTemplate = new JSONObject();
            // Jenis template. <Normal: template transkoding biasa; VideoPackage: template pengemasan video; SubtitlePackage: template pengemasan subtitle>
            transcodeTemplate.put("Type","VideoPackage");
            // Nama template.
            transcodeTemplate.put("TemplateName", "Pengemasan LD HLS");
            // Definisi.
            transcodeTemplate.put("Definition", "LD");
            // Pengaturan transkoding untuk aliran video.
            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);
            // Pengaturan transkoding untuk aliran audio.
            JSONObject audio = new JSONObject();
            audio.put("Codec", "AAC");
            audio.put("Bitrate", "64");
            audio.put("Channels", "2");
            audio.put("Samplerate", "32000");
            transcodeTemplate.put("Audio", audio);
            // Kontainer.
            JSONObject container = new JSONObject();
            container.put("Format", "m3u8");
            transcodeTemplate.put("Container", container);
            // Tetapkan format kontainer ke m3u8. Parameter MuxConfig diperlukan.
            JSONObject muxConfig = new JSONObject();
            JSONObject segment = new JSONObject();
            segment.put("Duration", "10");// Unit: detik.
            muxConfig.put("Segment", segment);
            transcodeTemplate.put("MuxConfig",muxConfig);
    
            // Pengaturan pengemasan.
            JSONObject packageSetting = new JSONObject();
            // Jenis pengemasan. Tetapkan nilainya ke HLSPackage.
            packageSetting.put("PackageType","HLSPackage");
            JSONObject packageConfig = new JSONObject();
            packageConfig.put("BandWidth","500000");
            packageSetting.put("PackageConfig",packageConfig);
            transcodeTemplate.put("PackageSetting",packageSetting);
            return transcodeTemplate;
        }
    
        /**
         * Konfigurasikan parameter pengemasan subtitle.
         *
         * @return
         */
        private static JSONObject buildSubtitlePackageConfig() {
            JSONObject transcodeTemplate = new JSONObject();
            // Jenis template. <Normal: template transkoding biasa; VideoPackage: template pengemasan video; SubtitlePackage: template pengemasan subtitle>
            transcodeTemplate.put("Type","SubtitlePackage");
            // Nama template.
            transcodeTemplate.put("TemplateName", "Pengemasan multi-subtitle");
            // Definisi.
            transcodeTemplate.put("Definition", "HD");
            // Pengaturan transkoding untuk aliran video.
            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);
            // Pengaturan transkoding untuk aliran audio.
            JSONObject audio = new JSONObject();
            audio.put("Codec", "AAC");
            audio.put("Bitrate", "64");
            audio.put("Channels", "2");
            audio.put("Samplerate", "32000");
            transcodeTemplate.put("Audio", audio);
            // Kontainer.
            JSONObject container = new JSONObject();
            container.put("Format", "m3u8");
            transcodeTemplate.put("Container", container);
            // Tetapkan format kontainer ke m3u8. Parameter MuxConfig diperlukan.
            JSONObject muxConfig = new JSONObject();
            JSONObject segment = new JSONObject();
            segment.put("Duration", "10");// Unit: detik.
            muxConfig.put("Segment", segment);
            transcodeTemplate.put("MuxConfig",muxConfig);
    
            /*
            Endpoint OSS dari file subtitle. URL HTTPS dan domain untuk CDN Alibaba Cloud tidak didukung.
            Catatan: File subtitle dan file sumber video harus disimpan di Bucket OSS yang sama di wilayah tertentu, seperti cn-shanghai.
             */
            // Template pengemasan subtitle.
            JSONObject subtitlePackageConfig = new JSONObject();
            subtitlePackageConfig.put("Type","SubtitlePackage");
            // Konfigurasikan template pengemasan subtitle.
            JSONObject subtitlePackageSetting = new JSONObject();
            // Jenis pengemasan. Tetapkan nilainya ke 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");
            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 {
            // Tentukan wilayah di mana ApsaraVideo VOD diaktifkan.
            String regionId = "cn-shanghai";
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
            return client;
        }
  2. Transkode video menjadi stream dengan bitrate berbeda.

         public static void main(String[] args) {
           // Set parameter regionId berdasarkan wilayah dari mana Anda ingin mengakses ApsaraVideo VOD, seperti cn-shanghai.
           String regionId = "cn-shanghai";
           // Pasangan AccessKey dari akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API. Kami sarankan Anda menggunakan pasangan AccessKey dari pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
           // Kami sarankan Anda tidak menyertakan pasangan AccessKey Anda (AccessKey ID dan Rahasia AccessKey) dalam kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya dalam akun Anda mungkin terganggu.
           // Dalam contoh ini, ApsaraVideo VOD membaca pasangan AccessKey dari variabel lingkungan untuk mengimplementasikan verifikasi identitas untuk akses API. Sebelum menjalankan kode sampel, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan 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());
            }
        }
        
        /**
         * Mulai pekerjaan transkoding.
         * Lewati ID video dan ID grup template transkoding.
         *
         * @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 video yang ingin Anda transkode.
            request.setVideoId(videoId);
            // Tetapkan ID grup template transkoding.
            request.setTemplateGroupId(templateGroupId);
            // Prioritas transkoding. Nilai defaultnya adalah 6. Nilai yang lebih besar menunjukkan prioritas yang lebih tinggi. Rentang nilainya dari 1 hingga 10.
            request.setPriority("8");
            JSONObject overrideParams = buildOverrideParams();
            // Parameter overrideParams.
            request.setOverrideParams(overrideParams.toJSONString());
            return client.getAcsResponse(request);
        }
    
        // Kode sampel untuk mengonfigurasi parameter overrideParams.
        public static JSONObject buildOverrideParams() {
            JSONObject overrideParams = new JSONObject();
            // Pengaturan untuk mengganti file subtitle yang dikemas.
            JSONObject packageSubtitleSetting = new JSONObject();
            JSONArray packageSubtitleList = new JSONArray();
            JSONObject packageSubtitle = new JSONObject();
          // ID template subtitle yang mencakup endpoint OSS dari file subtitle yang ingin Anda ganti.
            packageSubtitle.put("SubtitlePackageTemplateId", "69fa6ee58****e8492c76168****");
          // Nilai parameter Language hanya digunakan untuk mencari file subtitle yang ingin Anda ganti. Bahasa subtitle dalam file tidak diubah. Penggantian gagal jika file subtitle dalam bahasa yang ditentukan tidak ada.
            packageSubtitle.put("Language", "cn");
            // Endpoint OSS dari file subtitle. URL HTTPS tidak didukung. File subtitle dan file sumber video harus disimpan di wilayah yang sama.
            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. Lihat aliran video.

    • Gambar berikut menunjukkan aliran video yang dihasilkan setelah implementasi streaming bitrate adaptif. Dalam contoh ini, dua stream menggunakan bitrate tetap, sementara satu stream menyesuaikan bitrate berdasarkan bandwidth jaringan.

      Di konsol ApsaraVideo VOD, pilih Media Files > Audio/Video, temukan video yang diproses sebelumnya, lalu klik Manage di kolom Tindakan. Di halaman yang muncul, klik tab Video URL.

      效果展示_1

    • URL dari stream bitrate adaptif pada gambar di atas digunakan untuk pemutaran.

      Di tab Basic halaman Pengaturan Online di ApsaraVideo Player, masukkan URL dari stream bitrate adaptif dan lihat efek pemutaran video di tab Preview.