Protokol Konferensi
Dokumen ini bertujuan untuk menggambarkan evolusi yang akan kita lakukan untuk mengelola konferensi (audio/video).Tujuan adalah untuk meningkatkan implementasi saat ini yang hanya menggabungkan panggilan SIP dan menyediakan tampilan grid, untuk tampilan di mana peserta terdaftar, dapat dimatikan secara independen, atau tata letak video diubah (untuk menunjukkan hanya satu peserta)
Definisi
Host: Apakah pengguna yang mencampur audio / video untuk yang lain
Peserta: Setiap pengguna di konferensi, bahkan tuan rumah
Pengunduran Tanggung Jawab
Dokumen ini hanya menggambarkan langkah-langkah pertama untuk saat ini. Ini berarti identifikasi peserta dan posisi dalam mixer video dikirim ke semua peserta.
Pembagian yang mungkin
GRID: Setiap anggota ditampilkan dengan ketinggian/luhur yang sama
ONE_BIG_WITH_SMALL: Satu anggota di zoom dan pratinjau lainnya ditampilkan
ONE_BIG: Satu anggota mengambil layar penuh di render
Dua metode baru tersedia untuk mengelola Conference Layout di CallManager:
/**
* 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);
Pelaksanaan
Implementasi cukup sederhana. Semuanya dikelola oleh conference.cpp
(untuk menghubungkan peserta ke sumber) dan video_mixer.cpp
(untuk membuat tata letak yang diinginkan).
Informasi Konferensi Sinkronisasi
Catatan: Sebenarnya, kata peserta digunakan untuk callId dicampur dalam konferensi. Ini dapat menyebabkan pada awalnya beberapa masalah untuk API dan harus diperbaiki di masa depan
Tujuan adalah untuk memberi tahu semua peserta tentang metadata video yang diceritakan. Ini berarti siapa peserta di konferensi dan di mana video tersebut berada.
Jika peserta itu sendiri adalah konferensi, informasi tata letak yang masuk harus digabungkan ketika dikirim ke peserta lain.
Info tata letak
Layout disimpan sebagai VectorMapStringString untuk klien dan secara internal dengan vektor
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"
}
(...)
}
Kunci yang mungkin adalah:
uri = uri akun
perangkat = ID perangkat
media = media id
aktif = jika peserta aktif
x = posisi (x) dalam video
y = posisi (y) dalam video
w = ukuran ( lebar) dalam video
h = ukuran (tinggi) dalam video
video Muted = jika video itu mati
audioLocalMuted = jika audio dimatikan secara lokal
audioModeratorMuted = jika audio dimutasi oleh moderator
isModerator = jika itu adalah moderator
HandRaised = jika tangan ditinggikan
voiceActivity = jika aliran memiliki aktivitas suara
recording = jika peer sedang merekam konferensi
API Baru
Metode baru (di CallManager) dan sinyal baru untuk mendapatkan informasi konferensi dan pembaruan saat ini tersedia:
VectorMapStringString getConferenceInfos(const std::string& confId);
void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);
Pelaksanaan
Conference
Object (yang hanya ada jika kita mencampur panggilan, ini berarti kita adalah master) mengelola informasi untuk seluruh konferensi, berdasarkan LayoutInfos dari setiap objek Call
.
Jadi, setiap Call
objek sekarang memiliki LayoutInfo dan jika diperbarui, minta Conference
objek untuk memperbarui informasi nya.
Master konferensi mengirimkan informasi melalui saluran SIP sebagai pesan dengan jenis MIME berikut: application/confInfo+json
Jadi, jika panggilan menerima beberapa informasi, kita tahu bahwa panggilan ini adalah anggota konferensi.
Untuk menyimpulkan, Call
mengelola tata letak yang diterima, Conference
-managed sent layouts.
Perubahan status konferensi
Untuk mengubah keadaan konferensi, peserta perlu mengirim pesanan yang akan ditangani oleh tuan rumah.
Protokol ini memiliki kebutuhan berikut:
Ini harus menangani pesanan di beberapa tingkat. Sebenarnya untuk konferensi adalah 3 tingkat untuk mendefinisikan peserta:
Akun yang merupakan identitas peserta
Perangkat, karena setiap akun dapat bergabung melalui beberapa perangkat
Media, karena dapat ada beberapa video oleh perangkat (misalnya 1 kamera dan 1 berbagi layar)
Untuk menghemat bandwidth, klien harus dapat mengirim beberapa pesanan sekaligus.
Tindakan umum
Untuk mengubah tata letak, moderator dapat mengirim muatan berguna dengan "aplikasi/confOrder+json" sebagai jenis: di mana 0 adalah grid, 1 adalah satu pengguna dalam besar, yang lain dalam kecil, 2 adalah satu dalam besar
Aksi akun
Untuk saat ini, tidak ada tindakan yang didukung, namun di masa depan moderator: benar/palsu
harus ditangani untuk mengganti moderator.
Aksi perangkat
hangup: true
untuk menggantung perangkat dari konferensi (hanya moderator)raisehand: true/false
untuk mengubah status tangan angkat. Hanya dapat dilakukan oleh perangkat itu sendiri, jika tidak jatuh.
Tindakan media
muteAudio
hanya dapat dilakukan oleh moderator untuk membungkam audio pesertamuteVideo
belum didukung.active
untuk menandai media sebagai aktif.voiceActivity
untuk mengindikasikan status aktivitas suara dari aliran media (hanya relevan untuk audio)
Contoh
Jadi, aplikasi/confOrder+json` akan berisi:
{
"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,
}
Catatan: jenis media harus dimasukkan dalam informasi konferensi dan dapat digunakan untuk klien untuk meningkatkan tampilan (misalnya tidak memotong berbagi layar)
Mengontrol moderator
Sebenarnya ada 3 kemungkinan:
Konfigurasi akun perubahan untuk menambahkan daftar moderator (Di config.yml (
defaultModerators
dapat berisi daftar moderator default)Jika
localModeratorsEnabled
benar, semua akun perangkat akan menjadi moderatorJika
allModeratorsEnabled
benar, siapa pun di konferensi akan menjadi moderator
Masa Depan
Membuat aliran terpisah untuk memungkinkan lebih banyak kontrol?
Catatan/Komentar
mungkin protokol akan berkembang untuk kebutuhan masa depan. saya percaya itu terbaik jika kita memiliki "versi" bidang. versi lama akan dikenali jika bidang ini hilang.