회의 프로토콜

이 문서는 컨퍼런스 관리 (오디오/비디오) 에서 우리가 할 진화의 내용을 설명하는 것을 목표로 합니다. 목표는 단순히 SIP 호출을 통합하고 그릴뷰를 제공하는 현재의 구현을 개선하는 것입니다. 참가자가 나열되어있는, 독립적으로 침묵할 수 있는, 또는 비디오 레이아웃이 변경되는 (한 참가자를만 표시하기 위해)

정의

  • 호스트: 다른 사용자들을 위해 오디오/비디오 스트림을 혼합하는 사용자입니까?

  • 참가자: 회의에 참석한 모든 사용자, 심지어 호스트도

면책

이 문서에서는 현재 첫 단계만을 설명하고 있습니다. 이것은 모든 참가자에게 전송된 비디오 믹서에서 참가자 및 위치를 식별하는 것을 의미합니다.

가능한 레이아웃

  • 그리드: 각 멤버가 같은 높/폭으로 표시됩니다.

  • ONE_BIG_WITH_SMALL: 한 멤버가 확대되고 다른 멤버가 미리보기 표시됩니다

  • ONE_BIG: 한 멤버가 전체 화면을 렌더링합니다

콜 매니저에서 컨퍼런스 레이아웃을 관리하기 위해 두 가지 새로운 방법이 있습니다.

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

구현은 매우 간단합니다. 모든 것이 conference.cpp (참여자와 소스를 연결하기 위해) 및 video_mixer.cpp (찾아가는 레이아웃을 렌더링하기 위해) 에서 관리됩니다.

시인칭 컨퍼런스 정보

참고: 실제로, 참가자라는 단어는 회의에서 혼합된 호출을 위해 사용됩니다. 이것은 처음에는 API에 대한 몇 가지 문제로 이어질 수 있으며 앞으로 수정되어야합니다.

목표는 모든 참가자에게 렌더링 된 비디오의 메타 데이터에 대해 알리는 것입니다. 이것은 컨퍼런스에서 참가자가 누구인지, 비디오가 어디에 있는지 의미합니다.

참가자가 본인이 회의라면, 다른 참가자에게 전송할 때 들어오는 레이아웃 정보는 통합되어야 합니다. 회의에 다시 전송할 때 레이아웃 정보는 통합되지 않습니다.

레이아웃 정보

레이아웃은 클라이언트 및 내부적으로 다음과 같은 형식의 벡터로 VectorMapStringString로 저장됩니다.

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

가능한 키는:

  • 우리 = 계좌의 우리

  • 장치 = 장치의 아이디

  • 미디어 = 미디어의 아이디

  • 활동 = 참가자가 활동하는 경우

  • x = 비디오에서 위치 (x)

  • y = 비디오에서 위치 (y)

  • w = 비디오의 크기가 (폭)

  • h = 비디오의 크기와 높이가

  • videoMuted = 비디오가 침묵하면

  • audioLocalMuted = 오디오가 로컬로 마우트되면

  • audioModeratorMuted = 오디오가 중장자들에 의해 침묵된다면

  • isModerator = 만약 그것이 moderator이라면

  • 손높여 = 손높여

  • voiceActivity = 스트림이 음성 활동을 가지고 있다면

  • 녹음 = 동료가 컨퍼런스를 녹음하는 경우

새로운 API

새로운 방법 (콜 매니저) 와 새로운 신호는 각각 최신 컨퍼런스 정보와 업데이트를 얻을 수 있습니다.

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

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

컨퍼런스 오브젝트 (우리가 호출을 혼합하면만 존재한다는 의미, 우리는 마스터) Call` 오브젝트의 레이아웃 인포를 기반으로 전체 컨퍼런스 정보들을 관리합니다. getConferenceInfos는 이 오브젝트에서 직접 정보를 검색합니다.

따라서, 모든 Call 객체는 이제 레이아웃 인포를 가지고 있으며 업데이트되면 Conference 객체를 정보를 업데이트하도록 요청합니다.

회의 주인은 SIP 채널을 통해 다음과 같은 MIME 타입의 메시지를 보내: application/confInfo+json

만약 전화가 정보들을 받으면, 우리는 이 전화가 회의의 일원이라는 것을 알고 있습니다.

요약적으로, 는 수신된 레이아웃을 관리하고, 컨퍼런스는 전송된 레이아웃을 관리한다.

회의의 상태를 변화시키는 것

회의 상태를 바꾸기 위해서는 참가자들이 주최자가 처리할 명령을 보내야 합니다.

이 프로토콜은 다음과 같은 필요성을 갖는다.

그것은 여러 레벨의 주문을 처리해야 합니다. 실제로 회의에 참가자를 정의하는 3 레벨입니다.

  • 참가자의 신원을 나타내는 계좌

  • 기기, 왜냐하면 각 계정이 여러 기기를 통해 연결될 수 있기 때문입니다

  • 미디어, 왜냐하면 장치에 따라 여러 비디오가 있을 수 있기 때문입니다 (예를 들어 1 카메라와 1 화면 공유)

대역폭을 절약하기 위해서는 클라이언트가 동시에 여러 주문을 보낼 수 있어야 합니다.

일반적 행동

레이아웃을 변경하려면, 모더니터는 “application/confOrder+json”를 타입으로 쓸 수 있습니다. 0는 그리드, 1는 큰 사용자, 다른 사람들은 작은 사용자, 2는 큰 사용자입니다.

계좌의 행위

현재는 지원된 조치도 없습니다. 하지만 앞으로 중계자: true/false `는 중계자를 변경하기 위해 처리되어야 합니다.

장치의 동작

  • hangup: true 회의에서 기기를 기 (도레이터만)

  • raisehand: true/false raise 손의 상태를 변경하기 위해서.

언론의 행위

  • muteAudio 참가자의 오디오를 침묵시키는 것은 오직 조정자만이 할 수 있습니다

  • muteVideo 아직 지원되지 않았습니다.

  • active 미디어가 활동적이라고 표시하기 위해서

  • 소음 활동 미디어 스트림의 음성 활동 상태를 표시하기 (소음에만 관련)

예제

So, the application/confOrder+json will contain:

{
    "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 */
}

참고: 미디어의 종류는 회의 정보에 포함되어야 하며 클라이언트가 디스플레이를 개선하기 위해 사용할 수 있습니다 (예를 들어 스크린 공유를 할 필요가 없습니다)

통제하는 모더레이터

사실 3가지 방법이 있습니다.

  • 변모 계정 구성에서 모더니터 목록을 추가하는 방법 (konfig.yml (defaultModerators) 에서 기본 모더니터 목록이 포함될 수 있습니다)

  • localModeratorsEnabled가 사실이라면 장치의 모든 계정은

  • allModeratorsEnabled가 사실이라면 회의에 참석한 모든 사람이 moderator이 될 것입니다

미래

  • 더 많은 통제를 허용하기 위해 별도의 스트림?

참고/평론

프로토콜은 미래의 필요에 따라 진화할 가능성이 높습니다. 저는 우리가 “판” 필드를 가지고 있다면 가장 좋다고 생각합니다. 이 필드가 빠진 경우 이전 버전이 인식될 것입니다.