সম্মেলনের প্রোটোকল

এই নথিতে আমরা কনফারেন্স পরিচালনার জন্য যে পরিবর্তনগুলি করব তা বর্ণনা করার লক্ষ্য রয়েছে (অডিও / ভিডিও) লক্ষ্যটি হ'ল বর্তমান বাস্তবায়ন উন্নত করা যা কেবলমাত্র এসআইপি কলগুলিকে একত্রিত করে এবং একটি গ্রিড ভিউ সরবরাহ করে, যেখানে অংশগ্রহণকারীদের তালিকাভুক্ত করা হয়, স্বতন্ত্রভাবে নিঃশব্দ করা যায়, বা ভিডিও বিন্যাস পরিবর্তন করা যায় (কেবলমাত্র একজন অংশগ্রহণকারী দেখানোর জন্য)

সংজ্ঞা

  • হোস্টঃ ব্যবহারকারী যিনি অন্যদের জন্য অডিও / ভিডিও স্ট্রিমগুলি মিশ্রিত করেন

  • অংশগ্রহণকারীঃ সম্মেলনের প্রতিটি ব্যবহারকারী, এমনকি হোস্ট

দায়বদ্ধতা ছাড়াই

এই ডকুমেন্টটি শুধুমাত্র প্রথম পদক্ষেপগুলি বর্ণনা করে। এর অর্থ হল অংশগ্রহণকারীদের সনাক্তকরণ এবং ভিডিও মিক্সারে অবস্থান যা সমস্ত অংশগ্রহণকারীদের কাছে প্রেরণ করা হয়।

সম্ভাব্য বিন্যাস

  • গ্রিডঃ প্রতিটি সদস্য একই উচ্চতা/প্রস্থের সাথে প্রদর্শিত হয়

  • ONE_BIG_WITH_SMALL: একটি সদস্যকে জুম করা হয় এবং অন্যটি প্রিভিউ প্রদর্শিত হয়

  • ONE_BIG: একজন সদস্য পুরো স্ক্রিন রেন্ডার করে

কলম্যানেজারে কনফারেন্স লেআউট পরিচালনার জন্য দুটি নতুন পদ্ধতি উপলব্ধঃ

/**
 * Change the conference layout
 * @param confId
 * @param layout    0 = matrix, 1 = one big, others in small, 2 = one in big
 */
void setConferenceLayout(const std::string& confId, int layout);

/**
 * Change the active participant (used in layout != matrix)
 * @param confId
 * @param participantId    If participantId not found, the local video will be shown
 */
void setActiveParticipant(const std::string& confId, const std::string& participantId);

বাস্তবায়ন বেশ সহজ। সবকিছু conference.cpp (অংশগ্রহণকারীকে উত্সগুলিতে লিঙ্ক করতে) এবং video_mixer.cpp (যাচাই করা বিন্যাসটি প্রদর্শন করতে) দ্বারা পরিচালিত হয়।

সম্মেলন তথ্য সমন্বয়

দ্রষ্টব্যঃ আসলে, একটি সম্মেলনে কলড মিশ্রিত করার জন্য অংশগ্রহণকারী শব্দটি ব্যবহৃত হয়। এটি প্রথমে এপিআই-র জন্য কিছু সমস্যার দিকে পরিচালিত করতে পারে এবং ভবিষ্যতে এটি সংশোধন করা উচিত

লক্ষ্য হল প্রদর্শিত ভিডিওর মেটাডেটা সম্পর্কে সকল অংশগ্রহণকারীদের অবহিত করা। এর অর্থ হল সম্মেলনে অংশগ্রহণকারী কে এবং ভিডিওটি কোথায় অবস্থিত।

যদি কোনও অংশগ্রহণকারী নিজেই একটি সম্মেলন হয়, তার ইনকামিং লেআউট তথ্য অন্য অংশগ্রহণকারীদের কাছে প্রেরণের সময় সংযুক্ত করা উচিত। লেআউট তথ্য একটি সম্মেলনে ফেরত পাঠানোর সময় সংযুক্ত করা উচিত নয়।

লেআউট তথ্য

লেআউটটি ক্লায়েন্টদের জন্য একটি ভেক্টরম্যাপ স্ট্রিংস্ট্রিং হিসাবে এবং নিম্নলিখিত বিন্যাসে একটি ভেক্টর সহ অভ্যন্তরীণভাবে সংরক্ষণ করা হয়ঃ

Layout = {
    {
        "uri": "participant", "x":"0", "y":"0", "w": "0", "h": "0", "isModerator": "true"
    },
    {
        "uri": "participant1", "x":"0", "y":"0", "w": "0", "h": "0", "isModerator": "false"
    }
    (...)
}

সম্ভাব্য চাবি হলঃ

  • uri = অ্যাকাউন্টের uri

  • ডিভাইস = ডিভাইসের আইডি

  • মিডিয়া = মিডিয়া আইডি

  • active = যদি অংশগ্রহণকারী সক্রিয় হয়

  • x = ভিডিওতে অবস্থান (x)

  • y = ভিডিওতে অবস্থান (y)

  • w = ভিডিওতে আকার (প্রস্থ)

  • h = ভিডিওতে আকার (উচ্চতা)

  • videoMuted = ভিডিওটি যদি নিঃশব্দ থাকে

  • audioLocalMuted = যদি অডিওটি স্থানীয়ভাবে নিঃশব্দ হয়

  • audioModeratorMuted = যদি অডিওটি মডারেটরদের দ্বারা নিঃশব্দ করা হয়

  • isModerator = যদি এটি একটি moderator হয়

  • হাত বাড়ানো = হাত বাড়ানো হলে

  • voiceActivity = যদি স্ট্রিমটিতে ভয়েস অ্যাক্টিভিটি থাকে

  • রেকর্ডিং = যদি সমকক্ষ সম্মেলন রেকর্ড করছে

নতুন এপিআই

একটি নতুন পদ্ধতি (কলম্যানেজারে) এবং একটি নতুন সংকেত যথাক্রমে বর্তমান সম্মেলন তথ্য এবং আপডেট পেতে উপলব্ধঃ

VectorMapStringString getConferenceInfos(const std::string& confId);

void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);

কনফারেন্স অবজেক্ট (যা শুধুমাত্র যদি আমরা কলগুলি মিশ্রিত করি, এর অর্থ আমরা মাস্টার) প্রতিটি কল অবজেক্টের লেআউট ইনফোসের ভিত্তিতে পুরো সম্মেলনের তথ্য পরিচালনা করে। getConferenceInfos সরাসরি এই অবজেক্ট থেকে তথ্য সংগ্রহ করবে।

সুতরাং, প্রতিটি Call অবজেক্টের এখন একটি লেআউট ইনফো রয়েছে এবং যদি আপডেট করা হয়, তাহলে Conference অবজেক্টকে তার তথ্য আপডেট করতে বলুন।

সম্মেলনের মাস্টার তার তথ্য SIP চ্যানেলের মাধ্যমে নিম্নলিখিত MIME টাইপ সহ একটি বার্তা হিসাবে পাঠায়ঃ প্রয়োগ/confInfo+json

সুতরাং, যদি কোন কল কিছু confInfo পায়, আমরা জানি যে এই কল একটি সম্মেলনের সদস্য।

সংক্ষেপে, Call প্রাপ্ত বিন্যাস পরিচালনা করে, Conference-managed sent layouts।

সম্মেলনের অবস্থা পরিবর্তন করা

সম্মেলনের অবস্থা পরিবর্তন করতে, অংশগ্রহণকারীদের এমন আদেশ পাঠাতে হবে যা হোস্ট পরিচালনা করবে।

প্রোটোকলের নিম্নলিখিত প্রয়োজনীয়তা রয়েছেঃ

এটি একাধিক স্তরের অর্ডার পরিচালনা করতে হবে। আসলে একটি সম্মেলনের জন্য একজন অংশগ্রহণকারীকে নির্ধারণ করতে 3 স্তর রয়েছেঃ

  • অংশগ্রহণকারীর পরিচয় যে অ্যাকাউন্ট

  • ডিভাইস, কারণ প্রতিটি অ্যাকাউন্ট একাধিক ডিভাইসের মাধ্যমে যোগ দিতে পারে

  • মিডিয়া, কারণ ডিভাইস দ্বারা একাধিক ভিডিও থাকতে পারে (যেমন 1 ক্যামেরা এবং 1 স্ক্রিন শেয়ারিং)

ব্যান্ডউইথ সংরক্ষণের জন্য, ক্লায়েন্টদের একবারে একাধিক অর্ডার পাঠাতে সক্ষম হওয়া উচিত।

সাধারণ পদক্ষেপ

একটি লেআউট পরিবর্তন করতে, মডারেটর একটি দরকারী লোড পাঠাতে পারেন "অ্যাপ্লিকেশন / কনফোর্ডার + json" টাইপ হিসাবেঃ যেখানে ** 0** একটি গ্রিড, ** 1** একটি ব্যবহারকারী বড়, অন্যরা ছোট, ** 2** একটি বড়

অ্যাকাউন্টের ক্রিয়াকলাপ

তবে এখন পর্যন্ত কোন পদক্ষেপ সমর্থিত নেই, ভবিষ্যতে মোডারেটরঃ একটি মোডারেটর পরিবর্তন করার জন্য সত্য/মিথ্যা ব্যবস্থা নেওয়া উচিত।

ডিভাইসের ক্রিয়াকলাপ

  • hangup: true কনফারেন্সের ডিভাইসটি হ্যাং আপ করতে (শুধুমাত্র মডারেটর)

  • raisehand: true/false raise hand এর অবস্থা পরিবর্তন করতে পারে। শুধুমাত্র ডিভাইস নিজেই করতে পারে, অন্যথায় বাদ দেওয়া হয়।

গণমাধ্যমের কর্মকাণ্ড

  • muteAudio শুধুমাত্র মডারেটরদের দ্বারা অংশগ্রহণকারীর অডিও নিঃশব্দ করা সম্ভব

  • muteVideo এখনো সমর্থিত নয়।

  • active মিডিয়াকে সক্রিয় হিসেবে চিহ্নিত করতে।

  • ভয়েসঅ্যাক্টিভিটি মিডিয়া স্ট্রিমের ভয়েসঅ্যাক্টিভিটির অবস্থা নির্দেশ করতে (শুধুমাত্র অডিওর জন্য প্রাসঙ্গিক)

উদাহরণ

So, the application/confOrder+json will contain:

{
    "989587609427420" : {
        "moderator": true, /* false  */
        "devices": {
            "40940943604396R64363": {
                "hangup": true,
                "raisehand": true, /* false */
                "media":{
                    "3532532662432" : {
                        "muteAudio": true, /* false */
                        "muteVideo": true, /* false */
                        "active": true, /* false */
                        "voiceActivity": true /* false */
                    }
                }
            }
        }
    },
    "layout": 0, /* 1, 2 */
}

দ্রষ্টব্যঃ মিডিয়া টাইপ কনফারেন্সের তথ্যে অন্তর্ভুক্ত করা উচিত এবং ক্লায়েন্টের জন্য প্রদর্শন উন্নত করতে ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ, স্ক্রিন শেয়ারিংটি ক্রপ করবেন না)

মডারেটরদের নিয়ন্ত্রণ

আসলে তিনটি সম্ভাবনা আছেঃ

  • পরিবর্তন অ্যাকাউন্টের কনফিগারেশন মডারেটরদের একটি তালিকা যোগ করার জন্য ( config.yml (defaultModerators ডিফল্ট মডারেটরদের একটি তালিকা থাকতে পারে)

  • যদি localModeratorsEnabled সত্য হয়, তাহলে ডিভাইসের সমস্ত অ্যাকাউন্ট মডারেটর হবে

  • যদি allModeratorsEnabled সত্য হয়, তাহলে সম্মেলনে যে কেউ একজন মডারেটর হবেন

ভবিষ্যৎ

  • আরও নিয়ন্ত্রণের জন্য আলাদা স্ট্রিম?

নোট/মন্তব্য

আমি মনে করি এটা ভাল যদি আমরা একটি "সংস্করণ" ক্ষেত্র আছে. পুরোনো সংস্করণ যদি এই ক্ষেত্রটি অনুপস্থিত হয় স্বীকৃত হবে.