View a markdown version of this page

Pengoptimalan Real-Time Streaming IVS - Amazon IVS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pengoptimalan Real-Time Streaming IVS

Untuk memastikan bahwa pengguna Anda memiliki pengalaman terbaik saat streaming dan menonton video menggunakan streaming real-time IVS, ada beberapa cara yang dapat Anda tingkatkan atau mengoptimalkan untuk bagian dari pengalaman, menggunakan fitur yang kami tawarkan hari ini.

Pengantar

Saat mengoptimalkan kualitas pengalaman pengguna, penting untuk mempertimbangkan pengalaman yang diinginkan, yang dapat berubah tergantung pada konten yang mereka tonton dan kondisi jaringan.

Sepanjang panduan ini, kami fokus pada pengguna yang merupakan penerbit streaming atau pelanggan streaming, dan kami mempertimbangkan tindakan dan pengalaman yang diinginkan dari pengguna tersebut.

SDK IVS memungkinkan Anda untuk mengkonfigurasi bitrate maksimum, framerate, dan resolusi aliran. Ketika kemacetan jaringan terjadi untuk penerbit, SDK secara otomatis menyesuaikan dan menurunkan kualitas video dengan menurunkan bitrate, framerate, dan resolusi. Di Android dan iOS, dimungkinkan untuk memilih preferensi degradasi saat terjadi kemacetan. Perilaku yang sama berlaku apakah Anda mengaktifkan pengkodean berlapis dengan simulcast atau mempertahankan konfigurasi default.

Streaming Adaptif: Pengkodean Berlapis dengan Simulcast

Fitur ini hanya didukung dalam versi klien berikut:

  • iOS dan Android 1.18.0+

  • Situs web 1.12.0+

Saat menggunakan SDK siaran real-time IVS, penerbit dapat menyandikan beberapa lapisan video dan pelanggan secara otomatis menyesuaikan atau mengubah kualitas yang paling sesuai untuk jaringan mereka. Kami menyebut pengkodean berlapis ini dengan simulcast.

Pengkodean berlapis dengan simulcast didukung di Android dan iOS, dan pada browser desktop Chrome dan Edge (untuk Windows dan macOS). Kami tidak mendukung pengkodean berlapis pada browser lain.

Pada diagram di bawah ini, host mengirimkan tiga kualitas video (tinggi, sedang, dan rendah). IVS meneruskan video kualitas tertinggi ke setiap pemirsa berdasarkan bandwidth yang tersedia; ini memberikan pengalaman optimal untuk setiap pemirsa. Jika koneksi jaringan Viewer 1 berubah dari baik ke buruk, IVS secara otomatis mulai mengirim Viewer 1 video berkualitas rendah, sehingga Viewer 1 dapat terus menonton streaming tanpa gangguan (dengan kualitas terbaik).

Gunakan pengkodean berlapis dengan simulcast untuk menyesuaikan kualitas video berdasarkan kualitas koneksi jaringan pemirsa.

Lapisan, Kualitas, dan Framerate Default

Kualitas dan lapisan default yang disediakan untuk pengguna seluler dan web adalah sebagai berikut:

Ponsel (Android, iOS) Web (Chrome)

Lapisan tinggi (atau kustom):

  • Bitrate maks: 900.000 bps

  • Framerate: 15 fps

Lapisan tinggi (atau kustom):

  • Bitrate maks: 1.700.000 bps

  • Framerate: 30 fps

Lapisan tengah: tidak ada (tidak diperlukan, karena perbedaan antara bitrate lapisan tinggi dan rendah pada ponsel sempit)

Lapisan tengah:

  • Bitrate maks: 700.000 bps

  • Framerate: 20 fps

Lapisan rendah:

  • Bitrate maks: 100.000 bps

  • Framerate: 15 fps

Lapisan rendah:

  • Bitrate maks: 200.000 bps

  • Framerate: 15 fps

Resolusi Lapisan

Resolusi lapisan menengah dan rendah secara otomatis diperkecil dari lapisan tinggi, untuk mempertahankan rasio aspek yang sama.

Lapisan menengah dan rendah dikecualikan jika resolusinya terlalu dekat dengan lapisan di atas. Misalnya, jika resolusi yang dikonfigurasi adalah 320x180, SDK juga tidak akan mengirim lapisan resolusi rendah.

Tabel di bawah ini menunjukkan resolusi lapisan yang dihasilkan untuk resolusi yang dikonfigurasi yang berbeda. Nilai yang tercantum dalam orientasi lanskap tetapi dapat diterapkan secara terbalik untuk konten potret.

Resolusi Masukan Resolusi Lapisan Output: Seluler Resolusi Lapisan Output: Web

720p (1280x720)

Hai (1280x720)

Rendah (320x180)

Hai (1280x720)

Pertengahan (640x360)

Rendah (320x180)

540p (960x540)

Hai (960x540)

Rendah (320x180)

Hai (960x540)

Rendah (320x180)

360p (640x360)

Hai (640x360)

Rendah (360x180)

Hai (640x360)

Rendah (360x180)

270p (480x270)

Hai (480x270)

Hai (480x270)

180p (320x180)

Hai (320x180)

Hai (320x180)

Untuk resolusi input kustom yang tidak dipetakan di atas, Anda dapat menghitungnya menggunakan alat berikut.

Mengkonfigurasi Pengkodean Berlapis dengan Simulcast (Penerbit)

Untuk menggunakan pengkodean berlapis dengan simulcast, Anda harus mengaktifkan fitur pada klien. Jika Anda mengaktifkannya, Anda akan melihat peningkatan penggunaan bandwidth unggahan oleh penerbit, berpotensi dengan lebih sedikit pembekuan video untuk pemirsa.

Android

// Enable Simulcast StageVideoConfiguration config = new StageVideoConfiguration(); config.simulcast.setEnabled(true); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code

iOS

// Enable Simulcast let config = IVSLocalStageStreamVideoConfiguration() config.simulcast.enabled = true let cameraStream = IVSLocalStageStream(device: camera, configuration: config) // Other Stage implementation code

Web

// Enable Simulcast let cameraStream = new LocalStageStream(cameraDevice, { simulcast: { enabled: true } }) // Other Stage implementation code

Untuk informasi terperinci tentang konfigurasi lapisan individual, lihat “Mengonfigurasi Pengkodean Berlapis (Penerbit)” di setiap panduan SDK siaran: Android, iOS, dan Web.

Mengkonfigurasi Pengkodean Berlapis dengan Simulcast (Pelanggan)

Untuk mengonfigurasi lapisan apa yang diterima oleh pelanggan, lihat bagian “Penyandian Berlapis dengan Simulcast” di panduan SDK streaming real-time:

Dengan konfigurasi pelanggan, dimungkinkan untuk mendefinisikanInitialLayerPreference. Ini menentukan kualitas video apa yang disampaikan pada awalnya, sertapreferredLayerForStream, yang pada gilirannya menentukan lapisan apa yang dipilih selama pemutaran video. Ada peristiwa dan metode aliran untuk memberi tahu ketika lapisan berubah, perubahan adaptasi, atau pemilihan lapisan dibuat.

Konfigurasi Streaming

Bagian ini mengeksplorasi konfigurasi lain yang dapat Anda buat untuk aliran video dan audio Anda.

Mengubah Bitrate Aliran Video

Untuk mengubah bitrate aliran video Anda, gunakan contoh konfigurasi berikut.

Android

StageVideoConfiguration config = new StageVideoConfiguration(); // Update Max Bitrate to 1.5mbps config.setMaxBitrate(1500000); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code

iOS

let config = IVSLocalStageStreamVideoConfiguration(); // Update Max Bitrate to 1.5mbps try! config.setMaxBitrate(1500000); let cameraStream = IVSLocalStageStream(device: camera, configuration: config); // Other Stage implementation code

Web

let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], { // Update Max Bitrate to 1.5mbps or 1500kbps maxBitrate: 1500 }) // Other Stage implementation code

Mengubah Framerate Stream Video

Untuk mengubah framerate streaming video Anda, gunakan contoh konfigurasi berikut.

Android

StageVideoConfiguration config = new StageVideoConfiguration(); // Update target framerate to 10fps config.targetFramerate(10); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code

iOS

let config = IVSLocalStageStreamVideoConfiguration(); // Update target framerate to 10fps try! config.targetFramerate(10); let cameraStream = IVSLocalStageStream(device: camera, configuration: config); // Other Stage implementation code

Web

// Note: On web it is also recommended to configure the framerate of your device from userMedia const camera = await navigator.mediaDevices.getUserMedia({ video: { frameRate: { ideal: 10, max: 10, }, }, }); let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], { // Update Max Framerate to 10fps maxFramerate: 10 }) // Other Stage implementation code

Mengoptimalkan Audio Bitrate dan Dukungan Stereo

Untuk mengubah pengaturan bitrate dan stereo aliran audio Anda, gunakan contoh konfigurasi berikut.

Web

// Note: Disable autoGainControl, echoCancellation, and noiseSuppression when enabling stereo. const camera = await navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: false, echoCancellation: false, noiseSuppression: false }, }); let audioStream = new LocalStageStream(camera.getAudioTracks()[0], { // Optional: Update Max Audio Bitrate to 96Kbps. Default is 64Kbps maxAudioBitrateKbps: 96, // Signal stereo support. Note requires dual channel input source. stereo: true }) // Other Stage implementation code

Android

StageAudioConfiguration config = new StageAudioConfiguration(); // Update Max Bitrate to 96Kbps. Default is 64Kbps. config.setMaxBitrate(96000); AudioLocalStageStream microphoneStream = new AudioLocalStageStream(microphone, config); // Other Stage implementation code

iOS

let config = IVSLocalStageStreamConfiguration(); // Update Max Bitrate to 96Kbps. Default is 64Kbps. try! config.audio.setMaxBitrate(96000); let microphoneStream = IVSLocalStageStream(device: microphone, config: config); // Other Stage implementation code

Mengubah Buffer Jitter Pelanggan MinDelay

Untuk mengubah penundaan minimum buffer jitter untuk peserta yang sedang berlangganan, kustom subscribeConfiguration dapat digunakan. Buffer jitter menentukan berapa banyak paket yang disimpan sebelum pemutaran dimulai. Penundaan minimum mewakili target untuk jumlah minimum data yang harus disimpan. Mengubah penundaan minimum dapat membantu pemutaran menjadi lebih tangguh saat menghadapi loss/connection masalah paket.

Pengorbanan saat meningkatkan ukuran buffer jitter adalah bahwa itu juga akan meningkatkan penundaan sebelum pemutaran dimulai. Meningkatkan penundaan minimum memberikan ketahanan yang lebih besar, dengan mengorbankan waktu untuk video. Perhatikan bahwa meningkatkan penundaan minimum selama pemutaran memiliki efek yang sama: pemutaran akan berhenti sebentar untuk memungkinkan buffer jitter terisi.

Jika ketahanan lebih diperlukan, sebaiknya mulai dengan preset penundaan minimum MEDIUM dan mengatur konfigurasi langganan sebelum pemutaran dimulai.

Perhatikan bahwa penundaan minimum hanya berlaku jika peserta hanya berlangganan. Jika peserta menerbitkan sendiri, penundaan minimum tidak diterapkan. Hal ini dilakukan untuk memastikan bahwa beberapa penerbit dapat berbicara satu sama lain tanpa penundaan tambahan.

Contoh di bawah ini menggunakan preset penundaan minimumMEDIUM. Lihat dokumentasi referensi SDK untuk semua nilai yang mungkin.

Web

const strategy = { subscribeConfiguration: (participant) => { return { jitterBuffer: { minDelay: JitterBufferMinDelay.MEDIUM } } // ... other strategy functions }

Android

@Override public SubscribeConfiguration subscribeConfigrationForParticipant(@NonNull Stage stage, @NonNull ParticipantInfo participantInfo) { SubscribeConfiguration config = new SubscribeConfiguration(); config.jitterBuffer.setMinDelay(JitterBufferConfiguration.JitterBufferDelay.MEDIUM()); return config; }

iOS

func stage(_ stage: IVSStage, subscribeConfigurationForParticipant participant: IVSParticipantInfo) -> IVSSubscribeConfiguration { let config = IVSSubscribeConfiguration() try! config.jitterBuffer.setMinDelay(.medium()) return config }

Mengurangi Waktu untuk Video Saat Beralih Antar Tahapan

Aplikasi mungkin memungkinkan pengguna menelusuri umpan streaming langsung. Pengguna bergabung dengan satu tahap, menggesek ke aliran lain, meninggalkan tahap saat ini, dan dengan cepat bergabung dengan tahap berikutnya. Membuat koneksi baru untuk setiap transisi tahap memerlukan pembuatan koneksi jaringan baru, yang dapat meningkatkan waktu hingga video tersedia.

Gunakan a RealTimeConnection untuk menjaga satu koneksi jaringan tetap terbuka saat pengguna menelusuri aliran. Buat koneksi sekali, sambungkan secara opsional sebelum bergabung tahap pertama, dan gunakan kembali di seluruh tahap. Setiap tahap masih menggunakan token peserta sendiri dan mempertahankan peserta, aliran, dan siklus hidupnya sendiri.

Buat dan pertahankan RealTimeConnection selama sesi penelusuran di objek yang bertahan lebih lama dari tahap individual, seperti koordinator aplikasi, pengontrol navigasi, atau model tampilan. Jangan membuat dan lepaskan untuk setiap tahap transisi.

Android

Contoh berikut menambahkan RealTimeConnection siklus hidup ke yang MainViewModel digunakan dalam sampel Android. Model tampilan mengimplementasikan Stage.Strategy dan StageRenderer.

private var realTimeConnection: RealTimeConnection? = null private var stage: Stage? = null private fun setupConnection(connectionToken: String) { try { val connection = RealTimeConnection(getApplication(), connectionToken) // Establish the shared transport before the first Stage join. connection.connect() realTimeConnection = connection } catch (error: BroadcastException) { Log.e("BasicRealTime", "Unable to create the RealTimeConnection", error) } } private fun joinStage(participantToken: String) { val realTimeConnection = realTimeConnection ?: return try { stage?.leave() stage?.release() val stage = Stage( getApplication(), participantToken, realTimeConnection, this ) stage.addRenderer(this) stage.join() this.stage = stage } catch (error: BroadcastException) { Log.e("BasicRealTime", "Unable to join the Stage", error) } } override fun onCleared() { stage?.leave() stage?.release() stage = null realTimeConnection?.disconnect() realTimeConnection?.release() realTimeConnection = null super.onCleared() }

Menelep connect() on adalah opsional. Jika koneksi tidak terbuka saat Anda bergabung dengan stage, SDK akan membukanya secara otomatis. Panggil connect() sebelum tahap berikutnya bergabung untuk membuat koneksi terlebih dahulu dan mengurangi waktu untuk video. Meskipun contoh hanya terhubung ke satu tahap pada satu waktu, a RealTimeConnection dapat dihubungkan ke beberapa tahap secara bersamaan.

Panggil release() saat aplikasi tidak lagi membutuhkanRealTimeConnection. Setelah dirilis, itu tidak dapat digunakan kembali.

iOS

Contoh berikut mengasumsikan bahwa aplikasi memperoleh token koneksi ketika pengguna memulai aliran multi-tahap dan memperoleh token peserta untuk setiap tahap yang digabungkan pengguna.

private var realTimeConnection: IVSRealTimeConnection? private var stage: IVSStage? private func setupConnection(connectionToken: String) throws { let connection = try IVSRealTimeConnection(token: connectionToken) // Establish the shared transport before the first Stage join. try connection.connect() realTimeConnection = connection } private func joinStage(participantToken: String) throws { guard let realTimeConnection else { return } stage?.leave() let stage = try IVSStage( token: participantToken, on: realTimeConnection, strategy: self ) stage.addRenderer(self) try stage.join() self.stage = stage } private func endStageTransitionFlow() { stage?.leave() stage = nil realTimeConnection?.disconnect() realTimeConnection = nil }

Menelep connect() on adalah opsional. Jika koneksi tidak terbuka saat Anda bergabung dengan stage, SDK akan membukanya secara otomatis. Panggil connect() sebelum tahap berikutnya bergabung untuk membuat koneksi terlebih dahulu dan mengurangi waktu untuk video. Meskipun contoh hanya terhubung ke satu tahap pada satu waktu, an IVSRealTimeConnection dapat dihubungkan ke beberapa tahap secara bersamaan.

Simpan referensi yang kuat untuk IVSRealTimeConnection saat tahapan menggunakannya. Panggilan disconnect() meninggalkan tahapan apa pun menggunakan koneksi.

Optimasi yang Disarankan

Skenario Rekomendasi
Streaming dengan teks, atau konten yang bergerak lambat, seperti presentasi atau slide Gunakan pengkodean berlapis dengan simulcast atau konfigurasikan aliran dengan fr amerate yang lebih rendah.
Streaming dengan aksi atau banyak gerakan Gunakan pengkodean berlapis dengan simulcast.
Streaming dengan percakapan atau sedikit gerakan Gunakan pengkodean berlapis dengan simulcast atau pilih audio saja (lihat “Berlangganan Peserta” di Panduan Real-Time Streaming Broadcast SDK: Web, Android, dan iOS). Berlangganan ke Peserta
Pengguna streaming dengan data terbatas Gunakan pengkodean berlapis dengan simulcast atau, jika Anda ingin penggunaan data yang lebih rendah untuk semua orang, konfigurasikan framerate yang lebih rendah dan turunkan bitrate secara manual.
Pengguna menelusuri umpan streaming langsung dan dengan cepat berpindah dari satu tahap ke tahap berikutnya Gunakan kembali a RealTimeConnection untuk sesi penelusuran. Panggil connect() sebelum tahap pertama bergabung untuk membuat koneksi terlebih dahulu.