মিডিয়া API ধারণাগুলি পূরণ করুন
সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
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-এর ক্ষেত্রে, ক্লায়েন্ট অফারগুলি প্রত্যাখ্যান করা হয় যদি না তারা (অন্তত) প্রযুক্তিগত প্রয়োজনীয়তায় উল্লেখিত কোডেকগুলো সাপোর্ট করে।
ডিটিএলএস হ্যান্ডশেক
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)
সংযোগ প্রবাহের উদাহরণ
এখানে অডিও মিডিয়ার বিবরণ সহ একটি অফার রয়েছে:
চিত্র ১. অডিও মিডিয়া বর্ণনা সহ একটি উদাহরণ অফারের উদাহরণ।
রিমোট পিয়ার একই সংখ্যক মিডিয়া বর্ণনা লাইন সম্বলিত একটি 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
অডিও গ্রহণের জন্য, অফারটিতে ঠিক 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'});
ভিডিও গ্রহণের জন্য, অফারটিতে ১-৩টি রিসিভ-অনলি ভিডিও মিডিয়া বর্ণনা অন্তর্ভুক্ত করতে হবে। আপনি পিয়ার সংযোগ অবজেক্টে ট্রান্সসিভার সেট করে এটি করতে পারেন।
সি++
// ...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 সেশনের জন্য আলোচনা করে।
লক্ষ্য করুন যে তিনটি অডিও মিডিয়া বর্ণনা, একটি ভিডিও মিডিয়া বিবরণ এবং প্রয়োজনীয় অ্যাপ্লিকেশন মিডিয়া বিবরণ রয়েছে।
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-এর ক্ষেত্রে, ক্লায়েন্ট অফারগুলি প্রত্যাখ্যান করা হয় যদি না তারা (অন্তত) প্রযুক্তিগত প্রয়োজনীয়তায় উল্লেখিত কোডেকগুলো সাপোর্ট করে।
ডিটিএলএস হ্যান্ডশেক
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)
সংযোগ প্রবাহের উদাহরণ
এখানে অডিও মিডিয়ার বিবরণ সহ একটি অফার রয়েছে:
চিত্র ১. অডিও মিডিয়া বর্ণনা সহ একটি উদাহরণ অফারের উদাহরণ।
রিমোট পিয়ার একই সংখ্যক মিডিয়া বর্ণনা লাইন সম্বলিত একটি 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
অডিও গ্রহণের জন্য, অফারটিতে ঠিক 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'});
ভিডিও গ্রহণের জন্য, অফারটিতে ১-৩টি রিসিভ-অনলি ভিডিও মিডিয়া বর্ণনা অন্তর্ভুক্ত করতে হবে। আপনি পিয়ার সংযোগ অবজেক্টে ট্রান্সসিভার সেট করে এটি করতে পারেন।
সি++
// ...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-12-04 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[]]