Nghị định thư hội nghị

Tài liệu này nhằm mô tả những tiến bộ chúng ta sẽ thực hiện trong việc quản lý hội nghị (audio/video). Mục tiêu là cải thiện việc thực hiện hiện hiện tại mà chỉ đơn giản là kết hợp các cuộc gọi SIP và cung cấp một khung cảnh lưới, để xem nơi người tham gia được liệt kê, có thể được câm độc lập, hoặc bố trí video thay đổi (để chỉ hiển thị một người tham gia)

Các định nghĩa

  • Chủ: Là người dùng trộn các dòng âm thanh / video cho những người khác

  • Người tham gia: Mỗi người dùng trong hội nghị, ngay cả người chủ nhà

Chứng chỉ trách nhiệm

Tài liệu này chỉ mô tả các bước đầu tiên cho đến nay. Điều này có nghĩa là xác định các đối tác và vị trí trong máy trộn video được gửi cho tất cả các đối tác.

Các bố cục có thể

  • GRID: Mỗi thành viên được hiển thị với chiều cao/luồng tương tự

  • ONE_BIG_WITH_SMALL: Một thành viên được phóng to và xem trước người khác được hiển thị

  • ONE_BIG: Một thành viên chụp màn hình đầy đủ

Hai phương pháp mới có sẵn để quản lý Layout hội nghị trong 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);

Thực hiện

Việc thực hiện khá đơn giản. Mọi thứ được quản lý bởi conference.cpp (để liên kết người tham gia đến nguồn) và video_mixer.cpp (để render bố cục mong muốn).

Thông tin hội nghị đồng bộ

Lưu ý: Thực tế, từ tham gia được sử dụng cho callId trộn trong một hội nghị. Điều này có thể dẫn đến một số vấn đề cho API và phải được sửa chữa trong tương lai

Mục tiêu là thông báo cho tất cả các người tham gia về metadata của video được hiển thị. Điều này có nghĩa là người tham gia trong hội nghị là ai và video nằm ở đâu.

Nếu một người tham gia là một hội nghị, thông tin bố trí tiếp theo của nó nên được kết hợp khi được gửi đến những người tham gia khác.

Thông tin bố cục

Layout được lưu trữ như một VectorMapStringString cho khách hàng và bên trong với một vector với định dạng sau:

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

Các chìa khóa có thể là:

  • uri = uri của tài khoản

  • thiết bị = ID của thiết bị

  • media = ID của media

  • active = nếu người tham gia là tích cực

  • x = vị trí (x) trong video

  • y = vị trí (y) trong video

  • w = kích thước (thường độ) trong video

  • h = kích thước (bức độ) trong video

  • video Muted = nếu video bị câm

  • audioLocalMuted = nếu âm thanh được tắt ở địa phương

  • audioModeratorMuted = nếu âm thanh được các người điều hành làm câm

  • isModerator = nếu đó là một người điều hành

  • tay nâng = nếu tay nâng

  • voiceActivity = nếu dòng có hoạt động giọng nói

  • ghi âm = nếu người đồng nghiệp đang ghi âm hội nghị

API mới

Một phương pháp mới (trong CallManager) và một tín hiệu mới để nhận được thông tin và cập nhật hội nghị hiện tại tương ứng có sẵn:

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

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

Thực hiện

Conference Object (chỉ tồn tại nếu chúng ta trộn các cuộc gọi, điều này có nghĩa là chúng ta là chủ nhân) quản lý thông tin cho toàn bộ hội nghị, dựa trên LayoutInfos của mỗi đối tượng Call. getConferenceInfos sẽ lấy thông tin trực tiếp từ đối tượng này.

Vì vậy, mỗi đối tượng Call bây giờ có một LayoutInfo và nếu cập nhật, yêu cầu đối tượng Conference cập nhật thông tin của nó.

Chủ hội nghị gửi thông tin của mình qua kênh SIP dưới dạng thông điệp với loại MIME sau đây: application/confInfo+json

Vì vậy, nếu một cuộc gọi nhận được một số thông tin thông tin, chúng tôi biết rằng cuộc gọi này là một thành viên của một hội nghị.

Để tóm tắt, Call quản lý bố cục nhận được, Conference-managed gửi bố cục.

Thay đổi tình trạng của hội nghị

Để thay đổi tình trạng của hội nghị, người tham gia cần gửi lệnh mà chủ nhà sẽ xử lý.

Các quy định này có những nhu cầu sau:

Nó nên xử lý các đơn đặt hàng ở nhiều cấp độ.

  • Tài khoản là danh tính của người tham gia

  • Các thiết bị, bởi vì mỗi tài khoản có thể tham gia thông qua nhiều thiết bị

  • Truyền thông, vì có thể có nhiều video theo thiết bị (ví dụ: 1 camera và 1 chia sẻ màn hình)

Để tiết kiệm băng thông, khách hàng nên có thể gửi nhiều đơn đặt hàng cùng một lúc.

Các hành động chung

Để thay đổi bố cục, người điều hành có thể gửi tải trọng hữu ích với "application/confOrder+json" như kiểu: nơi 0 là một lưới, 1 là một người dùng trong lớn, những người khác trong nhỏ, 2 là một trong lớn

Hành động của tài khoản

Hiện tại, không có hành động được hỗ trợ, tuy nhiên, trong tương lai moderator: đúng / sai nên được xử lý để thay đổi một người điều hành.

Hành động của thiết bị

  • hangup: true để treo một thiết bị từ hội nghị (chỉ người điều hành)

  • raisehand: true/false để thay đổi tình trạng của tay nâng. Chỉ có thể làm bằng thiết bị, nếu không bị bỏ.

Hành động của phương tiện truyền thông

  • muteAudio chỉ có thể được thực hiện bởi các nhà điều tra để câm âm thanh của một người tham gia

  • muteVideo chưa được hỗ trợ.

  • active để đánh dấu các phương tiện truyền thông như là hoạt động.

  • voiceActivity để chỉ ra tình trạng hoạt động giọng nói của một dòng truyền thông (chỉ có liên quan đến âm thanh)

Ví dụ:

Vì vậy, ứng dụng/confOrder+json sẽ chứa:

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

Lưu ý: loại phương tiện truyền thông nên được bao gồm trong thông tin hội nghị và có thể được sử dụng cho khách hàng để cải thiện hiển thị (ví dụ: không cắt chia sẻ màn hình)

Kiểm soát các người điều hành

Thực tế có 3 khả năng:

  • Config của tài khoản thay đổi để thêm một danh sách các người điều hành (Trong config.yml (defaultModerators có thể chứa một danh sách các người điều hành mặc định)

  • Nếu localModeratorsEnabled là đúng, tất cả các tài khoản của thiết bị sẽ là người điều chỉnh

  • Nếu allModeratorsEnabled là đúng, bất cứ ai trong hội nghị sẽ là người điều hành

Tương lai

  • Các dòng chảy riêng biệt để cho phép kiểm soát nhiều hơn?

Các ghi chú/Sau ý

Có thể giao thức sẽ phát triển cho nhu cầu trong tương lai. Tôi tin rằng tốt nhất là chúng ta có một trường "được phiên bản". phiên bản cũ sẽ được nhận ra nếu trường này bị thiếu.