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
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ılabilirmuteVideo
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ırEğ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.