Layanan Penyimpanan Objek (Object Storage Service/OSS) mendukung ingest aliran video yang dikodekan dalam H.264 dan aliran audio yang dikodekan dalam AAC melalui Real-Time Messaging Protocol (RTMP). Data audio dan video yang diingest dapat digunakan untuk video sesuai permintaan (VOD) atau streaming langsung. Topik ini menjelaskan cara mengingest aliran audio dan video ke OSS serta memutar data yang telah diingest.
Batasan
-
Hanya ingest aliran RTMP yang didukung. Penarikan aliran (stream pulling) tidak didukung.
-
Data yang diingest harus berisi aliran video dalam format H.264.
-
Aliran audio bersifat opsional. Jika disertakan, harus dalam format AAC; aliran dalam format lain akan dibuang.
-
Dumping hanya mendukung protokol HTTP Live Streaming (HLS).
-
Hanya satu klien yang dapat melakukan ingest aliran ke satu LiveChannel dalam satu waktu.
Mengambil data audio dan video ke OSS
-
Dapatkan URL ingest.
Gunakan SDK untuk memanggil operasi API PutLiveChannel guna membuat LiveChannel dan mendapatkan URL ingest-nya.
-
Jika daftar kontrol akses (ACL) bucket bersifat baca-tulis publik (public-read-write), Anda dapat langsung menggunakan URL ingest yang diperoleh.
-
Jika ACL bucket bersifat baca-publik (public-read) atau privat, Anda harus menandatangani URL tersebut. Untuk informasi selengkapnya, lihat Signature V1.
Hanya SDK Java dan Python 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"; // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Tentukan nama bucket. Misalnya, examplebucket. String bucketName = "examplebucket"; // Tentukan nama LiveChannel. String liveChannelName = "yourLiveChannelName"; // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel wilayah menjadi cn-hangzhou. String region = "cn-hangzhou"; // Buat instans OSSClient. // Setelah instans OSSClient tidak digunakan lagi, panggil metode shutdown untuk melepaskan sumber dayanya. 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); // Peroleh URL ingest. List<String> publishUrls = result.getPublishUrls(); for (String item : publishUrls) { // Peroleh URL ingest yang tidak berisi informasi signature. System.out.println(item); // Peroleh URL ingest yang berisi informasi signature. LiveChannelInfo liveChannelInfo = ossClient.getLiveChannelInfo(bucketName, liveChannelName); // Parameter expires menentukan waktu kedaluwarsa sebagai timestamp Unix. Contoh ini menetapkan waktu kedaluwarsa satu jam dari waktu saat ini. long expires = System.currentTimeMillis() / 1000 + 3600; // Parameter playlistName menentukan nama yang Anda berikan saat memanggil operasi createLiveChannel. Jika tidak ditentukan, nilai default playlist.m3u8 akan digunakan. Anda juga dapat memanggil operasi getLiveChannelInfo untuk memperoleh nama ini. String signRtmpUrl = ossClient.generateRtmpUri(bucketName, liveChannelName, liveChannelInfo.getTarget().getPlaylistName(), expires); System.out.println(signRtmpUrl); } // Peroleh URL pemutaran. List<String> playUrls = result.getPlayUrls(); for (String item : playUrls) { System.out.println(item); } } catch (OSSException oe) { oe.printStackTrace(); System.out.println("Terjadi OSSException, yang berarti permintaan Anda berhasil mencapai OSS, " + "tetapi ditolak dengan respons error karena suatu alasan."); System.out.println("Pesan Error:" + oe.getErrorMessage()); System.out.println("Kode Error:" + oe.getErrorCode()); System.out.println("ID Permintaan:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Terjadi ClientException, yang berarti client mengalami " + "masalah internal serius saat mencoba berkomunikasi dengan OSS, " + "misalnya tidak dapat mengakses jaringan."); System.out.println("Pesan Error:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }URL ingest yang dikembalikan adalah sebagai berikut:
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.m3u8Python
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, 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), setel titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. # Tentukan nama bucket. Misalnya, examplebucket. bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # Tentukan nama LiveChannel. Misalnya, 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 yang ditandatangani untuk ingest aliran RTMP dan tetapkan 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 yang ditandatangani. print('signed_publish_url='+signed_publish_url)URL ingest yang dikembalikan adalah sebagai berikut:
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**** -
-
Gunakan URL ingest untuk mengingest data audio dan video ke OSS.
Konvensi penamaan untuk file yang dihasilkan oleh ingest aliran adalah
<channel-name><timestamp>.ts, di mana<channel-name>adalah nama saluran, dan<timestamp>adalah timestamp dalam milidetik saat potongan file dihasilkan.FFmpeg
Anda dapat menggunakan FFmpeg untuk mengingest 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=eqK8z0ZTSwznP7fkELy0ck***"OBS
-
Instal OBS Studio.
-
Pada bilah navigasi atas, pilih .
-
Pada panel navigasi sebelah kiri, klik Stream.
-
Konfigurasikan parameter berikut pada kotak dialog:
Parameter
Deskripsi
Service
Dari daftar drop-down, pilih Custom.
Server
Masukkan URL dari Langkah 1 tanpa informasi signature ingest aliran:
rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live.Stream Key
Masukkan informasi ingest aliran yang ditandatangani yang Anda peroleh di Langkah 1:
test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI**************&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck********. -
Klik OK.
-
Memutar audio dan video yang telah diambil
Streaming langsung
Selama ingest aliran, Anda dapat memutar konten menggunakan protokol HLS. Metode pemutaran berbeda-beda tergantung platform:
-
Pada platform seluler seperti Android dan iOS, buka URL pemutaran LiveChannel di browser web.
-
Pada macOS, Anda dapat menggunakan browser Safari untuk pemutaran.
-
Pada PC, Anda dapat menginstal VLC media player untuk pemutaran. Setelah instalasi, buka VLC media player, pilih , lalu masukkan URL pemutaran yang Anda peroleh ke dalam kotak teks Please Enter A Network URL.
Untuk streaming langsung yang lancar, atur FragDuration yang pendek (misalnya, 2 detik) dan ukuran Group of Pictures (GOP) yang sesuai dengannya. Di OBS, pengaturan ini disebut Keyframe Interval.
Di OBS, buka Settings > Output. Atur Output Mode ke Advanced. Pada tab Streaming, atur Keyframe Interval (seconds, 0=auto) ke 2.
Video sesuai permintaan (VOD)
Selama ingest aliran, OSS terus-menerus mendorong atau memperbarui file M3U8 sebagai aliran langsung. Setelah ingest aliran selesai, Anda harus memanggil operasi API PostVodPlaylist untuk membuat daftar putar VOD. Gunakan URL daftar putar ini untuk pemutaran.
Untuk skenario video sesuai permintaan, Anda dapat mengatur GOP yang lebih besar untuk mengurangi jumlah file .ts, yang membantu menurunkan bitrate.