All Products
Search
Document Center

Intelligent Media Management:Transkode saat streaming

Last Updated:Jun 19, 2026

Transkode saat streaming adalah fitur transkoding real-time untuk pemutaran video online yang memulai pemutaran segera setelah unggahan selesai dan hanya mentranskode segmen yang sedang ditonton.

Ikhtisar

Berbeda dengan ApsaraVideo Media Processing, yang mengharuskan menunggu hingga transkoding video lengkap selesai setelah unggahan sebelum pemutaran dapat dimulai, transkode saat streaming memulai pemutaran segera setelah video sumber selesai diunggah. Fitur ini hanya mentranskode segmen video yang diperlukan untuk pemutaran, sehingga memberikan:

  • Transkoding selama pemutaran—tidak perlu menunggu.

  • Transkoding yang dioptimalkan dengan waktu startup dan waktu pencarian (seek time) kurang dari satu detik—pengalaman pemutaran mendekati lokal.

  • Tidak ada transkoding tanpa pemutaran. Bahkan jika file hasil transkoding dihapus, file tersebut dapat dibuat ulang sesuai permintaan—biaya transkoding dan penyimpanan berkurang secara signifikan.

  • Dukungan terhadap puluhan parameter transkoding—pengaturan yang sangat dapat dikustomisasi.

  • Kompatibilitas tinggi—dukungan lebih dari 300 format audio dan video.

Catatan

Transkode saat streaming tidak mendukung pemutaran anonim.

Alur Kerja

  1. Unggah file video Anda ke Object Storage Service (OSS).

  2. Gunakan API GenerateVideoPlaylist untuk menghasilkan file playlist media secara cepat. Tandatangani playlist tersebut menggunakan kemampuan penandatanganan OSS untuk mendapatkan URL playlist yang ditandatangani.

  3. Pemutar mengambil playlist yang ditandatangani dan memulai pemutaran. Fitur transkode saat streaming dipicu secara otomatis selama pemutaran.

Skenario Penggunaan

  • Penyimpanan cloud: Pengguna mengunggah video ke drive cloud. Klien langsung memilih resolusi yang sesuai berdasarkan kondisi jaringan untuk pemutaran. Hal ini memastikan pemutaran real-time dan kompatibilitas lintas perangkat. Karena sebagian besar video di penyimpanan cloud jarang diakses ("cold"), transkode saat streaming menghindari transkoding konten yang tidak diputar, sehingga mengurangi biaya transkoding dan penyimpanan secara signifikan.

  • Pratinjau video di aplikasi chat: Di platform pesan instan atau media sosial, begitu pengirim selesai mengunggah (dan server menerima file), penerima dapat langsung memulai pemutaran—meningkatkan komunikasi real-time. File hasil transkoding untuk pesan historis yang lama tidak dilihat dapat dibersihkan secara berkala untuk menurunkan biaya penyimpanan, dan pemutaran tetap instan saat diakses kembali.

  • Forum online dan blog: Setelah pengguna mengunggah video sumber untuk dibagikan, orang lain dapat langsung memutar versi hasil transkoding—memastikan pemutaran lancar, definisi tinggi, dan kompatibilitas format yang luas.

Fitur

Tabel berikut menjelaskan fitur tambahan.

Fitur

Deskripsi

Standardisasi

  • Dukungan terhadap protokol HTTP Live Streaming (HLS) standar.

  • Dukungan pembuatan playlist media dan master playlist.

  • Dukungan pemutaran multi-aliran video, multi-aliran audio, dan multi-aliran teks (caption).

  • Kompatibel dengan pemutar HLS utama.

  • Dukungan lebih dari 300 format audio dan video utama.

Biaya rendah

  • Video dan segmen yang tidak diputar tidak ditranskode, sehingga mengurangi biaya transkoding.

  • Segmen video hasil transkoding dapat dihapus untuk menghemat biaya penyimpanan. Saat diputar ulang, sistem secara otomatis memicu transkoding baru untuk mempertahankan pemutaran yang mulus.

Efisiensi tinggi

  • Kluster berskala besar mendukung transkoding real-time.

  • Menyediakan beberapa aliran video dengan berbagai resolusi dan bitrate untuk menyesuaikan kondisi jaringan yang berbeda dan memastikan pemutaran lancar.

  • Pemutaran dimulai segera setelah playlist dihasilkan—tidak perlu menunggu transkoding lengkap.

  • Ukuran segmen adaptif untuk header video memungkinkan pemuatan awal lebih cepat.

  • Pre-transkoding cerdas.

Format audio dan video yang didukung

Transkode saat streaming mendukung lebih dari 300 format audio dan video. Tabel berikut mencantumkan beberapa format umum yang didukung.

Format video input

avi, mov, flv, mkv, webm, mpeg, wmv, rm, vob, ts, dan semua format utama lainnya

Format audio input

mp3, wav, aac, flac, wma, dan semua format utama lainnya

Format kontainer output

ts

Prasyarat

  1. Buat dan peroleh AccessKey.

  2. Aktifkan OSS, buat bucket, dan unggah file ke dalamnya. Untuk detailnya, lihat Quick Start di Konsol.

  3. Aktifkan Intelligent Media Management (IMM) dan buat proyek. Untuk detailnya, lihat Aktifkan layanan dan Buat proyek.

    Catatan

    Anda juga dapat memanggil API CreateProject untuk membuat proyek.

    Anda dapat memanggil API ListProjects untuk menampilkan semua proyek di wilayah tertentu.

  4. Berikan izin yang diperlukan kepada Pengguna Resource Access Management (RAM) Anda untuk operasi IMM.

  5. Sebelum menggunakan transkode saat streaming, ikat proyek IMM. Untuk petunjuk pengikatan melalui Konsol atau API, lihat Quick Start dan Bind OSS bucket.

  6. Jika perlindungan hotlink diaktifkan pada bucket yang berisi video sumber atau output Anda, pastikan kebijakan perlindungan hotlink Anda mengizinkan Referer kosong.

  7. Jika pemutar Anda memerlukan akses lintas domain ke OSS, aktifkan Berbagi Sumber Daya Lintas Domain (CORS) OSS untuk bucket target. Lihat Pengaturan CORS.

Penggunaan

Contoh Playlist Media

Konfigurasi transkoding

  • Informasi video sumber

    • Format: AVI

    • URI sumber: oss://your-oss-bucket-name/test.avi

  • Video target

    • Durasi segmen: 10 detik

    • Durasi pre-transkode: 36 detik

    • Kodek video: H.264

    • Resolusi: 1280×720

    • Laju bingkai: 25 fps

    • Bitrate video: 2 Mbps

    • Kodek audio: AAC

    • Bitrate audio: 128 Kbps

    • Awalan path output: oss://your-oss-bucket-name/output/media

Langkah 1: Hasilkan playlist

Catatan

Lihat dokumentasi API Generate transcode while streaming playlist.

  • Contoh permintaan

    {
      "ProjectName": "test-project",
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Codec": "aac",
              "Bitrate": 128000,
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/media",
          "Video": {
            "TranscodeVideo": {
              "Codec": "h264",
              "Bitrate": 2400000,
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
  • Contoh respons

    {
      "RequestId": "********-3ADC-576A-BD1E-************",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "3d8ca7d6b3**********4b3cb69fe3bf",
          "URI": "oss://your-oss-bucket-name/output/media.m3u8"
        }
      ]
    }
    
  • Kode contoh

    # -*- coding: utf-8 -*-
    import json
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    class Sample:
        def __init__(self):
            pass
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            Inisialisasi klien menggunakan ID AccessKey dan rahasia AccessKey.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # ID AccessKey Anda.
                access_key_id=access_key_id,
                # Rahasia AccessKey Anda.
                access_key_secret=access_key_secret
            )
            # Titik akhir IMM.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
        @staticmethod
        def main() -> None:
            # Gunakan ID dan rahasia AccessKey IMM. Baca dari konfigurasi jika memungkinkan.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
            # Nama proyek.
            project_name = "test-project"
            # URI OSS video sumber.
            source_uri = "oss://your-oss-bucket-name/test.avi"
            # URI target.
            target_uri = "oss://your-oss-bucket-name/output/media"
            # Inisialisasi klien.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
            # Buat target.
            target = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=128000,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        bitrate=2400000,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
            # Buat permintaan API.
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                targets=[target]
            )
            # Cetak permintaan.
            print(json.dumps(req.to_map(), indent=4))
            # Kirim permintaan.
            response = client.generate_video_playlist(req)
            # Cetak respons.
            print(json.dumps(response.body.to_map(), indent=4))
    if __name__ == '__main__':
        Sample.main()
    
    package main
    import (
    	"fmt"
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    func main() {
    	// Inisialisasi klien IMM.
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // ID wilayah proyek Anda.
    		AccessKeyId:     tea.String("your_access_key_id"),     // ID AccessKey Pengguna RAM.
    		AccessKeySecret: tea.String("your_access_key_secret"), // Rahasia AccessKey Pengguna RAM.
    	})
    	if err != nil {
    		// Tangani error.
    		panic(err)
    	}
    	// Nama proyek.
    	projectName := "test-project"
    	// URI OSS video.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    	// URI target.
    	targetUri := "oss://your-oss-bucket-name/output/media"
    	target := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(targetUri),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				Bitrate:    tea.Int32(2400000),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	// Buat permintaan API.
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target},
    	}
    	// Kirim permintaan.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    	// Cetak respons.
    	fmt.Println("Response:", *res.Body)
    }
    // File ini di-generate otomatis, jangan diedit. Terima kasih.
    package com.aliyun.sample;
    import com.aliyun.tea.*;
    public class Sample {
        /**
         * description :
         * <p>Inisialisasi klien menggunakan AK&amp;SK</p>
         * @return Client
         * 
         * @throws Exception
         */
        public static com.aliyun.teaopenapi.Client createClient() throws Exception {
            // Kebocoran kredensial dapat membahayakan semua resource di akun Anda. Contoh ini hanya untuk referensi.
            // Gunakan STS untuk keamanan lebih baik. Lihat https://www.alibabacloud.com/help/document_detail/378657.html untuk opsi lainnya.
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // Wajib. Pastikan ALIBABA_CLOUD_ACCESS_KEY_ID diset sebagai variabel lingkungan.
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // Wajib. Pastikan ALIBABA_CLOUD_ACCESS_KEY_SECRET diset sebagai variabel lingkungan.
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Titik akhir: https://api.aliyun.com/product/imm
            config.endpoint = "imm.cn-beijing.aliyuncs.com";
            return new com.aliyun.teaopenapi.Client(config);
        }
        /**
         * description :
         * <p>Info API</p>
         * 
         * @param path string Parameter path
         * @return OpenApi.Params
         */
        public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
            com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
                    // Nama API
                    .setAction("GenerateVideoPlaylist")
                    // Versi API
                    .setVersion("2020-09-30")
                    // Protokol
                    .setProtocol("HTTPS")
                    // Metode HTTP
                    .setMethod("POST")
                    .setAuthType("AK")
                    .setStyle("RPC")
                    // Path
                    .setPathname("/")
                    // Format body permintaan
                    .setReqBodyType("json")
                    // Format body respons
                    .setBodyType("json");
            return params;
        }
        public static void main(String[] args_) throws Exception {
            java.util.List<String> args = java.util.Arrays.asList(args_);
            com.aliyun.teaopenapi.Client client = Sample.createClient();
            com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
            // Parameter kueri
            java.util.Map<String, Object> queries = new java.util.HashMap<>();
            queries.put("ProjectName", "test-project");
            queries.put("SourceURI", "oss://your-oss-bucket-name/test.avi");
            queries.put("Targets", "[{\"Video\":{\"TranscodeVideo\":{\"Codec\":\"h264\",\"Bitrate\":128000,\"FrameRate\":25,\"Resolution\":\"1280x\"}},\"Audio\":{\"TranscodeAudio\":{\"SampleRate\":44100,\"Codec\":\"aac\",\"Bitrate\":2400000}},\"Duration\":10,\"InitialSegments\":[2,2,2],\"InitialTranscode\":36,\"URI\":\"oss://your-oss-bucket-name/output/media\"}]");
            // Opsi runtime
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest()
                    .setQuery(com.aliyun.openapiutil.Client.query(queries));
            // Jalankan dan cetak respons API.
            // Respons adalah Map yang berisi body, headers, dan statusCode.
            client.callApi(params, request, runtime);
        }
    }

Langkah 2: Tandatangani playlist

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial dari variabel lingkungan. Konfigurasikan sebelum menjalankan.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Titik akhir untuk wilayah bucket Anda.
endpoint = 'yourEndpoint'
# ID wilayah, misalnya cn-hangzhou.
region = 'cn-hangzhou'
# Nama bucket.
bucket_name = 'your-oss-bucket-name'
# Nama playlist.
key = 'output/media.m3u8'
# Buat instance bucket.
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region) 
# Set x-oss-process ke hls/sign,live_1.
params = {}
params.update({oss2.Bucket.PROCESS: 'hls/sign,live_1'})
# Hasilkan URL yang ditandatangani.
url = bucket.sign_url('GET', key, 7200, params=params, slash_safe=True)
# Gunakan URL ini langsung di pemutar HLS.
print(url)
# Contoh URL: http://your-oss-bucket-name.yourendpoint/output/media.m3u8?x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature-version=OSS2&x-oss-expires=1683619052&x-oss-access-key-id=yourAccessKeyId&x-oss-signature=4Lja6Sgb7zXWzY9R9QTRe4FxI240fApDavp%2BSMj3ufg%3D
package main
import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"net/http"
	"net/url"
	"os"
	"strings"
)
func main() {
	// Dapatkan kredensial dari variabel lingkungan. Konfigurasikan sebelum menjalankan.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Buat klien OSS.
	// yourEndpoint: misalnya, https://oss-cn-hangzhou.aliyuncs.com untuk China (Hangzhou).
	// yourRegion: misalnya, cn-hangzhou.
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("yourRegion"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Nama bucket.
	bucket, err := client.Bucket("your-oss-bucket-name")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Gunakan oss hls/sign. "hls/sign,live_1" mengaktifkan transkode saat streaming.
	// Path lengkap ke m3u8, misalnya output/media.m3u8.
	// Masa berlaku tanda tangan: 7200 detik (2 jam).
	signedURL, err := bucket.SignURL("output/media.m3u8", http.MethodGet, 7200, oss.Process("hls/sign,live_1"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Format untuk digunakan oleh pemutar.
	rawUrl, err := url.Parse(signedURL)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	rawUrl.RawPath = strings.Replace(rawUrl.RawPath, "%2F", "/", -1)
	// Cetak URL yang ditandatangani.
	fmt.Println(rawUrl.String())
	// Tempelkan URL ini ke pemutar HLS.
	//http://your-oss-bucket-name.yourEndpoint/output/media.m3u8?x-oss-access-key-id=yourAccessKeyId&x-oss-expires=1683618084&x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature=%2BqTZ0R04Ft065gdyoP6f9yJdd1UXi%2F8eoxd9c9Stl2g%3D&x-oss-signature-version=OSS2
}
package com.aliyun.sample;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;
public class demo {
    public static void main(String[] args) throws Throwable {
        // Contoh titik akhir: https://oss-cn-beijing.aliyuncs.com. Sesuaikan dengan wilayah Anda.
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String region = "cn-beijing";
        // Dapatkan kredensial dari variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Wajib. Pastikan ALIBABA_CLOUD_ACCESS_KEY_ID diset.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Wajib. Pastikan ALIBABA_CLOUD_ACCESS_KEY_SECRET diset.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Nama bucket.
        String bucketName = "test-project";
        // Path objek (tanpa nama bucket).
        String objectKey = "output/media.m3u8";
        // Buat klien OSS.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        // Set masa berlaku URL (2 jam).
        Date expiration = new Date(new Date().getTime() + 7200 * 1000);
        GeneratePresignedUrlRequest request=new GeneratePresignedUrlRequest(bucketName, objectKey, HttpMethod.GET);
        request.setExpiration(expiration);
        request.setProcess("hls/sign,live_1");
        // Hasilkan URL yang ditandatangani.
        URL signedUrl = ossClient.generatePresignedUrl(request);
        // Cetak URL.
        System.out.println(signedUrl);
        // Tutup klien OSS.
        ossClient.shutdown();         
        try {
            // Contoh: masa berlaku 1 jam.
            URL url = ossClient.generatePresignedUrl(bucketName, objectKey, expiration);
            System.out.println(url);
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException. Permintaan sampai ke OSS tetapi ditolak.");
            System.out.println("Pesan Error:" + oe.getErrorMessage());
            System.out.println("Kode Error:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("ID Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Terjadi ClientException. Klien mengalami masalah internal serius.");
            System.out.println("Pesan Error:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Langkah 3: Putar video

Tempelkan URL yang ditandatangani dari Langkah 2: Tandatangani playlist langsung ke pemutar HLS.

  • Putar di Safari pada Mac

    Safari di macOS mendukung pemutaran HLS. Tempelkan URL ke bilah alamat.

  • Putar dengan Aliplayer

    Buka Alibaba Cloud Aliplayer dan tempelkan URL ke bilah alamat.

    Catatan

    Anda juga dapat mengintegrasikan SDK ApsaraVideo Player ke dalam aplikasi Anda. Lihat Ikhtisar pemutar web.

  • Putar dengan pemutar HLS

    Tempelkan URL yang ditandatangani ke pemutar apa pun yang kompatibel dengan HLS.

Contoh Master Playlist

Konfigurasi transkoding

  • Video sumber

    • Format: AVI

    • URI sumber: oss://your-oss-bucket-name/test.avi

  • URI master playlist: oss://your-oss-bucket-name/output/master.m3u8

  • Video target 1

    • Durasi segmen: 10 detik

    • Durasi pre-transkode: 36 detik

    • Kodek video: H.264

    • Resolusi: 1920×1080

    • Laju bingkai: 25 fps

    • Kodek audio: AAC

    • Bitrate audio: 128 Kbps

    • Awalan path output: oss://your-oss-bucket-name/output/1080p/1080p

  • Video target 2

    • Durasi segmen: 10 detik

    • Durasi pre-transkode: 36 detik

    • Kodek video: H.264

    • Resolusi: 1280×720

    • Laju bingkai: 25 fps

    • Kodek audio: AAC

    • Bitrate audio: 96 Kbps

    • Awalan path output: oss://your-oss-bucket-name/output/720p/720p

  • Video target 3

    • Durasi segmen: 10 detik

    • Durasi pre-transkode: 36 detik

    • Kodek video: H.264

    • Resolusi: 720×540

    • Laju bingkai: 25 fps

    • Kodek audio: AAC

    • Bitrate audio: 64 Kbps

    • Awalan path output: oss://your-oss-bucket-name/output/540p/540p

Langkah 1: Hasilkan playlist

  • Contoh permintaan

    {
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "ProjectName": "test-project",
      "SourceSubtitles": [],
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 131072,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1920x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 98304,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/720p/720p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 65536,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/540p/540p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "720x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
    
  • Contoh respons

    {
      "Duration": 60.085,
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "RequestId": "********-3ADC-576A-BD1E-************",
      "Token": "1deb790e****************231a6f9d",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "720x406",
          "Token": "8bcd9bc0****************67a65f48",
          "URI": "oss://your-oss-bucket-name/output/540p/540p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "89ca4337****************cd031957",
          "URI": "oss://your-oss-bucket-name/output/720p/720p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1920x1080",
          "Token": "11fb1afb****************4f3683fc",
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p.m3u8"
        }
      ]
    }
  • Kode contoh

    # -*- coding: utf-8 -*-
    import json
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    class Sample:
        def __init__(self):
            pass
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            Inisialisasi klien menggunakan ID AccessKey dan rahasia AccessKey.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # ID AccessKey Anda.
                access_key_id=access_key_id,
                # Rahasia AccessKey Anda.
                access_key_secret=access_key_secret
            )
            # Titik akhir IMM.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
        @staticmethod
        def main() -> None:
            # Gunakan ID dan rahasia AccessKey IMM. Baca dari konfigurasi jika memungkinkan.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
            # Nama proyek.
            project_name = "test-project"
            # URI OSS video sumber.
            source_uri = "oss://your-oss-bucket-name/test.avi"
            # Awalan URI target.
            target_uri_prefix = "oss://your-oss-bucket-name/output"
            master_uri = f"{target_uri_prefix}/master.m3u8"
            target_1080p_uri = f"{target_uri_prefix}/1080p/1080p"
            target_720p_uri = f"{target_uri_prefix}/720p/720p"
            target_540p_uri = f"{target_uri_prefix}/540p/540p"
            # Inisialisasi klien.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
            # Buat target 1080p.
            target_1080p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=131072,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_1080p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1920x",
                        scale_type="fit",
                    )
                ),
            )
            # Buat target 720p.
            target_720p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=98304,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_720p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
            # Buat target 540p.
            target_540p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=65536,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_540p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="720x",
                        scale_type="fit",
                    )
                ),
            )
            # Buat permintaan API.
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                master_uri=master_uri,
                targets=[target_1080p, target_720p, target_540p]
            )
            # Cetak permintaan.
            print(json.dumps(req.to_map(), indent=4))
            # Kirim permintaan.
            response = client.generate_video_playlist(req)
            # Cetak respons.
            print(json.dumps(response.body.to_map(), indent=4))
    if __name__ == '__main__':
        Sample.main()
    
    package main
    import (
    	"fmt"
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    func main() {
    	// Inisialisasi klien IMM.
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // ID wilayah proyek Anda.
    		AccessKeyId:     tea.String("your_access_key_id"),     // ID AccessKey Pengguna RAM.
    		AccessKeySecret: tea.String("your_access_key_secret"), // Rahasia AccessKey Pengguna RAM.
    	})
    	if err != nil {
    		// Tangani error.
    		panic(err)
    	}
    	// Nama proyek.
    	projectName := "test-project"
    	// URI OSS video.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    	// Awalan URI target.
    	targetURIPrefix := "oss://your-oss-bucket-name/output"
    	masterURI := targetURIPrefix + "/master.m3u8"
    	target1080pURI := targetURIPrefix + "/1080p/1080p"
    	target720pURI := targetURIPrefix + "/720p/720p"
    	target540pURI := targetURIPrefix + "/540p/540p"
    	target1080p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(131072),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target1080pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1920x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	target720p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target720pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	target540p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(65536),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target540pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("720x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	// Buat permintaan API.
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		MasterURI:   tea.String(masterURI),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target1080p, target720p, target540p},
    	}
    	// Kirim permintaan.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    	// Cetak respons.
    	fmt.Println("Response:", *res.Body)
    }
    

Langkah 2: Tandatangani playlist

Tandatangani URL master playlist yang dikembalikan menggunakan penandatanganan OSS. Lihat Langkah 2: Tandatangani playlist.

Langkah 3: Putar video

Untuk petunjuk pemutaran, lihat Langkah 3: Putar video.

FAQ

Apakah saya memerlukan pemutar khusus?

Tidak. Transkode saat streaming mendukung protokol HLS standar. Gunakan pemutar standar yang kompatibel dengan HLS (seperti Alibaba Cloud Aliplayer atau browser Safari).

Apa saja file output yang dihasilkan?

Kami menghasilkan file m3u8 dan file TS berdasarkan awalan path input yang Anda tentukan. File m3u8 dihasilkan segera.

Jika Anda menentukan durasi pre-transkode, sistem akan menghasilkan file TS terkait secara asinkron. Segmen yang tidak ditentukan akan ditranskode sesuai permintaan selama pemutaran. Jika video tidak pernah diputar, tidak ada file TS yang dihasilkan untuk segmen tersebut. Misalnya, jika pemutaran dimulai pada menit ke-15, transkoding dimulai dari titik tersebut. Struktur direktori hasilnya seperti berikut:

.
├── outobjprefix.m3u8
├── outobjprefix-c280f054328fcde47c1732a8f2915009-0.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-1.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-2.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-3.ts

Apakah saya masih bisa memutar video jika saya menghapus file ts yang dihasilkan secara manual?

Ya. Selama video sumber dan playlist m3u8 tetap ada, menghapus sebagian atau seluruh file ts tidak memengaruhi pemutaran. Saat playlist m3u8 diminta kembali, file ts yang hilang akan dibuat ulang. Hal ini memungkinkan Anda membersihkan file ts untuk video yang jarang ditonton guna mengurangi biaya penyimpanan tanpa memengaruhi pemutaran di masa depan.

Apakah saya dapat menggunakan file m3u8 non-transkode-saat-streaming untuk fitur ini?

Tidak. Anda tidak dapat menggunakan file m3u8 yang dihasilkan di luar proses transkode saat streaming untuk mengaktifkan fitur ini.

Apakah saya dapat menggunakan CDN untuk mempercepat transkode saat streaming?

Ya. Untuk detailnya, lihat Gunakan CDN untuk mempercepat transkode saat streaming.