全部产品
Search
文档中心

Intelligent Media Management:Transkoding Langsung

更新时间:Jul 06, 2025

Transkoding Langsung adalah fitur transkoding waktu nyata dari Intelligent Media Management (IMM) yang dirancang untuk memenuhi kebutuhan streaming video daring. Topik ini menjelaskan manfaat dan penggunaan Transkoding Langsung.

Ikhtisar

Berbeda dengan transkoding media, yang memerlukan seluruh video untuk ditranskode sebelum pemutaran dapat dimulai, Transkoding Langsung hanya memproses segmen video yang diperlukan dan memungkinkan pemutaran dimulai segera setelah file video asli diunggah. Transkoding Langsung menawarkan manfaat berikut:

  • Pemutaran instan selama proses transkoding tanpa buffering

  • Transkoding dioptimalkan dan pemutaran lancar dengan scrubbing diselesaikan dalam hitungan detik

  • Transkoding sesuai permintaan, re-transcoding jika file hasil transkode terhapus, serta biaya transkoding dan penyimpanan yang lebih rendah

  • Transcoding kustom dengan puluhan parameter transkoding kustom

  • Kompatibilitas baik dengan lebih dari 300 format audio dan video

Catatan

Transkoding Langsung tidak mendukung pemutaran anonim.

Proses penggunaan

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

  2. Panggil operasi GenerateVideoPlaylist untuk membuat daftar putar dan gunakan fitur tanda tangan OSS untuk menandatangani daftar putar tersebut.

  3. Gunakan pemutar untuk mendapatkan daftar putar dan mulai pemutaran. Pemutaran video secara otomatis memicu Transkoding Langsung.

Skenario

  • Putar video yang disimpan di drive jaringan: Transkoding Langsung memungkinkan video di drive jaringan diputar secara instan saat diminta pada klien dengan resolusi yang paling sesuai dengan kondisi jaringan aktual. Ini memastikan pemutaran waktu nyata dan memberikan kompatibilitas video yang baik di berbagai perangkat. Transkoding Langsung juga mengurangi biaya penyimpanan karena video di drive jaringan tidak ditranskode jika video tersebut tidak diminta.

  • Pratinjau dan putar video di platform media sosial: Transkoding Langsung memungkinkan pengguna di platform pesan instan dan media sosial untuk segera memutar video yang diterima. Ini meningkatkan ketepatan waktu komunikasi. Selain itu, ketika pengguna memutar video dalam riwayat obrolan yang belum ditonton dalam waktu lama, mereka masih dapat memutarnya secara instan meskipun objek TS yang dihasilkan untuk video tersebut secara rutin dihapus untuk mengurangi penggunaan penyimpanan.

  • Berbagi konten video di forum dan platform blogging: Transkoding Langsung memberikan pengalaman menonton video yang lancar dan kompatibel dengan perangkat kepada pengguna di forum dan platform blogging. Ini memungkinkan pengguna untuk segera memutar video yang dibagikan dengan resolusi yang paling sesuai dengan kondisi jaringan mereka.

Manfaat

Tabel berikut menjelaskan manfaat Transkoding Langsung secara rinci.

Manfaat

Deskripsi

Standardisasi

  • Transkoding langsung mendukung protokol HTTP Live Streaming (HLS).

  • Transkoding langsung mendukung daftar putar media dan daftar putar utama.

  • Transkoding langsung memungkinkan pemutaran video dengan beberapa aliran video, aliran audio, dan aliran subtitle.

  • Transkoding langsung mendukung pemutar HLS utama.

  • Transkoding langsung mendukung lebih dari 300 format audio dan video utama.

Efisiensi biaya

  • Video dan segmen video yang tidak diputar tidak ditranskode, yang mengurangi overhead transkoding.

  • Segmen video hasil transkode dapat dihapus untuk mengurangi penggunaan penyimpanan. Memutar video yang file atau segmen hasil transkodenya telah dihapus memicu transkoding lagi, yang membantu menghindari memengaruhi pengalaman pemutaran daring.

Efisiensi tinggi

  • IMM mengadopsi kluster server besar dan oleh karena itu mendukung banyak tugas transkoding langsung.

  • Video dapat dikonversi menjadi aliran video dengan resolusi dan bitrate berbeda untuk memastikan pemutaran lancar dalam kondisi jaringan yang berbeda.

  • Penonton dapat memutar video segera saat daftar putar dibuat, tanpa perlu menunggu video sepenuhnya ditranskode.

  • Ukuran segmen header video bersifat adaptif, membuat pemuatan video lebih efisien.

  • Didukung pre-transkoding cerdas.

Format audio dan video yang didukung

Fitur Transkoding Langsung mendukung hampir semua format audio dan video, mencakup lebih dari 300 jenis berbeda. Tabel berikut menjelaskan beberapa format audio dan video umum yang didukung oleh Transkoding Langsung.

Format video input

Format utama, seperti AVI, MOV, FLV, MKV, WebM, MPEG, WMV, RM, VOB, dan TS

Format audio input

Format utama, seperti MP3, WAV, AAC, FLAC, dan WMA

Format wadah output

ts

Prasyarat

  1. Sepasang AccessKey dibuat dan diperoleh. Untuk informasi lebih lanjut, lihat Buat pasangan AccessKey.

  2. Objek relevan diunggah ke Bucket OSS. Untuk informasi lebih lanjut, lihat Mulai menggunakan konsol OSS.

  3. IMM diaktifkan dan proyek IMM dibuat. Untuk informasi lebih lanjut, lihat Aktifkan IMM dan Buat proyek.

Catatan

Anda juga dapat membuat proyek dengan memanggil operasi CreateProject. Untuk informasi lebih lanjut, lihat CreateProject.

Anda dapat memanggil operasi ListProjects untuk menanyakan proyek yang ada di wilayah tertentu. Untuk informasi lebih lanjut, lihat ListProjects.

  1. Pengguna RAM diberikan izin yang diperlukan untuk menggunakan Transkoding Langsung. Untuk informasi lebih lanjut, lihat Izin.

  2. Bucket OSS diikat ke proyek IMM. Untuk informasi lebih lanjut tentang cara mengikat bucket OSS ke proyek IMM di konsol OSS atau dengan menggunakan API IMM, lihat Mulai dan AttachOSSBucket.

  3. Jika perlindungan hotlink dikonfigurasikan untuk bucket yang menyimpan video sumber atau video tujuan, kebijakan perlindungan hotlink yang mengizinkan permintaan dengan bidang Referer kosong dikonfigurasikan untuk bucket tersebut. Untuk informasi lebih lanjut, lihat Konfigurasikan daftar putih atau daftar hitam Referer untuk mencegah situs web lain menautkan ke objek OSS Anda.

  4. Jika pemutar Anda perlu memulai permintaan lintas asal ke bucket yang menyimpan video tujuan, pastikan bahwa akses lintas asal ke bucket diizinkan dari pemutar Anda. Untuk informasi lebih lanjut, lihat CORS.

Contoh

Gunakan daftar putar media

Tugas Transkoding

  • Video Sumber

    • Format Video: AVI

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

  • Video Tujuan

    • Durasi Segmen: 10 detik

    • Panjang Video Pra-transkode: 36 detik

    • Format Aliran Video: H.264

    • Resolusi Video: 1280 × 720

    • Laju Frame: 25 fps

    • Bitrate Video: 2 Mbit/s

    • Format Aliran Audio: AAC

    • Bitrate Audio: 128 Kbit/s

    • Awalan Jalur Objek Tujuan: oss://your-oss-bucket-name/output/media

Langkah 1: Hasilkan daftar putar

Catatan

Untuk informasi lebih lanjut tentang cara menghasilkan daftar putar, lihat GenerateVideoPlaylist.

  • Permintaan Contoh

    {
      "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"
            }
          }
        }
      ]
    }
  • Respons Contoh

    {
      "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:
            """
            Gunakan ID AccessKey dan rahasia AccessKey untuk menginisialisasi akun Client.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # Berikan ID AccessKey Anda.
                access_key_id=access_key_id,
                # Berikan rahasia AccessKey Anda.
                access_key_secret=access_key_secret
            )
            # Tentukan titik akhir IMM.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
    
        @staticmethod
        def main() -> None:
            # Berikan ID AccessKey dan rahasia AccessKey Anda. Kami sarankan Anda mendapatkan ID AccessKey dan rahasia AccessKey dari konfigurasi.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
    
            # Tentukan nama proyek.
            project_name = "test-project"
    
            # Tentukan URI OSS video sumber.
            source_uri = "oss://your-oss-bucket-name/test.avi"
    
            # Tentukan URI objek tujuan.
            target_uri = "oss://your-oss-bucket-name/output/media"
    
            # Inisialisasi klien.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
    
            # Buat video tujuan.
            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 parameter dan nilai permintaan.
            print(json.dumps(req.to_map(), indent=4))
    
            # Ajukan 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"),            // Tentukan ID wilayah tempat proyek berada.
    		AccessKeyId:     tea.String("your_access_key_id"),     // Berikan ID AccessKey pengguna RAM.
    		AccessKeySecret: tea.String("your_access_key_secret"), // Berikan rahasia AccessKey pengguna RAM.
    	})
    	if err != nil {
    		// Tangani kesalahan.
    		panic(err)
    	}
    
    	// Tentukan nama proyek.
    	projectName := "test-project"
    
    	// Tentukan URI OSS video sumber.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    
    	// Tentukan URI objek tujuan.
    	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},
    	}
    
    	// Ajukan permintaan.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    
    	// Cetak respons.
    	fmt.Println("Respons:", *res.Body)
    }
    // File ini dihasilkan secara otomatis, jangan edit. Terima kasih.
    package com.aliyun.sample;
    
    import com.aliyun.tea.*;
    
    public class Sample {
    
        /**
         *  :
         * <p>Gunakan ID AccessKey dan rahasia AccessKey Anda untuk menginisialisasi klien.</p>
         * @return Client
         * 
         * @throws Exception
         */
        public static com.aliyun.teaopenapi.Client createClient() throws Exception {
            // Jika kode proyek bocor, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya dalam akun Anda mungkin terganggu. Contoh kode berikut hanya untuk referensi.
            // Untuk keamanan yang lebih baik, kami sarankan Anda menggunakan kredensial akses sementara yang dikeluarkan oleh Security Token Service (STS). Untuk informasi lebih lanjut, lihat https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials.
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // Diperlukan. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dikonfigurasi.
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // Diperlukan. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET dikonfigurasi.
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Untuk daftar titik akhir IMM untuk wilayah yang didukung, kunjungi https://api.alibabacloud.com/product/imm.
            config.endpoint = "imm.cn-beijing.aliyuncs.com";
            return new com.aliyun.teaopenapi.Client(config);
        }
    
        /**
         *  :
         * <p>Parameter dan nilai kembali</p>
         * 
         * @param path string Parameter jalur
         * @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()
                    // Operasi yang ingin Anda lakukan.
                    .setAction("GenerateVideoPlaylist")
                    // Nomor versi operasi.
                    .setVersion("2020-09-30")
                    // Protokol.
                    .setProtocol("HTTPS")
                    // Metode HTTP operasi.
                    .setMethod("POST")
                    .setAuthType("AK")
                    .setStyle("RPC")
                    // Jalur operasi.
                    .setPathname("/")
                    // Format tubuh permintaan.
                    .setReqBodyType("json")
                    // Format tubuh 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));
            // Tulis kode Anda untuk menampilkan respons operasi jika diperlukan.
            // Responsnya bertipe MAP, yang berisi tubuh respons, header respons, dan kode status HTTP.
            client.callApi(params, request, runtime);
        }
    }

Langkah 2: Tandatangani playlist

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, Anda harus mengonfigurasi variabel lingkungan. 
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Tentukan endpoint untuk wilayah tempat bucket berada.  
endpoint = 'yourEndpoint'
# Tentukan ID wilayah tempat bucket berada. Contoh: cn-hangzhou. 
region = 'cn-hangzhou'
# Tentukan nama bucket tempat playlist yang dihasilkan disimpan. 
bucket_name = 'your-oss-bucket-name'
# Tentukan nama playlist. 
key = 'output/media.m3u8'

# Tentukan instance bucket. Anda harus menggunakan instance bucket untuk memanggil semua metode terkait objek. 
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region) 
# Tentukan hls/sign,live_1 dalam operasi x-oss-process. 
params = {}
params.update({oss2.Bucket.PROCESS: 'hls/sign,live_1'})

# Tandatangani URL. 
url = bucket.sign_url('GET', key, 7200, params=params, slash_safe=True)

# URL yang dihasilkan dapat langsung digunakan di pemutar HLS untuk pemutaran. 
print(url)
# Dalam contoh ini, URL adalah 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 akses dari variabel lingkungan. Sebelum menjalankan kode contoh, Anda harus mengonfigurasi variabel lingkungan. 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Buat instance OSSClient. 
	// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.  
	// Tentukan endpoint wilayah tempat bucket berada. 
	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)
	}

	// Tentukan nama bucket. Dalam contoh ini, nama bucket adalah your-oss-bucket-name. 
	bucket, err := client.Bucket("your-oss-bucket-name")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Gunakan hls/sign untuk menandatangani playlist. String "hls/sign,live_1" menentukan transkoding langsung. 
	// Tentukan jalur penuh objek M3U8. Dalam contoh ini, jalurnya adalah output/media.m3u8. 
	// Tentukan periode validitas tanda tangan. Dalam contoh ini, periode validitas diatur menjadi 7.200 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)
	}

	// Ubah URL menjadi URL yang dapat digunakan oleh pemutar video untuk pemutaran video. 
	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())

	// URL yang ditandatangani dapat langsung digunakan di pemutar HLS untuk pemutaran. 
	//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 {
        // Dalam contoh ini, endpoint wilayah China (Beijing) digunakan. Tentukan endpoint aktual Anda. 
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String region = "cn-beijing";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET dikonfigurasi. 
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Wajib. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dikonfigurasi. 
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Wajib. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET dikonfigurasi. 
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Tentukan nama bucket. Contoh: examplebucket. 
        String bucketName = "test-project";
        // Tentukan jalur penuh objek. Contoh: exampleobject.txt. Jangan sertakan nama bucket dalam jalur penuh objek. 
        String objectKey = "output/media.m3u8";
        // Buat instance OSSClient. 
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        // Tentukan periode validitas URL.
        Date expiration = new Date(new Date().getTime() + 7200 * 1000); // Dalam contoh ini, periode validitas diatur menjadi 2 jam.
        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);

        // Tampilkan URL yang ditandatangani.
        System.out.println(signedUrl);
        // Matikan klien.


        // Matikan instance OSSClient. 
        ossClient.shutdown();         
        try {
            // Tentukan periode validitas URL yang ditandatangani. Satuan: milidetik. Dalam contoh ini, periode validitas diatur menjadi 1 jam. 
            URL url = ossClient.generatePresignedUrl(bucketName, objectKey, expiration);
            System.out.println(url);
        } catch (OSSException oe) {
            System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena alasan tertentu.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("ID Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Tangkap ClientException, yang berarti klien mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Langkah 3: Putar video

Anda dapat langsung menggunakan URL yang telah ditandatangani yang dihasilkan di Langkah 2: Tandatangani playlist di pemutar HLS untuk memutar video.

  • Putar Video di Safari pada Mac

    Pemutar Safari di Mac mendukung pemutaran HLS. Anda dapat langsung menyalin URL yang telah ditandatangani dan menempelkannya ke bilah alamat Safari untuk memutar video.

  • Putar Video di ApsaraVideo Player untuk Web

    Buka ApsaraVideo Player untuk Web. Salin URL yang telah ditandatangani dan tempelkan ke dalam bidang URL.

    Catatan

    Anda juga dapat mengintegrasikan SDK ApsaraVideo Player ke dalam aplikasi Anda untuk langsung memutar video di aplikasi Anda. Untuk informasi lebih lanjut, lihat Ikhtisar.

    image

  • Putar Video di Pemutar Lain yang Kompatibel dengan HLS

    Salin URL yang telah ditandatangani dan tempelkan ke dalam pemutar untuk memutar video.

Gunakan daftar putar utama

Tugas Transkoding

  • Video Sumber

    • Format Video: AVI

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

  • URI Daftar Putar Utama: oss://your-oss-bucket-name/output/master.m3u8

  • Video Tujuan 1

    • Durasi Segmen: 10 detik

    • Panjang Video Pra-transkode: 36 detik

    • Format Aliran Video: H.264

    • Resolusi Video: 1920 × 1080

    • Laju Bingkai: 25 fps

    • Format Aliran Audio: AAC

    • Bitrate Audio: 128 Kbit/s

    • Awalan Jalur Objek Tujuan: oss://your-oss-bucket-name/output/1080p/1080p

  • Video Tujuan 2

    • Durasi Segmen: 10 detik

    • Panjang Video Pra-transkode: 36 detik

    • Format Aliran Video: H.264

    • Resolusi Video: 1280 × 720

    • Laju Bingkai: 25 fps

    • Format Aliran Audio: AAC

    • Bitrate Audio: 96 Kbit/s

    • Awalan Jalur Objek Tujuan: oss://your-oss-bucket-name/output/720p/720p

  • Video Tujuan 3

    • Durasi Segmen: 10 detik

    • Panjang Video Pra-transkode: 36 detik

    • Format Aliran Video: H.264

    • Resolusi Video: 720 × 540

    • Laju Bingkai: 25 fps

    • Format Aliran Audio: AAC

    • Bitrate Audio: 64 Kbit/s

    • Awalan Jalur Objek Tujuan: oss://your-oss-bucket-name/output/540p/540p

Langkah 1: Hasilkan daftar putar

  • Permintaan Contoh

    {
      "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"
            }
          }
        }
      ]
    }
    
  • Respons Contoh

    {
      "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:
            """
            Gunakan AccessKey ID dan Rahasia AccessKey untuk menginisialisasi Client akun.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # Berikan AccessKey ID Anda.
                access_key_id=access_key_id,
                # Berikan Rahasia AccessKey Anda.
                access_key_secret=access_key_secret
            )
            # Tentukan endpoint IMM.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
    
        @staticmethod
        def main() -> None:
            # Berikan AccessKey ID dan Rahasia AccessKey Anda. Kami sarankan Anda mendapatkan AccessKey ID dan Rahasia AccessKey dari konfigurasi.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
    
            # Tentukan nama proyek.
            project_name = "test-project"
    
            # Tentukan OSS URI video sumber.
            source_uri = "oss://your-oss-bucket-name/test.avi"
    
            # Tentukan URI objek tujuan.
            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 client.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
    
            # Buat video 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 video 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 video 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 parameter dan nilai permintaan.
            print(json.dumps(req.to_map(), indent=4))
    
            # Ajukan permintaan.
            response = client.generate_video_playlist(req)
    
            # Cetak respon.
            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"),            // Tentukan ID wilayah tempat proyek berada.
    		AccessKeyId:     tea.String("your_access_key_id"),     // Berikan ID AccessKey pengguna RAM.
    		AccessKeySecret: tea.String("your_access_key_secret"), // Berikan Rahasia AccessKey pengguna RAM.
    	})
    	if err != nil {
    		// Tangani kesalahan.
    		panic(err)
    	}
    
    	// Tentukan nama proyek.
    	projectName := "test-project"
    
    	// Tentukan OSS URI video sumber.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    
    	// Tentukan URI objek tujuan.
    	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},
    	}
    
    	// Ajukan permintaan.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    
    	// Cetak respon.
    	fmt.Println("Response:", *res.Body)
    }
    

Langkah 2: Tandatangani daftar putar

Tandatangani daftar putar utama dengan cara yang sama seperti Anda menandatangani daftar putar media. Untuk informasi lebih lanjut, lihat Langkah 2: Tandatangani daftar putar.

Langkah 3: Putar video

Untuk informasi lebih lanjut tentang cara memutar video, lihat Langkah 3: Putar video.

FAQ

Apakah saya memerlukan pemain kustom untuk memutar video yang ditranskode menggunakan transkoding langsung?

Tidak, Anda tidak memerlukannya. Transkoding Langsung mendukung protokol HLS. Anda dapat menggunakan pemutar video dan browser yang kompatibel dengan HLS, seperti ApsaraVideo Player for Web dan Safari, untuk memutar video yang ditranskode menggunakan Transkoding Langsung.

Objek tujuan apa yang dihasilkan oleh transkoding langsung?

Transkoding Langsung menghasilkan objek M3U8 dan TS di jalur yang ditentukan. Objek M3U8 segera dihasilkan.

Jika Anda menentukan panjang pra-transkoding, objek TS dibuat secara asinkron untuk panjang yang ditentukan dan transkoding sesuai permintaan asinkron dipicu pada bagian yang tidak ditentukan pra-transkoding. Jika video belum pernah diputar, tidak ada objek TS yang dihasilkan untuk bagian video yang tidak dicakup oleh pra-transkoding. Sebagai contoh, jika Anda memutar video dari menit ke-15, transkoding juga hanya dimulai dari menit ke-15. Berikut ini adalah contoh objek output:

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

Bisakah saya memutar video yang objek TS-nya telah dihapus?

Ya, Anda tetap dapat memutar video meskipun beberapa atau semua objek TS telah dihapus. Namun, pastikan bahwa video dan objek M3U8 tidak dihapus. Hal ini karena permintaan untuk daftar putar M3U8 memicu regenerasi objek TS. Mekanisme ini memungkinkan Anda menghapus objek TS yang dihasilkan untuk video yang tidak ditonton dalam waktu lama guna mengurangi biaya penyimpanan tanpa memengaruhi kinerja pemutaran di masa mendatang.

Apakah transkoding langsung mendukung daftar putar M3U8 yang tidak dibuat dari transkoding langsung?

Tidak, Transkoding Langsung tidak mendukung daftar putar M3U8 yang tidak dibuat dari Transkoding Langsung.

Bisakah saya menggunakan Alibaba Cloud CDN untuk mempercepat transkoding langsung?

Ya, Anda bisa. Untuk informasi lebih lanjut, lihat Gunakan Alibaba Cloud CDN bersama dengan Transkoding Langsung untuk mempercepat pemutaran video.