全部产品
Search
文档中心

Object Storage Service:Pengambilan aliran RTMP

更新时间:Nov 09, 2025

OSS mendukung pendorongan aliran video berkode H.264 dan aliran audio berkode AAC menggunakan Protokol Pesan Waktu Nyata (RTMP). Data yang diambil dapat digunakan untuk skenario video sesuai permintaan atau streaming langsung. Topik ini menjelaskan cara mendorong aliran audio dan video ke OSS serta memainkan data yang diambil.

Batasan

  • Hanya pengambilan aliran RTMP yang didukung. Penarikan aliran tidak didukung.

  • Data yang diunggah harus mencakup aliran video dalam format H.264.

  • Aliran audio bersifat opsional. Jika disertakan, aliran audio harus dalam format AAC. Format lainnya akan dibuang.

  • Hanya protokol HTTP Live Streaming (HLS) yang didukung untuk dumping.

  • Hanya satu klien yang dapat mendorong aliran ke LiveChannel pada satu waktu.

Dorong data audio dan video ke OSS

  1. Peroleh URL ingest.

    Gunakan SDK untuk memanggil operasi PutLiveChannel guna membuat LiveChannel dan memperoleh URL ingest-nya.

    • Jika daftar kontrol akses (ACL) bucket disetel ke baca-tulis publik, Anda dapat menggunakan URL ingest secara langsung untuk pengambilan aliran.

    • Jika ACL bucket disetel ke baca-publik atau privat, Anda harus menandatangani URL tersebut. Untuk informasi lebih lanjut tentang penandatanganan URL, lihat Signature V1.

    Hanya Java SDK dan Python SDK yang mendukung perolehan URL ingest.

    Java

    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.model.*;
    import java.util.List;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // Tentukan nama bucket. Contoh: examplebucket.
            String bucketName = "examplebucket";
            // Tentukan nama LiveChannel.
            String liveChannelName = "yourLiveChannelName";
            // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Region ke cn-hangzhou.
    
            // Buat instans OSSClient.
            // Saat instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
            OSS ossClient = OSSClientBuilder.create()
            .endpoint(endpoint)
            .credentialsProvider(credentialsProvider)
            .clientConfiguration(clientBuilderConfiguration)
            .region(region)               
            .build();
    
            try {
                CreateLiveChannelRequest request = new CreateLiveChannelRequest(bucketName,
                        liveChannelName, "desc", LiveChannelStatus.Enabled, new LiveChannelTarget());
                CreateLiveChannelResult result = ossClient.createLiveChannel(request);
    
                // Dapatkan URL ingest.
                List<String> publishUrls = result.getPublishUrls();
                for (String item : publishUrls) {
                    // Dapatkan URL ingest yang tidak mengandung informasi tanda tangan.
                    System.out.println(item);
    
                    // Dapatkan URL ingest yang mengandung informasi tanda tangan.
                    LiveChannelInfo liveChannelInfo = ossClient.getLiveChannelInfo(bucketName, liveChannelName);
                    // Parameter expires menentukan waktu kedaluwarsa. Nilainya adalah stempel waktu UNIX. Contoh ini menetapkan waktu kedaluwarsa satu jam dari sekarang.
                    long expires = System.currentTimeMillis() / 1000 + 3600;
                    // Parameter playlistName menentukan nama yang dilewatkan dalam operasi CreateLiveChannel. Jika parameter ini tidak ditentukan, nilai default playlist.m3u8 digunakan. Anda juga dapat memanggil operasi GetLiveChannelInfo untuk mendapatkan nama ini.
                    String signRtmpUrl = ossClient.generateRtmpUri(bucketName, liveChannelName, liveChannelInfo.getTarget().getPlaylistName(), expires);
                    System.out.println(signRtmpUrl);
                }
    
                // Dapatkan URL pemutaran.
                List<String> playUrls = result.getPlayUrls();
                for (String item : playUrls) {
                    System.out.println(item);
                }
            } catch (OSSException oe) {
                oe.printStackTrace();
                System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                        + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
                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();
                }
            }
        }
    }

    URL ingest berikut dikembalikan:

    rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel
    rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?Expires=1688542428&OSSAccessKeyId=LTAI********&Signature=VfUgZt5N%2B6Uk4C9QH%2BzrRBTO2I****&playlistName=playlist.m3u8
    http://examplebucket.oss-cn-hangzhou.aliyuncs.com/test-channel/playlist.m3u8

    Python

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
    # Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
    # Tentukan nama bucket. Contoh: examplebucket.
    bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
    # Tentukan nama LiveChannel. Contoh: test-channel.
    channel_name = "test-channel"
    channel_cfg = oss2.models.LiveChannelInfo(target = oss2.models.LiveChannelInfoTarget())
    channel = bucket.create_live_channel(channel_name, channel_cfg)
    publish_url = channel.publish_url
    # Hasilkan URL bertanda untuk pengambilan aliran RTMP dan atur waktu kedaluwarsa menjadi 3.600 detik.
    signed_publish_url = bucket.sign_rtmp_url(channel_name, "playlist.m3u8", 3600)
    # Cetak URL ingest tanpa tanda tangan.
    print('publish_url='+publish_url)
    # Cetak URL ingest bertanda.
    print('signed_publish_url='+signed_publish_url)

    URL ingest berikut dikembalikan:

    publish_url=rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel
    signed_publish_url=rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI********&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ckt0Iv****
  2. Gunakan URL ingest untuk mendorong data audio dan video ke OSS.

    Gunakan FFmpeg untuk pengambilan aliran

    Anda dapat menggunakan FFmpeg untuk mendorong file video lokal ke OSS. Contohnya:

    ffmpeg -i 1.flv -c copy -f flv "rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI********&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ckt0Iv***"

    Gunakan OBS untuk pengambilan aliran

    1. Instal OBS Studio.

    2. Di bilah navigasi atas, pilih File > Settings.

    3. Di panel navigasi sebelah kiri, klik Stream.

    4. Di kotak dialog yang muncul, konfigurasikan parameter sesuai tabel berikut.

      Parameter

      Deskripsi

      Service

      Dari daftar drop-down, pilih Custom.

      Server

      Masukkan URL ingest yang diperoleh di Langkah 1 yang tidak mengandung informasi tanda tangan: rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live.

      Stream Key

      Masukkan informasi ingest bertanda yang diperoleh di Langkah 1: test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI**************&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck********.

    5. Klik OK.

Putar data audio dan video yang didorong ke OSS

Skenario streaming langsung

Selama pengambilan aliran, Anda dapat menggunakan protokol HLS untuk memutar konten yang diambil. Metode pemutaran berbeda berdasarkan platform:

  • Di platform seluler seperti Android dan iOS, masukkan URL pemutaran LiveChannel di browser.

  • Di macOS, gunakan browser Safari untuk pemutaran.

  • Di PC, instal pemutar media VLC untuk pemutaran. Setelah instalasi selesai, buka VLC, pilih Media > Open Network Stream..., lalu masukkan URL pemutaran `play_url` di kotak teks Please Enter A Network URL.

Untuk streaming lancar, atur `FragDuration` kecil, misalnya 2 detik. Selain itu, atur ukuran kelompok gambar (GOP) agar sama dengan `FragDuration` dari LiveChannel. Untuk mengatur GOP (atau keyframe Interval) di OBS, ikuti langkah-langkah berikut:

Skema video sesuai permintaan

Selama pengambilan aliran, OSS terus mendorong dan memperbarui file M3U8 sebagai aliran langsung. Setelah pengambilan aliran selesai, panggil operasi PostVodPlaylist untuk merakit file M3U8 untuk pemutaran video sesuai permintaan. Gunakan URL file ini untuk pemutaran.

Untuk skenario video sesuai permintaan, Anda dapat mengatur GOP yang lebih besar untuk mengurangi jumlah file TS dan menurunkan bitrate.

Referensi