IVSOptimasi Streaming Waktu Nyata - Amazon IVS

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

IVSOptimasi Streaming Waktu Nyata

Untuk memastikan bahwa pengguna Anda memiliki pengalaman terbaik saat streaming dan melihat video menggunakan streaming IVS waktu nyata, ada beberapa cara Anda dapat meningkatkan atau mengoptimalkan bagian dari pengalaman, menggunakan fitur yang kami tawarkan hari ini.

Pengantar

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

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

Streaming Adaptif: Pengkodean Berlapis dengan Simulcast

Fitur ini hanya didukung dalam versi klien berikut:

  • iOS dan Android 1.18.0+

  • Web 1.12.0+

Saat menggunakan siaran IVS real-time SDKs, penerbit dapat menyandikan beberapa lapisan video dan pelanggan secara otomatis beradaptasi atau mengubah kualitas yang paling sesuai untuk jaringan mereka. Kami menyebutnya encoding berlapis dengan simulcast.

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

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

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

Lapisan Default, Kualitas, dan Framerate

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

Seluler (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 di 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, resolusi tersebut juga tidak SDK akan mengirim lapisan beresolusi lebih rendah.

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

Resolusi Masukan Resolusi Lapisan Keluaran: Seluler Resolusi Lapisan Keluaran: 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 khusus yang tidak dipetakan di atas, Anda dapat menghitungnya menggunakan alat berikut.

Mengkonfigurasi Layered Encoding dengan Simulcast (Publisher)

Untuk menggunakan encoding berlapis dengan simulcast, Anda harus mengaktifkan fitur pada klien. Jika Anda mengaktifkannya, Anda akan melihat peningkatan penggunaan bandwidth unggahan oleh penerbit, berpotensi dengan pembekuan video yang lebih sedikit 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

Mengkonfigurasi Layered Encoding dengan Simulcast (Subscriber)

Untuk mengonfigurasi lapisan apa yang diterima oleh pelanggan, lihat bagian “Layered Encoding with Simulcast” di panduan streaming waktu nyata: SDK

Dengan konfigurasi pelanggan, dimungkinkan untuk menentukan. InitialLayerPreference Ini menentukan kualitas video apa yang dikirimkan 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 Stream Video

Untuk mengubah bitrate streaming 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 bagi 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 masalah kehilangan/koneksi paket.

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

Jika diperlukan lebih banyak ketahanan, sebaiknya mulai dengan preset penundaan minimum MEDIUM dan pengaturan konfigurasi berlangganan sebelum pemutaran dimulai.

Perhatikan bahwa penundaan minimum hanya diterapkan 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 minimum. MEDIUM Lihat dokumentasi SDK referensi 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 }

Optimasi yang Disarankan