Memecahkan Masalah Amazon Kinesis Video Streams dengan WebRTC - Kinesis Video Streams

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

Memecahkan Masalah Amazon Kinesis Video Streams dengan WebRTC

Gunakan informasi berikut untuk memecahkan masalah umum yang mungkin Anda temui dengan Amazon Kinesis Video Streams dengan WebRTC.

Kuota layanan

Anda hanya dapat menghubungkan satu master dan satu atau lebih pemirsa ke satu saluran pensinyalan.

Pada Februari 2023, tidak mungkin menghubungkan beberapa master ke satu saluran pensinyalan. Untuk informasi tambahan tentang kuota layanan, lihatAmazon Kinesis Video Streams dengan WebRTC Service Quotas.

Persyaratan jaringan

Persyaratan jaringan umum untuk titik akhir layanan saluran pensinyalan untuk Kinesis Video Streams dengan WebRTC adalah:

  • Panggilan HTTPS ke titik akhir yang dihosting di https://*.kinesisvideo.{region}.amazonaws.com

  • WebSocket Integrasi dengan Endpoint wss://*.kinesisvideo.{region}.amazonaws.com

  • STUNserver di stun:stun.kinesisvideo.{aws-region}.amazonaws.com:443

  • TURNserver di turn:_._.kinesisvideo.{aws-region}.amazonaws.com:443 dan turns:_._.kinesisvideo.{aws-region}.amazonaws.com:443

Protokol yang digunakan antara rekan-rekan sebagai bagian dari RTC PeerConnection dapat berupa berbasis TCP atau UDP.

Sebagian besar aplikasi mencoba untuk membangun peer-to-peer koneksi langsung dengan menentukan alamat IP untuk setiap rekan, serta port dan protokol yang akan dipertukarkan sebagai kandidat ICE. Kandidat ini digunakan untuk mencoba terhubung satu sama lain menggunakan kandidat ini. Mereka akan mencoba setiap pasangan sampai koneksi dapat dibuat.

Lingkungan jaringan

Jika pesan dari penampil telah dikirim ke master dan log seperti No valid ICE candidate direkam, maka tidak ada rute koneksi yang valid telah ditemukan. Ini bisa terjadi jika ada firewall yang mencegah koneksi langsung, atau jika jaringan tidak dapat dijangkau.

Lakukan hal berikut untuk memecahkan masalah konektivitas:

  • Jika Anda tidak menggunakan TURN di sisi master, pastikan untuk mengaktifkanTURN.

    TURNdiaktifkan secara default di C SDK. Di JavaScript SDK, pilih STUN/TURN atau TURN only di NAT Traversal.

  • Untuk jaringan terbatas, seperti jaringan perusahaan, coba jaringan lain yang tersedia (kabel atau nirkabel).

    Jika Anda terhubung ke VPN, putuskan sambungan darinya.

catatan

Anda dapat mengabaikan 403 Forbidden IP kesalahan yang dikembalikan oleh Kinesis Video Streams TURN server. Server menolak pasangan kandidat ICE yang berisi localhost IP, seperti 192.168.* atau. 10.0.0.*

Ini dapat menyebabkan beberapa, tetapi tidak semua, pasangan kandidat ICE gagal.

Masalah membangun sesi

WebRTC dapat membantu meringankan masalah yang terjadi karena:

  • Terjemahan alamat jaringan (NAT)

  • firewall

  • Proksi antar rekan

WebRTC menyediakan kerangka kerja untuk membantu menegosiasikan dan memelihara koneksi selama rekan-rekan terhubung. Ini juga menyediakan mekanisme untuk menyampaikan media melalui TURN server jika peer-to-peer koneksi tidak dapat dinegosiasikan.

Mengingat semua komponen yang diperlukan untuk membangun koneksi, ada baiknya memahami beberapa alat yang tersedia untuk membantu memecahkan masalah yang terkait dengan membuat sesi.

Penawaran dan jawaban Session Description Protocol (SDP)

Session Description Protocol (SDP) menawarkan dan menjawab menginisialisasi sesi RTC antara rekan-rekan.

Untuk mempelajari lebih lanjut tentang protokol SDP, lihat spesifikasinya.

  • Penawaran dihasilkan oleh “pemirsa” yang ingin terhubung ke rekan yang terhubung ke saluran pensinyalan sebagai “master"di Kinesis Video Streams dengan WebRTC.

  • Jawaban dihasilkan oleh penerima penawaran.

Baik penawaran dan jawaban dihasilkan di sisi klien, meskipun mereka mungkin berisi kandidat ICE yang telah dikumpulkan hingga saat itu.

Kinesis Video Streams SDK WebRTC untuk C menyertakan variabel lingkungan sederhana yang dapat Anda atur untuk mencatat SDP. Ini berguna untuk memahami penawaran yang diterima dan jawaban yang dihasilkan.

Untuk mencatat SDP stdout dari SDK, setel variabel lingkungan berikut:. export DEBUG_LOG_SDP=TRUE Anda juga dapat mencatat penawaran dan jawaban SDP di klien JavaScript berbasis menggunakan sdpOffer acara tersebut. Untuk melihat ini ditunjukkan, lihat GitHub.

Untuk informasi tambahan, lihat Pemantauan Kinesis Video Streams denganCloudWatch.

Jika jawaban SDP tidak dikembalikan, ada kemungkinan bahwa rekan tidak dapat menerima penawaran SDP, karena penawaran tersebut tidak mengandung codec media yang kompatibel. Anda mungkin melihat log yang mirip dengan berikut ini:

I/webrtc_video_engine.cc: (line 808): SetSendParameters: {codecs: [VideoCodec[126:H264]], conference_mode: no, extensions: [], extmap-allow-mixed: false, max_bandwidth_bps: -1, mid: video1} E/webrtc_video_engine.cc: (line 745): No video codecs supported. E/peer_connection.cc: (line 6009): Failed to set remote video description send parameters for m-section with mid='video1'. (INVALID_PARAMETER) E/peer_connection.cc: (line 3097): Failed to set remote offer sdp: Failed to set remote video description send parameters for m-section with mid='video1'. E/KinesisVideoSdpObserver: onSetFailure(): Error=Failed to set remote offer sdp: Failed to set remote video description send parameters for m-section with mid='video1'. D/KVSWebRtcActivity: Received SDP offer for client ID: null. Creating answer E/peer_connection.cc: (line 2373): CreateAnswer: Session error code: ERROR_CONTENT. Session error description: Failed to set remote video description send parameters for m-section with mid='video1'.. E/KinesisVideoSdpObserver: onCreateFailure(): Error=Session error code: ERROR_CONTENT. Session error description: Failed to set remote video description send parameters for m-section with mid='video1'..

Saat Anda meninjau konten penawaran SDP, cari baris yang dimulai dengan a=rtpmap untuk melihat codec media mana yang diminta.

... a=rtpmap:126 H264/90000 ... a=rtpmap:111 opus/48000/2 ...

Evaluasi generasi kandidat ICE

Kandidat ICE dihasilkan oleh setiap klien yang melakukan panggilan ke STUN server. Untuk Kinesis Video Streams dengan WebRTCSTUN, servernya. stun:stun.kinesisvideo.{aws-region}.amazonaws.com:443

Selain memanggil STUN server untuk mendapatkan kandidat, klien sering juga memanggil TURN server. Mereka melakukan panggilan ini sehingga server relay dapat digunakan sebagai fallback jika peer-to-peer koneksi langsung tidak dapat dibuat.

Anda dapat menggunakan alat-alat berikut untuk menghasilkan kandidat ICE:

Dengan kedua alat ini. Anda dapat memasukkan informasi STUN dan TURN server untuk mengumpulkan kandidat.

Untuk mendapatkan informasi TURN server dan kredensi yang diperlukan untuk Kinesis Video Streams dengan WebRTC, Anda dapat memanggil operasi API. GetIceServerConfig

AWS CLI Panggilan berikut menunjukkan cara mendapatkan informasi ini untuk digunakan dalam dua alat ini.

export CHANNEL_ARN="YOUR_CHANNEL_ARN" aws kinesisvideo get-signaling-channel-endpoint \ --channel-arn $CHANNEL_ARN \ --single-master-channel-endpoint-configuration Protocols=WSS,HTTPS,Role=MASTER

Output dari get-signaling-channel-endpointperintah mengembalikan respon yang terlihat seperti ini:

{ "ResourceEndpointList": [ { "Protocol": "HTTPS", "ResourceEndpoint": "https://your-endpoint.kinesisvideo.us-east-1.amazonaws.com" }, { "Protocol": "WSS", "ResourceEndpoint": "wss://your-endpoint.kinesisvideo.us-east-1.amazonaws.com" } ] }

Gunakan ResourceEndpoint nilai HTTPS untuk mendapatkan daftar TURN server sebagai berikut:

export ENDPOINT_URL="https://your-endpoint.kinesisvideo.us-east-1.amazonaws.com" aws kinesis-video-signaling get-ice-server-config \ --channel-arn $CHANNEL_ARN \ --service TURN \ --client-id my-amazing-client \ --endpoint-url $ENDPOINT_URL

Respons berisi rincian TURN server, termasuk titik akhir untuk TCP dan UDP dan kredensional yang diperlukan untuk mengaksesnya.

catatan

Nilai TTL dalam respons menentukan durasi, dalam hitungan detik, yang valid untuk kredensil ini. Gunakan nilai ini dalam sampel WebRTC Trickle ICE atau IceTestdi.Info untuk menghasilkan kandidat ICE menggunakan titik akhir layanan yang dikelola Kinesis Video Streams.

Tentukan kandidat mana yang digunakan untuk membangun koneksi

Akan sangat membantu untuk memahami kandidat mana yang digunakan untuk berhasil mendirikan sesi. Jika Anda memiliki klien berbasis browser yang menjalankan sesi yang telah ditetapkan, Anda dapat menentukan informasi ini di Google Chrome dengan menggunakan utilitas internal webrtc bawaan.

Buka sesi WebRTC di satu tab browser.

Di tab lain, bukachrome://webrtc-internals/. Anda dapat melihat semua informasi tentang sesi Anda yang sedang berlangsung di tab ini.

Anda akan melihat informasi tentang koneksi yang dibuat. Sebagai contoh:

Contoh layar yang menampilkan informasi tentang koneksi yang dibuat.

Anda juga dapat mengonfirmasi metrik seperti berikut untuk koneksi yang dibuat.

Gambar yang menampilkan 20 bagan yang lebih kecil yang menampilkan array statistik.

Batas waktu terkait ICE

Nilai batas waktu default ditetapkan untuk ICE di file. KvsRtcConfiguration Default harus cukup untuk sebagian besar pengguna, tetapi Anda mungkin perlu menyesuaikannya untuk meningkatkan peluang membangun koneksi melalui jaringan yang buruk. Anda dapat mengonfigurasi default ini dalam aplikasi.

Tinjau log untuk pengaturan default:

2024-01-08 19:43:44.433 INFO iceAgentValidateKvsRtcConfig(): iceLocalCandidateGatheringTimeout: 10000 ms iceConnectionCheckTimeout: 12000 ms iceCandidateNominationTimeout: 12000 ms iceConnectionCheckPollingInterval: 50 ms

Jika Anda memiliki kualitas jaringan yang buruk dan ingin meningkatkan peluang koneksi, coba sesuaikan nilai-nilai berikut:

  • iceLocalCandidateGatheringTimeout- Tingkatkan batas waktu tunggu ini untuk mengumpulkan kandidat potensial tambahan untuk mencoba koneksi. Tujuannya adalah untuk mencoba semua pasangan kandidat yang mungkin, jadi jika Anda berada di jaringan yang buruk, tingkatkan batas ini untuk memberi lebih banyak waktu untuk berkumpul.

    Misalnya, jika kandidat host tidak bekerja dan server refleksif (srflx) atau kandidat relay perlu dicoba, Anda mungkin perlu menambah batas waktu ini. Karena jaringan yang buruk, para kandidat dikumpulkan perlahan dan aplikasi tidak ingin menghabiskan lebih dari 20 detik pada langkah ini. Meningkatkan batas waktu memberikan lebih banyak waktu untuk mengumpulkan kandidat potensial untuk mencoba koneksi.

    catatan

    Kami merekomendasikan bahwa nilai ini kurang dariiceCandidateNominationTimeout, karena langkah nominasi perlu memiliki waktu untuk bekerja dengan kandidat baru.

  • iceConnectionCheckTimeout- Tingkatkan batas waktu ini di jaringan yang tidak stabil atau lambat, di mana pertukaran paket dan permintaan/respons yang mengikat membutuhkan waktu. Peningkatan batas waktu ini memungkinkan setidaknya satu pasangan kandidat untuk diadili untuk dinominasikan oleh rekan lainnya.

  • iceCandidateNominationTimeout- Tingkatkan batas waktu ini untuk memastikan pasangan calon dengan kandidat estafet lokal dicoba.

    Misalnya, jika dibutuhkan sekitar 15 detik untuk mengumpulkan kandidat estafet lokal pertama, atur batas waktu ke nilai lebih dari 15 detik untuk memastikan pasangan kandidat dengan kandidat estafet lokal dicoba untuk berhasil. Jika nilainya disetel ke kurang dari 15 detik, SDK akan kalah dalam mencoba pasangan kandidat potensial, yang menyebabkan kegagalan pembentukan koneksi.

    catatan

    Kami merekomendasikan bahwa nilai ini lebih besar dariiceLocalCandidateGatheringTimeout, agar memiliki efek.

  • iceConnectionCheckPollingInterval- Nilai ini default hingga 50 milidetik per spesifikasi. Mengubah nilai ini mengubah frekuensi pemeriksaan konektivitas dan, pada dasarnya, transisi mesin status ICE.

    Dalam pengaturan jaringan yang andal dan berkinerja tinggi dengan sumber daya sistem yang baik, Anda dapat mengurangi nilainya untuk membantu pembentukan koneksi yang lebih cepat. Meningkatkan nilai dapat membantu mengurangi beban jaringan, tetapi pembentukan koneksi bisa melambat.

    penting

    Kami tidak menyarankan untuk mengubah default ini.

Debugging koneksi yang sedang berlangsung

Ada beberapa area yang dapat menyebabkan masalah dengan koneksi WebRTC yang mapan dan berkelanjutan, tetapi jaringan adalah yang paling umum.

Anda dapat mengonfirmasi log level VERBOSE dari SDK dengan menyetelnya export AWS_KVS_LOG_LEVEL=1 sebagai variabel lingkungan.

catatan

Jika tidak ada pasangan kandidat yang ditemukan dalam batas waktu yang ditentukan, agen ICE mengembalikan status kesalahan. 0x5a00000d

Untuk informasi tambahan tentang tingkat log, lihat GitHub.

export AWS_KVS_LOG_LEVEL=1 ./kvsWebrtcClientMasterGstSample TestChannel

Anda akan melihat log seperti berikut ini. Dari log ini, Anda dapat mengonfirmasi kandidat Interactive Connectivity Establishment (ICE) (alamat IP dan port) dan pasangan kandidat yang dipilih.

2023-02-13 05:57:16 DEBUG iceAgentReadyStateSetup(): Selected pair w1UdV9fE+_/CuBel1pl, local candidate type: srflx. Round trip time 7 ms. Local candidate priority: 1694498815, ice candidate pair priority: 7240977859836116990 2023-02-13 05:57:16 INFO onConnectionStateChange(): New connection state 3 2023-02-13 05:57:16 DEBUG rtcPeerConnectionGetMetrics(): ICE local candidate Stats requested at 16762678365731494 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Local Candidate IP Address: XXX.XXX.XXX.XXX 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Local Candidate type: srflx 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Local Candidate port: 38563 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Local Candidate priority: 1694498815 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Local Candidate transport protocol: udp 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Local Candidate relay protocol: N/A 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Local Candidate Ice server source: stun.kinesisvideo.ap-northeast-1.amazonaws.com 2023-02-13 05:57:16 DEBUG rtcPeerConnectionGetMetrics(): ICE remote candidate Stats requested at 16762678365732111 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Remote Candidate IP Address: XXX.XXX.XXX.XXX 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Remote Candidate type: srflx 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Remote Candidate port: 45867 2023-02-13 05:57:16 VERBOSE signalingClientGetCurrentState(): Signaling Client Get Current State 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Remote Candidate priority: 1685921535 2023-02-13 05:57:16 DEBUG logSelectedIceCandidatesInformation(): Remote Candidate transport protocol: udp