মিডিয়া API ধারণাগুলি পূরণ করুন
সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
গুগল মিট মিডিয়া এপিআই আপনার অ্যাপকে গুগল মিট কনফারেন্সে যোগদান করতে এবং রিয়েল-টাইম মিডিয়া স্ট্রিম গ্রহণ করতে দেয়।
ক্লায়েন্টরা Meet সার্ভারের সাথে যোগাযোগের জন্য WebRTC ব্যবহার করে। প্রদত্ত রেফারেন্স ক্লায়েন্টগুলো ( C++ , TypeScript ) প্রস্তাবিত পদ্ধতিগুলো প্রদর্শন করে এবং আপনাকে সরাসরি সেগুলোর উপর ভিত্তি করে কাজ করতে উৎসাহিত করা হচ্ছে।
তবে, আপনি Meet Media API-এর প্রযুক্তিগত প্রয়োজনীয়তা মেনে সম্পূর্ণ কাস্টম WebRTC ক্লায়েন্টও তৈরি করতে পারেন।
এই পৃষ্ঠায় একটি সফল Meet Media API সেশনের জন্য প্রয়োজনীয় মূল WebRTC ধারণাগুলো তুলে ধরা হয়েছে।
প্রস্তাব-উত্তর সংকেত
WebRTC হলো একটি পিয়ার-টু-পিয়ার (P2P) ফ্রেমওয়ার্ক, যেখানে পিয়ারগুলো একে অপরকে সিগন্যাল পাঠানোর মাধ্যমে যোগাযোগ করে। একটি সেশন শুরু করার জন্য, সেশন শুরুকারী পিয়ারটি একটি রিমোট পিয়ারের কাছে একটি SDP অফার পাঠায়। এই অফারটিতে নিম্নলিখিত গুরুত্বপূর্ণ বিবরণগুলো অন্তর্ভুক্ত থাকে:
অডিও এবং ভিডিওর জন্য মিডিয়া বিবরণ
মিডিয়া বিবরণ নির্দেশ করে যে পি২পি সেশনের সময় কী যোগাযোগ করা হয়। তিন ধরনের বিবরণ রয়েছে: অডিও, ভিডিও এবং ডেটা।
n সংখ্যক অডিও স্ট্রিম নির্দেশ করার জন্য, অফারকারী অফারটিতে n সংখ্যক অডিও মিডিয়া বিবরণ অন্তর্ভুক্ত করে। ভিডিওর ক্ষেত্রেও একই কথা প্রযোজ্য। তবে, সর্বাধিক একটির বেশি ডেটা মিডিয়া বিবরণ থাকবে না।
দিকনির্দেশনা
প্রতিটি অডিও বা ভিডিওর বিবরণে স্বতন্ত্র সিকিওর রিয়েল-টাইম ট্রান্সপোর্ট প্রোটোকল (SRTP) স্ট্রিম বর্ণনা করা থাকে, যা RFC 3711 দ্বারা নিয়ন্ত্রিত। এগুলি দ্বিমুখী, যা দুটি পিয়ারকে একই সংযোগের মাধ্যমে মিডিয়া প্রেরণ এবং গ্রহণ করার সুযোগ দেয়।
এই কারণে, প্রতিটি মিডিয়া বিবরণে (অফার এবং উত্তর উভয় ক্ষেত্রেই) তিনটি অ্যাট্রিবিউটের মধ্যে একটি থাকে, যা বর্ণনা করে যে স্ট্রিমটি কীভাবে ব্যবহার করা উচিত:
sendonly : শুধুমাত্র অফারিং পিয়ার থেকে মিডিয়া পাঠায়। রিমোট পিয়ার এই স্ট্রিমে মিডিয়া পাঠাবে না।
recvonly : শুধুমাত্র রিমোট পিয়ার থেকে মিডিয়া গ্রহণ করে। অফারিং পিয়ার এই স্ট্রিমে মিডিয়া পাঠাবে না।
sendrecv : এই স্ট্রিমে উভয় পিয়ারই ডেটা পাঠাতে ও গ্রহণ করতে পারে।
কোডেক
প্রতিটি মিডিয়া বিবরণে পিয়ার কর্তৃক সমর্থিত কোডেকগুলোও উল্লেখ করা থাকে। Meet Media API-এর ক্ষেত্রে, ক্লায়েন্টের অফারগুলো প্রত্যাখ্যান করা হয়, যদি না সেগুলো প্রযুক্তিগত প্রয়োজনীয়তায় উল্লেখিত কোডেকগুলো (অন্ততপক্ষে) সমর্থন করে।
ডিটিএলএস হ্যান্ডশেক
পিয়ারগুলোর মধ্যে একটি প্রাথমিক ডেটাগ্রাম ট্রান্সপোর্ট লেয়ার সিকিউরিটি ("DTLS", RFC 9147 ) হ্যান্ডশেকের মাধ্যমে SRTP স্ট্রিমগুলো সুরক্ষিত থাকে। 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)
সংযোগ প্রবাহের উদাহরণ
এখানে একটি অফার ও তার অডিও মিডিয়ার বিবরণ দেওয়া হলো:
চিত্র ১. অডিও মিডিয়ার বিবরণসহ একটি অফারের নমুনা।
রিমোট পিয়ার একই সংখ্যক মিডিয়া ডেসক্রিপশন লাইন সম্বলিত একটি SDP উত্তর দিয়ে সাড়া দেয়। প্রতিটি লাইন নির্দেশ করে যে, রিমোট পিয়ার SRTP স্ট্রিমের মাধ্যমে অফারিং ক্লায়েন্টের কাছে কোন মিডিয়া ফেরত পাঠাবে (যদি পাঠায়)। রিমোট পিয়ার সেই মিডিয়া ডেসক্রিপশন এন্ট্রিটিকে ' recvonly সেট করার মাধ্যমে অফারারের কাছ থেকে আসা নির্দিষ্ট স্ট্রিম প্রত্যাখ্যানও করতে পারে।
Meet Media API-এর ক্ষেত্রে, ক্লায়েন্টরা সংযোগ শুরু করার জন্য সর্বদা SDP অফার পাঠায়। Meet কখনও সংযোগ শুরু করে না।
এই আচরণটি রেফারেন্স ক্লায়েন্ট ( C++ , TypeScript ) দ্বারা অভ্যন্তরীণভাবে পরিচালিত হয়, কিন্তু কাস্টম ক্লায়েন্টের ডেভেলপাররা একটি অফার তৈরি করতে WebRTC-এর PeerConnectionInterface ব্যবহার করতে পারেন।
Meet Meet-এর সাথে সংযোগ স্থাপন করতে হলে, অফারটিকে অবশ্যই নির্দিষ্ট শর্তাবলী মেনে চলতে হবে:
DTLS হ্যান্ডশেকে ক্লায়েন্টকে অবশ্যই সর্বদা ক্লায়েন্ট হিসেবে কাজ করতে হবে, তাই অফারের প্রতিটি মিডিয়া বর্ণনায় অবশ্যই a=setup:actpass অথবা a=setup:active উল্লেখ করতে হবে।
প্রতিটি মিডিয়া বিবরণ লাইনে অবশ্যই সেই মিডিয়া টাইপের জন্য প্রয়োজনীয় সকল কোডেক সমর্থন থাকতে হবে:
অডিও:Opus
ভিডিও:VP8 , VP9 , AV1
অডিও গ্রহণ করার জন্য, অফারটিতে অবশ্যই ঠিক ৩টি শুধুমাত্র-গ্রহণযোগ্য অডিও মিডিয়া বিবরণ অন্তর্ভুক্ত থাকতে হবে। আপনি পিয়ার সংযোগ অবজেক্টে ট্রান্সসিভার সেট করার মাধ্যমে এটি করতে পারেন।
সি++
// ...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'});
ভিডিও গ্রহণ করার জন্য, অফারটিতে অবশ্যই ১-৩টি শুধুমাত্র-গ্রহণযোগ্য ভিডিও মিডিয়া বিবরণ অন্তর্ভুক্ত থাকতে হবে। আপনি পিয়ার সংযোগ অবজেক্টে ট্রান্সসিভার সেট করার মাধ্যমে এটি করতে পারেন।
সি++
// ...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 উত্তরের একটি সম্পূর্ণ উদাহরণ দেওয়া হলো। এই অফারটি অডিও এবং একটি একক ভিডিও স্ট্রিম সহ একটি 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"]],["2026-04-01 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[]]