Konferans protokolü

Bu belge konferans yönetimi için yapacağımız gelişmeleri (audio/video) tanımlamak amacıyla, SIP çağrılarını birleştirerek ve katılımcıların listelendiği, bağımsız olarak susturulabilecekleri veya video düzenlemesi değiştirilen bir görüntü için bir grid görüntüsü sağlayan mevcut uygulamayı geliştirmek amacıyla (tek katılımcı göstermek için)

Definiler

  • Ev sahibi: Ses/video akışlarını diğerleri için karıştıran kullanıcı mıdır

  • Katılımcı: Konferanstaki her kullanıcı, hatta ev sahibi

Sorumluluk dışı bırakma

Bu belge şimdilik sadece ilk adımları açıklar. Bu, katılımcıların kimliği ve tüm katılımcılara gönderilen video karıştırıcıda konumunu ifade eder.

Olabilir düzenler

  • GRID: Her üye aynı yükseklik/genişlik ile gösterilmiştir.

  • ONE_BIG_WITH_SMALL: Bir üye büyütülmüş ve diğer ön görüntü gösterilmiştir

  • ONE_BIG: Bir üye tam ekranı görüntüler

CallManager’da konferans düzenini yönetmek için iki yeni yöntem mevcut:

/**
 * 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);

Uygulama

Uygulama oldukça basit. Her şey conference.cpp (bedişenleri kaynaklara bağlamak için) ve video_mixer.cpp (seçilen düzenlemeyi göstermek için) tarafından yönetilir.

Konferans Bilgilerini Senkronize Etmek

Not: Aslında, katılımcı kelimesi bir konferansta karıştırılmış çağrı için kullanılır. Bu başlangıçta API için bazı sorunlara yol açabilir ve gelecekte düzeltilmelidir

Amaç, gösterilen videonun metadataları ile ilgili tüm katılımcıları bilgilendirmek. Bu, konferansta katılımcının kim olduğunu ve videonun nerede bulunduğunu gösterir.

Bir katılımcı kendiliğinden bir konferanssa, gelen düzenleme bilgisi diğer katılımcılara gönderildiğinde birleştirilmelidir.

Yapılandırma Bilgisi

Layout, müşteriler için ve içsel olarak aşağıdaki biçimdeki bir vektör ile VectorMapStringString olarak depolanır:

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"
    }
    (...)
}

Mümkün anahtarlar:

  • URI = hesap URI

  • Cihaz = Cihazın kimliği

  • medya = medya kimliği

  • aktif = katılımcı aktifse

  • x = videoda konum (x)

  • Y = videoda konum (y)

  • w = video’daki boyut (genişlik)

  • h = videoda boyut (yükseklik)

  • videoMuted = video sessizse

  • audioLocalMuted = ses yerel olarak sessizleştirilmişse

  • audioModeratorMuted = ses moderatörler tarafından sessizleştirildiğinde

  • isModerator = eğer moderatörse

  • el kaldırılmışsa = el kaldırılmışsa

  • ses etkinliği = akışın ses etkinliği varsa

  • kayıt = eğer eşeğen konferansı kaydediyorsa

Yeni API

Yeni bir yöntem (CallManager’de) ve güncel konferans bilgileri ve güncellemeleri almak için yeni bir sinyal mevcuttur:

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

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

Uygulama

ConferenceObyekt (ki sadece çağrıları karıştırırsak var, bu da usta olduğumuzu anlamına gelir) her Call`objektin LayoutInfos’una dayanarak tüm konferans için bilgileri yönetir. getConferenceInfos doğrudan bu nesnenin bilgileri alacaktır.

Bu nedenle, her Call nesne şimdi bir LayoutInfo’ya sahiptir ve güncelleştirildiğinde, Conference nesneye bilgiyi güncellemesini isteyin.

Konferans yöneticisi, SIP kanalı üzerinden bilgiyi MIME tipiyle gönderir: application/confInfo+json

Yani, bir arama bazı bilgi alırsa, bu arama bir konferans üyesi olduğunu biliyoruz.

Kısacası, Call gelen düzenleri yönetir, Conference-managed gönderilen düzenleri yönetir.

Konferansın durumunu değiştirmek

Konferansın durumunu değiştirmek için katılımcılar, ev sahibi tarafından yönetilecek emirler göndermelidir.

Protokolün aşağıdaki ihtiyaçları vardır:

Bir konferans için katılımcı tanımlamak için 3 seviyede bulunur:

  • Katılımcının kimliği olan hesap

  • Cihazlar, çünkü her hesap birden fazla cihaze üzerinden bir araya gelebilir

  • Medyalar, çünkü cihazlar tarafından birden fazla video olabilir (örneğin 1 kamera ve 1 ekran paylaşımı)

Band genişliğini tasarruf etmek için müşteriler birden fazla sipariş gönderebilmelidir.

Genel eylemler

Bir düzenlemeyi değiştirmek için moderatör “application/confOrder+json” ile bir payload gönderebilir: burada 0 bir şebeke, 1 büyük bir kullanıcı, diğerleri küçük bir kullanıcı, 2 büyük bir kullanıcı

Hesap eylemleri

Ancak şimdilik desteklenen bir eylem yok, gelecekte moderator: true/false ` bir moderatörü değiştirmek için ele alınmalıdır.

Cihazın eylemleri

  • hangup: true konferansın bir cihazını asmak için (sadece moderatörler)

  • raisehand: true/false kaldırma elinin durumunu değiştirmek için.

Medyanın eylemleri

  • muteAudio sadece moderatörler tarafından katılımcının sesini susturmak için yapılabilir

  • muteVideo henüz desteklenmiyor.

  • active medya etkin olarak işaretlemek için.

  • voiceActivity bir medya akışının ses etkinliği durumunu belirtmek için (sadece ses için geçerlidir)

Örnek

Bu nedenle başvuru/konfor + json içerir:

{
    "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,
}

Not: medya türü konferans bilgileri dahil edilmelidir ve müşteri için görüntülemeyi iyileştirmek için kullanılabilir (örneğin ekran paylaşımını kesmeyin)

Kontrol eden moderatörler

Aslında 3 olasılık var:

  • Değişken hesap yapılandırması modyatorların bir listesini eklemek için (config.yml’de (defaultModerators default modyatorların bir listesini içerebilir)

  • localModeratorsEnabled doğruysa, cihazın tüm hesapları moderatör olacaktır

  • Eğer allModeratorsEnabled doğruysa, konferansta bulunan herkes moderatör olacaktır.

Gelecek

  • Daha fazla kontrol için ayrı akışlar mı?

Notlar/Komünyalar

Bu protokol gelecek ihtiyaçlar için gelişir. Bence en iyisi “versiyon” alanı varsa. Bu alan eksikse eski versiyon tanınacaktır.