সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
Google Meet Media API আপনার অ্যাপকে Google Meet কনফারেন্সে যোগ দিতে এবং রিয়েল-টাইম মিডিয়া স্ট্রিম ব্যবহার করতে দেয়।
Meet সার্ভারের সাথে যোগাযোগ করতে ক্লায়েন্টরা WebRTC ব্যবহার করে। প্রদত্ত রেফারেন্স ক্লায়েন্ট ( C++ , TypeScript ) প্রস্তাবিত অনুশীলনগুলি প্রদর্শন করে এবং আপনাকে সরাসরি সেগুলি তৈরি করতে উত্সাহিত করা হয়।
যাইহোক, আপনি সম্পূর্ণ কাস্টম WebRTC ক্লায়েন্ট তৈরি করতে পারেন যেগুলি Meet Media API-এর প্রযুক্তিগত প্রয়োজনীয়তা মেনে চলে।
এই পৃষ্ঠাটি একটি সফল Meet Media API সেশনের জন্য প্রয়োজনীয় WebRTC ধারণার রূপরেখা দেয়।
অফার-উত্তর সংকেত
WebRTC হল একটি পিয়ার-টু-পিয়ার (P2P) ফ্রেমওয়ার্ক, যেখানে সহকর্মীরা একে অপরকে সংকেত দিয়ে যোগাযোগ করে। একটি অধিবেশন শুরু করতে, সূচনাকারী পিয়ার একটি দূরবর্তী পিয়ারকে একটি SDP অফার পাঠায়। এই অফারে নিম্নলিখিত গুরুত্বপূর্ণ বিবরণ অন্তর্ভুক্ত রয়েছে:
অডিও এবং ভিডিওর জন্য মিডিয়া বিবরণ
P2P সেশনের সময় কী যোগাযোগ করা হয় তা মিডিয়ার বিবরণ নির্দেশ করে। তিন ধরনের বর্ণনা বিদ্যমান: অডিও, ভিডিও এবং ডেটা।
n অডিও স্ট্রীম নির্দেশ করতে, অফারটি অফারে n মিডিয়া বিবরণ অন্তর্ভুক্ত করে। ভিডিওর ক্ষেত্রেও একই কথা। যাইহোক, সর্বাধিক শুধুমাত্র একটি ডেটা মিডিয়া বিবরণ থাকবে।
দিকনির্দেশনা
প্রতিটি অডিও বা ভিডিও বর্ণনা পৃথক সিকিউর রিয়েল-টাইম ট্রান্সপোর্ট প্রোটোকল (SRTP) স্ট্রীম বর্ণনা করে, যা RFC 3711 দ্বারা পরিচালিত। এগুলি দ্বি-দিকনির্দেশক, দুই সহকর্মীকে একই সংযোগ জুড়ে মিডিয়া পাঠাতে এবং গ্রহণ করার অনুমতি দেয়।
এই কারণে, প্রতিটি মিডিয়া বিবরণে (অফার এবং উত্তর উভয়েই) তিনটি বৈশিষ্ট্যের মধ্যে একটি রয়েছে যা বর্ণনা করে যে স্ট্রিমটি কীভাবে ব্যবহার করা উচিত:
sendonly : শুধুমাত্র অফার পিয়ার থেকে মিডিয়া পাঠায়। রিমোট পিয়ার এই স্ট্রীমে মিডিয়া পাঠাবে না।
recvonly : শুধুমাত্র দূরবর্তী পিয়ার থেকে মিডিয়া গ্রহণ করে। অফারকারী পিয়ার এই স্ট্রীমে মিডিয়া পাঠাবে না।
sendrecv : উভয় সহকর্মী এই স্ট্রীমে পাঠাতে এবং গ্রহণ করতে পারে।
কোডেক
প্রতিটি মিডিয়া বিবরণ একজন সহকর্মী সমর্থন করে এমন কোডেকগুলিও নির্দিষ্ট করে। Meet Media API-এর ক্ষেত্রে, ক্লায়েন্ট অফারগুলি প্রত্যাখ্যান করা হয় যদি না তারা প্রযুক্তিগত প্রয়োজনীয়তায় নির্দিষ্ট কোডেকগুলিকে সমর্থন করে (অন্তত)।
DTLS হ্যান্ডশেক
SRTP স্ট্রীমগুলি একটি প্রাথমিক ডেটাগ্রাম ট্রান্সপোর্ট লেয়ার সিকিউরিটি ("DTLS", RFC 9147 ) সহকর্মীদের মধ্যে হ্যান্ডশেক দ্বারা সুরক্ষিত হয়। DTLS ঐতিহ্যগতভাবে একটি ক্লায়েন্ট-টু-সার্ভার প্রোটোকল; সিগন্যালিং প্রক্রিয়া চলাকালীন, একজন সহকর্মী সার্ভার হিসাবে কাজ করতে সম্মত হন যখন অন্যটি পিয়ার হিসাবে কাজ করে।
যেহেতু প্রতিটি SRTP স্ট্রীমের নিজস্ব ডেডিকেটেড DTLS সংযোগ থাকতে পারে, প্রতিটি মিডিয়া বিবরণ DTLS হ্যান্ডশেকে সহকর্মীর ভূমিকা নির্দেশ করার জন্য তিনটি বৈশিষ্ট্যের মধ্যে একটি নির্দিষ্ট করে:
a=setup:actpass : অফার করা পিয়ার রিমোট পিয়ারের পছন্দকে পিছিয়ে দেয়।
a=setup:active : এই পিয়ার ক্লায়েন্ট হিসাবে কাজ করে।
a=setup:passive : এই পিয়ার সার্ভার হিসাবে কাজ করে।
অ্যাপ্লিকেশন মিডিয়া বিবরণ
ডেটা চ্যানেল ( RFC 8831 ) হল স্ট্রীম কন্ট্রোল ট্রান্সমিশন প্রোটোকলের একটি বিমূর্ততা ("SCTP", RFC 9260 )।
প্রাথমিক সিগন্যালিং পর্বে ডেটা চ্যানেল খুলতে, অফারটিতে অবশ্যই একটি অ্যাপ্লিকেশন মিডিয়া বিবরণ থাকতে হবে। অডিও এবং ভিডিও বর্ণনার বিপরীতে, অ্যাপ্লিকেশন বিবরণ দিকনির্দেশ বা কোডেক নির্দিষ্ট করে না।
আইসিই প্রার্থীরা
একজন পিয়ারের ইন্টারেক্টিভ কানেক্টিভিটি এস্টাব্লিশমেন্ট ("ICE", RFC 8445 ) প্রার্থীরা হল সেই রুটের একটি তালিকা যা একজন দূরবর্তী পিয়ার সংযোগ স্থাপন করতে ব্যবহার করতে পারে।
দুই সমবয়সীদের তালিকার কার্টেসিয়ান পণ্য, প্রার্থী জোড়া হিসাবে পরিচিত, দুই সমবয়সীর মধ্যে সম্ভাব্য পথের প্রতিনিধিত্ব করে। এই জোড়াগুলি সর্বোত্তম রুট নির্ধারণ করতে পরীক্ষা করা হয়।
importcom.google.api.core.ApiFuture;importcom.google.apps.meet.v2beta.ConnectActiveConferenceRequest;importcom.google.apps.meet.v2beta.ConnectActiveConferenceResponse;importcom.google.apps.meet.v2beta.SpaceName;importcom.google.apps.meet.v2beta.SpacesServiceClient;publicclassAsyncConnectActiveConference{publicstaticvoidmain(String[]args)throwsException{asyncConnectActiveConference();}publicstaticvoidasyncConnectActiveConference()throwsException{// This snippet has been automatically generated and should be regarded as a code template only.// It will require modifications to work:// - It may require correct/in-range values for request initialization.// - It may require specifying regional endpoints when creating the service client as shown in// https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_librarytry(SpacesServiceClientspacesServiceClient=SpacesServiceClient.create()){ConnectActiveConferenceRequestrequest=ConnectActiveConferenceRequest.newBuilder().setName(SpaceName.of("[SPACE]").toString()).setOffer("offer105650780").build();ApiFuture<ConnectActiveConferenceResponse>future=spacesServiceClient.connectActiveConferenceCallable().futureCall(request);// Do something.ConnectActiveConferenceResponseresponse=future.get();}}}
usingGoogle.Apps.Meet.V2Beta;usingSystem.Threading.Tasks;publicsealedpartialclassGeneratedSpacesServiceClientSnippets{/// <summary>Snippet for ConnectActiveConferenceAsync</summary>/// <remarks>/// This snippet has been automatically generated and should be regarded as a code template only./// It will require modifications to work:/// - It may require correct/in-range values for request initialization./// - It may require specifying regional endpoints when creating the service client as shown in/// https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint./// </remarks>publicasyncTaskConnectActiveConferenceAsync(){// Create clientSpacesServiceClientspacesServiceClient=awaitSpacesServiceClient.CreateAsync();// Initialize request argument(s)stringname="spaces/[SPACE]";// Make the requestConnectActiveConferenceResponseresponse=awaitspacesServiceClient.ConnectActiveConferenceAsync(name);}}
/** * This snippet has been automatically generated and should be regarded as a code template only. * It will require modifications to work. * It may require correct/in-range values for request initialization. * TODO(developer): Uncomment these variables before running the sample. *//** * Required. Resource name of the space. * Format: spaces/{spaceId} */// const name = 'abc123'/** * Required. WebRTC SDP (Session Description Protocol) offer from the client. * The format is defined by RFC * 8866 (https://www.rfc-editor.org/rfc/rfc8866) with mandatory keys defined * by RFC 8829 (https://www.rfc-editor.org/rfc/rfc8829). This is the standard * SDP format generated by a peer connection's createOffer() and * createAnswer() methods. */// const offer = 'abc123'// Imports the Meet libraryconst{SpacesServiceClient}=require('@google-apps/meet').v2beta;// Instantiates a clientconstmeetClient=newSpacesServiceClient();asyncfunctioncallConnectActiveConference(){// Construct requestconstrequest={name,offer,};// Run requestconstresponse=awaitmeetClient.connectActiveConference(request);console.log(response);}callConnectActiveConference();
# This snippet has been automatically generated and should be regarded as a# code template only.# It will require modifications to work:# - It may require correct/in-range values for request initialization.# - It may require specifying regional endpoints when creating the service# client as shown in:# https://googleapis.dev/python/google-api-core/latest/client_options.htmlfromgoogle.appsimportmeet_v2betaasyncdefsample_connect_active_conference():# Create a clientclient=meet_v2beta.SpacesServiceAsyncClient()# Initialize request argument(s)request=meet_v2beta.ConnectActiveConferenceRequest(name="name_value",offer="offer_value",)# Make the requestresponse=awaitclient.connect_active_conference(request=request)# Handle the responseprint(response)
সংযোগ প্রবাহের উদাহরণ
এখানে একটি অডিও মিডিয়া বিবরণ সহ একটি অফার রয়েছে:
চিত্র 1. একটি অডিও মিডিয়া বিবরণ সহ উদাহরণ অফার।
রিমোট পিয়ার একই সংখ্যক মিডিয়া বর্ণনা লাইন সমন্বিত একটি SDP উত্তর দিয়ে সাড়া দেয়। প্রতিটি লাইন নির্দেশ করে কোন মিডিয়া, যদি থাকে, রিমোট পিয়ার SRTP স্ট্রীম জুড়ে অফার ক্লায়েন্টকে ফেরত পাঠায়। রিমোট পিয়ার সেই মিডিয়া বিবরণ এন্ট্রিকে recvonly সেট করে অফার থেকে নির্দিষ্ট স্ট্রীম প্রত্যাখ্যান করতে পারে।
Meet Media API-এর জন্য, ক্লায়েন্ট সবসময় একটি সংযোগ শুরু করার জন্য SDP অফার পাঠায়। মিট কখনই সূচনাকারী নয়।
এই আচরণটি রেফারেন্স ক্লায়েন্ট ( C++ , TypeScript ) দ্বারা অভ্যন্তরীণভাবে পরিচালিত হয়, তবে কাস্টম ক্লায়েন্টের বিকাশকারীরা একটি অফার তৈরি করতে WebRTC-এর PeerConnectionInterface ব্যবহার করতে পারে৷
DTLS হ্যান্ডশেক-এ ক্লায়েন্টকে সর্বদা ক্লায়েন্ট হিসাবে কাজ করতে হবে, তাই অফারের প্রতিটি মিডিয়া বিবরণ অবশ্যই a=setup:actpass বা a=setup:active উল্লেখ করতে হবে।
প্রতিটি মিডিয়া বর্ণনা লাইন অবশ্যই সেই মিডিয়া প্রকারের জন্য প্রয়োজনীয় সমস্ত কোডেক সমর্থন করবে:
অডিও:Opus
ভিডিও:VP8 , VP9 , AV1
অডিও পাওয়ার জন্য, অফারটিতে অবশ্যই 3টি রিসিভ-শুধু অডিও মিডিয়া বর্ণনা অন্তর্ভুক্ত করতে হবে। আপনি পিয়ার সংযোগ বস্তুতে ট্রান্সসিভার সেট করে এটি করতে পারেন।
সি++
// ...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()));}}
জাভাস্ক্রিপ্ট
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'});
ভিডিও পাওয়ার জন্য, অফারটিতে অবশ্যই 1-3টি রিসিভ-শুধু ভিডিও মিডিয়া বিবরণ অন্তর্ভুক্ত করতে হবে। আপনি পিয়ার সংযোগ বস্তুতে ট্রান্সসিভার সেট করে এটি করতে পারেন।
সি++
// ...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()));}}
জাভাস্ক্রিপ্ট
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'});
অফারে অবশ্যই সবসময় ডেটা চ্যানেল অন্তর্ভুক্ত থাকতে হবে। ন্যূনতম, session-control এবং media-stats চ্যানেলগুলি সর্বদা খোলা থাকা উচিত। সমস্ত ডেটা চ্যানেল ordered করতে হবে।
সি++
// ...// 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()));}
জাভাস্ক্রিপ্ট
// ...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);};
উদাহরণ SDP অফার এবং উত্তর
এখানে একটি বৈধ SDP অফার এবং মিলিত SDP উত্তরের একটি সম্পূর্ণ উদাহরণ রয়েছে৷ এই অফারটি অডিও এবং একটি একক ভিডিও স্ট্রিম সহ একটি Meet Media API সেশন নিয়ে আলোচনা করে।
তিনটি অডিও মিডিয়া বিবরণ, একটি ভিডিও মিডিয়া বিবরণ এবং প্রয়োজনীয় অ্যাপ্লিকেশন মিডিয়া বিবরণ আছে লক্ষ্য করুন।
[[["সহজে বোঝা যায়","easyToUnderstand","thumb-up"],["আমার সমস্যার সমাধান হয়েছে","solvedMyProblem","thumb-up"],["অন্যান্য","otherUp","thumb-up"]],[["এতে আমার প্রয়োজনীয় তথ্য নেই","missingTheInformationINeed","thumb-down"],["খুব জটিল / অনেক ধাপ","tooComplicatedTooManySteps","thumb-down"],["পুরনো","outOfDate","thumb-down"],["অনুবাদ সংক্রান্ত সমস্যা","translationIssue","thumb-down"],["নমুনা / কোড সংক্রান্ত সমস্যা","samplesCodeIssue","thumb-down"],["অন্যান্য","otherDown","thumb-down"]],["2025-03-06 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."]]],[]]