Koleksiyonlar ile düzeninizi koruyun
İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.
Google Meet Media API, uygulamanızın bir Google Meet konferansına katılmasına ve gerçek zamanlı medya akışlarını kullanmasına olanak tanır.
İstemciler, Meet sunucularıyla iletişim kurmak için WebRTC'yi kullanır. Sağlanan referans istemciler (C++, TypeScript), önerilen uygulamaları gösterir ve doğrudan bu uygulamalardan yararlanmanız önerilir.
Ancak Meet Media API'nin teknik şartlarını karşılayan tamamen özel WebRTC istemcileri de oluşturabilirsiniz.
Bu sayfada, Meet Media API oturumunun başarılı olması için gereken temel WebRTC kavramları özetlenmiştir.
Teklif yanıtı sinyali
WebRTC, eşlerin birbirlerine sinyal göndererek iletişim kurduğu bir eşler arası (P2P) çerçevedir. Oturum başlatan eş, oturum başlatmak için uzaktaki bir eşe SDP teklifi gönderir. Bu teklifte aşağıdaki önemli ayrıntılar yer alır:
Ses ve video için medya açıklamaları
Medya açıklamaları, P2P oturumları sırasında nelerin iletildiğini gösterir. Üç tür açıklama vardır: ses, video ve veri.
Teklif veren, n ses akışını belirtmek için teklife n ses medya açıklaması ekler. Video için de aynı durum geçerlidir. Ancak en fazla bir veri medya açıklaması olabilir.
Yön belirleme
Her ses veya video açıklaması, RFC
3711 tarafından yönetilen ayrı Güvenli Gerçek Zamanlı İletim Protokolü (SRTP) akışlarını tanımlar. Bunlar iki yönlüdür ve iki eşin aynı bağlantı üzerinden medya gönderip almasına olanak tanır.
Bu nedenle, her medya tanımı (hem teklifte hem de yanıtta), yayının nasıl kullanılması gerektiğini açıklayan üç özellikten birini içerir:
sendonly: Yalnızca teklif veren eşlemeden medya gönderir. Uzak eş, bu akışta medya göndermez.
recvonly: Yalnızca uzak eşleşirden medya alır. Teklif veren eş, bu akışta medya göndermez.
sendrecv: Her iki eş de bu akışta veri gönderip alabilir.
Codec'ler
Her medya açıklaması, eşlemenin desteklediği codec'leri de belirtir. Meet Media API'de istemci teklifleri, teknik şartlarda belirtilen codec'leri desteklemediği sürece (en azından) reddedilir.
DTLS el sıkışması
SRTP akışları, eşler arasında yapılan ilk Datagram Taşıma Katmanı Güvenliği ("DTLS", RFC
9147) el sıkışma işlemiyle güvence altına alınır.
DTLS geleneksel olarak istemci-sunucu protokolüdür; sinyal verme işlemi sırasında bir eş, sunucu olarak hareket etmeyi kabul ederken diğeri eş olarak hareket eder.
Her SRTP akışının kendi özel DTLS bağlantısı olabileceğinden, her medya açıklamasında DTLS el sıkışmasında eşlemenin rolünü belirtmek için üç özellikten biri belirtilir:
a=setup:actpass: Teklif veren eş, uzak eşe bağlıdır.
a=setup:active: Bu eş, istemci olarak çalışır.
a=setup:passive: Bu eş, sunucu görevi görür.
Uygulama medya açıklamaları
Veri kanalları (RFC 8831), Stream Control Transmission Protocol ("SCTP", RFC
9260) protokolünün soyut bir temsilidir.
İlk sinyalleme aşamasında veri kanallarını açmak için teklifte bir uygulama medya açıklaması bulunmalıdır. Ses ve video açıklamalarının aksine, uygulama açıklamalarında yön veya codec'ler belirtilmez.
ICE adayları
Bir eşin etkileşimli bağlantı oluşturma ("ICE", RFC
8445) adayları, uzak bir eşin bağlantı kurmak için kullanabileceği rotaların listesidir.
İki eşin listelerinin Kartezyen çarpımı, aday çiftler olarak bilinir ve iki eş arasındaki olası rotaları temsil eder. En uygun rotanın belirlenmesi için bu eşlemeler test edilir.
Aşağıda işitsel medya açıklaması içeren bir teklif verilmiştir:
Şekil 1. Sesli medya açıklaması içeren örnek teklif.
Uzak eş, aynı sayıda medya açıklaması satırı içeren bir SDP yanıtıyla yanıt verir. Her satır, uzak eşin SRTP akışları üzerinden teklif istemciye geri gönderdiği medyayı (varsa) belirtir. Uzak eş, medya açıklaması girişini recvonly olarak ayarlayarak teklif verenin belirli akışlarını da reddedebilir.
Meet Media API için istemciler, bağlantı başlatmak üzere her zaman SDP teklifini gönderir. Meet hiçbir zaman toplantıyı başlatmaz.
Bu davranış, referans istemciler (C++, TypeScript) tarafından dahili olarak yönetilir ancak özel istemci geliştiricileri teklif oluşturmak için WebRTC'nin PeerConnectionInterface özelliğini kullanabilir.
Fırsatın Meet'e bağlanabilmesi için belirli koşulları karşılaması gerekir:
İstemci, DTLS el sıkışmalarında her zaman istemci olarak hareket etmelidir. Bu nedenle, teklifteki her medya açıklamasında a=setup:actpass veya a=setup:active belirtilmelidir.
Her medya açıklaması satırı, ilgili medya türü için tüm zorunlu codec'leri desteklemelidir:
Ses:Opus
Video:VP8, VP9, AV1
Ses almak için teklifte tam olarak 3 adet yalnızca alıcı sesli medya açıklaması bulunmalıdır. Bunu, eş bağlantı nesnesinde alıcı vericileri ayarlayarak yapabilirsiniz.
C++
// ...rtc::scoped_refptr<webrtc::PeerConnectionInterface>peer_connection;for(inti=0;i < 3;++i){webrtc::RtpTransceiverInitaudio_init;audio_init.direction=webrtc::RtpTransceiverDirection::kRecvOnly;audio_init.stream_ids={absl::StrCat("audio_stream_",i)};webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
audio_result=peer_connection->AddTransceiver(cricket::MediaType::MEDIA_TYPE_AUDIO,audio_init);if(!audio_result.ok()){returnabsl::InternalError(absl::StrCat("Failed to add audio transceiver: ",audio_result.error().message()));}}
JavaScript
pc=newRTCPeerConnection();// Configure client to receive audio from Meet servers.pc.addTransceiver('audio',{'direction':'recvonly'});pc.addTransceiver('audio',{'direction':'recvonly'});pc.addTransceiver('audio',{'direction':'recvonly'});
Video almak için teklifte 1-3 adet yalnızca alıcı video medya açıklaması bulunmalıdır. Bunu, eş bağlantı nesnesinde alıcı/vericileri ayarlayarak yapabilirsiniz.
C++
// ...rtc::scoped_refptr<webrtc::PeerConnectionInterface>peer_connection;for(uint32_ti=0;i < configurations.receiving_video_stream_count;++i){webrtc::RtpTransceiverInitvideo_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);if(!video_result.ok()){returnabsl::InternalError(absl::StrCat("Failed to add video transceiver: ",video_result.error().message()));}}
JavaScript
pc=newRTCPeerConnection();// Configure client to receive video from Meet servers.pc.addTransceiver('video',{'direction':'recvonly'});pc.addTransceiver('video',{'direction':'recvonly'});pc.addTransceiver('video',{'direction':'recvonly'});
Teklif her zaman veri kanallarını içermelidir. En azından session-control ve media-stats kanalları her zaman açık olmalıdır. Tüm veri kanalları ordered olmalıdır.
C++
// ...// All data channels must be ordered.constexprwebrtc::DataChannelInitkDataChannelConfig={.ordered=true};rtc::scoped_refptr<webrtc::PeerConnectionInterface>peer_connection;// Signal session-control data channel.webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::DataChannelInterface>>
session_create_result=peer_connection->CreateDataChannelOrError("session-control",&kDataChannelConfig);if(!session_create_result.ok()){returnabsl::InternalError(absl::StrCat("Failed to create data channel ",data_channel_label,": ",session_create_result.error().message()));}// Signal media-stats data channel.webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::DataChannelInterface>>
stats_create_result=peer_connection->CreateDataChannelOrError("media-stats",&kDataChannelConfig);if(!stats_create_result.ok()){returnabsl::InternalError(absl::StrCat("Failed to create data channel ",data_channel_label,": ",stats_create_result.error().message()));}
JavaScript
// ...pc=newRTCPeerConnection();// All data channels must be ordered.constdataChannelConfig={ordered:true,};// Signal session-control data channel.sessionControlChannel=pc.createDataChannel('session-control',dataChannelConfig);sessionControlChannel.onopen=()=>console.log("data channel is now open");sessionControlChannel.onclose=()=>console.log("data channel is now closed");sessionControlChannel.onmessage=async(e)=>{console.log("data channel message",e.data);};// Signal media-stats data channel.mediaStatsChannel=pc.createDataChannel('media-stats',dataChannelConfig);mediaStatsChannel.onopen=()=>console.log("data channel is now open");mediaStatsChannel.onclose=()=>console.log("data channel is now closed");mediaStatsChannel.onmessage=async(e)=>{console.log("data channel message",e.data);};
Örnek SDP teklifi ve yanıtı
Aşağıda, geçerli bir SDP teklifi ve eşleşen SDP yanıtının tam örneği verilmiştir. Bu teklif, ses ve tek bir video akışı içeren bir Meet Media API oturumu için pazarlık yapar.
Üç işitsel medya açıklaması, bir video medya açıklaması ve gerekli uygulama medya açıklaması olduğunu görebilirsiniz.
[[["Anlaması kolay","easyToUnderstand","thumb-up"],["Sorunumu çözdü","solvedMyProblem","thumb-up"],["Diğer","otherUp","thumb-up"]],[["İhtiyacım olan bilgiler yok","missingTheInformationINeed","thumb-down"],["Çok karmaşık / çok fazla adım var","tooComplicatedTooManySteps","thumb-down"],["Güncel değil","outOfDate","thumb-down"],["Çeviri sorunu","translationIssue","thumb-down"],["Örnek veya kod sorunu","samplesCodeIssue","thumb-down"],["Diğer","otherDown","thumb-down"]],["Son güncelleme tarihi: 2025-02-24 UTC."],[[["The Google Meet Media API enables applications to join Google Meet conferences and receive real-time media streams, relying on WebRTC for peer-to-peer communication."],["Offer-answer signaling, facilitated by the Meet REST API, is crucial for establishing WebRTC sessions, with the initiating peer sending an SDP offer and receiving an SDP answer from the remote peer."],["Clients connecting to Google Meet must support specific codecs (Opus for audio, VP8, VP9, AV1 for video), act as the DTLS client, include at least three `recvonly` audio descriptions, and always include data channels."],["Media descriptions specify the type of media (audio, video, data), with directionality (sendonly, recvonly, sendrecv) determining stream usage and direction, governed by SRTP."],["SDP media descriptions include the type of media (audio, video, or application/data), which IP and port it uses, the ICE credential, the DTLS fingerprint and the header extensions it supports, like the time offset, the content type, the mid and the rtp-stream-id, among others."]]],[]]