Memecahkan masalah dan memperbaiki error Meet Media API

Panduan ini memberikan petunjuk tentang cara mengatasi error Google Meet Media API umum.

Memecahkan masalah kode error

Berikut adalah tips untuk memecahkan masalah kode error yang ditampilkan oleh endpoint connectActiveConference:

Kode error
NO_ACTIVE_CONFERENCE Pastikan klien Meet Media API hanya mencoba terhubung setelah pengguna yang diautentikasi sudah berada di konferensi di ruang rapat.
INVALID_OFFER Baca persyaratan penawaran untuk memeriksa detail yang belum tercantum, seperti membuka saluran yang diperlukan data. Anda juga dapat membandingkan string penawaran aplikasi dengan contoh penawaran dan menyelidiki perbedaan apa pun.
INCOMPATIBLE_DEVICE Satu atau beberapa perangkat dalam konferensi tidak kompatibel dengan klien Meet Media API. Aplikasi Anda tidak akan dapat bergabung, jadi Anda dapat menyampaikan hal ini kepada pengguna akhir.
CONNECTIONS_EXHAUSTED Hanya satu klien Meet Media API yang dapat terhubung ke konferensi dalam satu waktu. Jika aplikasi error, Anda mungkin melihat error ini jika aplikasi mencoba terhubung kembali. Dalam hal ini, tunggu sekitar 30 detik hingga Meet menghentikan koneksi sebelumnya. Kemudian, coba lagi.

Paket terpadu

Jika saluran data tidak pernah terbuka dan Anda tidak pernah menerima audio atau video, pastikan hanya Unified Plan yang digunakan saat mengonfigurasi koneksi peer lokal.

Error urutan deskripsi media

Saat membuat koneksi peer-to-peer dengan penawaran Session Description Protocol (SDP), Anda mungkin melihat error:

Failed to execute 'setRemoteDescription' on 'RTCPeerConnection':
Failed to set remote answer sdp:
The order of m-lines in answer doesn't match order in offer. Rejecting answer.

Artinya, baris deskripsi media dalam jawaban SDP tidak cocok dengan deskripsi media dalam penawaran SDP:

Penawaran SDP Jawaban SDP
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99

Untuk memperbaiki error ini, pastikan jenis media yang serupa dikonfigurasi dengan benar dan digabungkan saat menetapkan objek koneksi peer. Deskripsi media interleaved tidak didukung.

Contoh kode berikut menunjukkan cara mencocokkan deskripsi media dengan benar:

C++

rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection;

// Signal the entire video at once.
for (uint32_t i = 0; i < configurations.receiving_video_stream_count; ++i) {
    webrtc::RtpTransceiverInit video_init;
    video_init.direction = webrtc::RtpTransceiverDirection::kRecvOnly;
    video_init.stream_ids = {absl::StrCat("video_stream_", i)};

    webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
        video_result = peer_connection->AddTransceiver(
            cricket::MediaType::MEDIA_TYPE_VIDEO, video_init);
  // . . .
}

JavaScript

pc = new RTCPeerConnection();

// Signal the entire video at once.
pc.addTransceiver(video, {'direction':'recvonly'});
pc.addTransceiver(video, {'direction':'recvonly'});
pc.addTransceiver(video, {'direction':'recvonly'});

Error atribut peran DTLS

Saat menetapkan atribut peran DTLS, Anda mungkin melihat error:

All DTLS roles must be one of [ACTIVE, ACTPASS].

Error ini terjadi jika atribut a=setup:< > tidak ditetapkan dengan benar untuk semua deskripsi media dalam penawaran SDP.

Untuk memperbaiki error ini, pastikan setiap deskripsi media dalam penawaran SDP memiliki salah satu atribut yang diperlukan berikut:

  • a=setup:actpass
  • a=setup:active
v=0
o=- 4743178474630771513 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101
. . .
a=setup:actpass
. . .
m=audio 39807 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=setup:actpass
. . .

Memecahkan masalah audio

Bagian berikut dapat membantu menyelesaikan masalah audio di aplikasi Anda.

Memeriksa log

Jika Anda menggunakan klien web di browser Chrome:

  1. Buka tab baru dan masukkan ke kolom URL: chrome://webrtc-internals.
  2. Buka bagian berlabel Stats graph for inbound-rtp.
  3. Periksa setiap grafik audio untuk melihat apakah paket diterima.

Jika Anda menggunakan klien referensi C++, periksa apakah OnAudioFrame pernah dipanggil.

Memverifikasi cakupan OAuth

Audio hanya dikirim jika cakupan yang sesuai diberikan dengan permintaan koneksi awal. Untuk mengatasi error ini, pastikan untuk memberikan cakupan OAuth 2.0 yang benar. Untuk informasi selengkapnya, lihat Cakupan Meet Media API.

Memverifikasi bahwa konferensi disiapkan dengan benar

  • Saat terhubung dengan server Google Meet, klien tidak otomatis diizinkan ke konferensi. Pastikan Anda telah menerima update resource kontrol sesi melalui saluran data kontrol sesi dengan status STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Pastikan ada peserta konferensi lain yang streaming audionya tidak dibisukan.

Memverifikasi sinyal audio

Meet hanya menyediakan audio jika Anda memberikan sinyal ini dalam penawaran SDP. Harus ada tiga deskripsi media audio hanya terima dalam penawaran.

m=audio 39807 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:0
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:1
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:2
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .

Jika penawaran yang valid diterima oleh server Meet, server akan merespons dengan jawaban SDP yang berisi tiga deskripsi media audio khusus pengiriman.

m=audio 19306 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:0
. . .
a=sendonly
a=msid:virtual-6666 virtual-6666
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:1
. . .
a=sendonly
a=msid:virtual-6667 virtual-6667
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:2
. . .
a=sendonly
a=msid:virtual-6668 virtual-6668
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .

Memeriksa penerapan observer

Pastikan untuk membuat salinan data audio jika Anda memindahkan pemrosesan data ke thread lain. AudioFrame.pcm16 secara efektif merupakan referensi ke data pokok, sehingga mencoba mengaksesnya setelah OnAudioFrame akan menghasilkan perilaku yang tidak ditentukan, seperti error segmentasi.

Memecahkan masalah video

Bagian berikut dapat membantu menyelesaikan masalah video di aplikasi Anda.

Memeriksa log

Jika Anda menggunakan klien web di browser Chrome:

  1. Buka tab baru dan masukkan ke kolom URL: chrome://webrtc-internals.
  2. Buka bagian berlabel Stats graph for inbound-rtp.
  3. Periksa setiap grafik video untuk melihat apakah paket diterima.

Jika Anda menggunakan klien referensi C++, periksa apakah OnVideoFrame pernah dipanggil.

Memverifikasi cakupan OAuth

Video hanya dikirim jika cakupan yang sesuai diberikan dengan permintaan koneksi awal. Untuk mengatasi error ini, pastikan untuk memberikan cakupan OAuth 2.0 yang benar. Untuk informasi selengkapnya, lihat Cakupan Meet Media API.

Memastikan konferensi disiapkan dengan benar

  • Saat terhubung dengan server Meet, klien tidak otomatis diizinkan ke konferensi. Pastikan Anda telah menerima update resource kontrol sesi melalui saluran data kontrol sesi dengan status STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Pastikan ada peserta konferensi lain yang streaming videonya tidak dibisukan.

Memverifikasi sinyal Anda untuk video

Meet hanya menyediakan video jika diberi sinyal dalam penawaran SDP. Harus ada maksimal tiga deskripsi media video khusus terima dalam penawaran.

v=0
o=- 4743178474630771513 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 35 36 37 38 102 103 104 105 106 107 108 109 127 125 39 40 41 42 43 44 45 46 47 48 112 113 114 115 116 117 118 49
. . .
a=setup:actpass
a=mid:1
. . .
a=recvonly
. . .
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
. . .

Jika menerima penawaran yang valid, Meet akan merespons dengan jawaban SDP dengan n deskripsi media video khusus pengiriman, dengan n adalah jumlah deskripsi media video dalam penawaran SDP.

v=0
o=- 0 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS virtual-video-7777/7777
a=ice-lite
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99
. . .
a=setup:passive
a=mid:1
. . .
a=msid:virtual-video-7777/7777 virtual-video-7777/7777
a=rtcp-mux
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
. . .

Memecahkan masalah tidak ada video

  • Pastikan m=video … ada dalam penawaran SDP yang dikirim ke server Meet.
  • Pastikan a=recvonly adalah atribut di setiap baris m=video.
  • Pastikan jumlah baris m=video yang sama ada dalam jawaban SDP.
  • Pastikan a=sendonly atau a=sendrecv adalah atribut di setiap baris m=video dalam jawaban SDP.
  • Pastikan VideoAssignmentRequest yang berhasil dikirim ke dan diterima oleh server Meet. Keberhasilan atau kegagalan harus dikomunikasikan kembali ke klien melalui saluran data yang sama.

Memecahkan masalah lebih sedikit streaming video dari yang diharapkan

  • Pastikan penawaran SDP berisi jumlah baris m=video … yang benar.
  • Pastikan semua deskripsi m=video dalam jawaban SDP berisi atribut a=sendonly atau a=sendrecv. Setiap baris yang ditandai a=recvonly dalam jawaban akan mengurangi jumlah streaming yang dikirim ke klien sebanyak itu.

Memeriksa penerapan observer

Pastikan untuk membuat salinan data video jika Anda memindahkan pemrosesan data ke thread lain. VideoFrame.frame secara efektif merupakan referensi ke data pokok, sehingga mencoba mengaksesnya setelah OnVideoFrame akan menghasilkan perilaku yang tidak ditentukan, seperti error segmentasi.