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 dengan format berikut:

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 peserta

  • muteVideo 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 moderator

  • Jika 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.