회의 프로토콜
이 문서는 컨퍼런스 관리 (오디오/비디오) 에서 우리가 할 진화의 내용을 설명하는 것을 목표로 합니다. 목표는 단순히 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에 대한 몇 가지 문제로 이어질 수 있으며 앞으로 수정되어야합니다.
목표는 모든 참가자에게 렌더링 된 비디오의 메타 데이터에 대해 알리는 것입니다. 이것은 컨퍼런스에서 참가자가 누구인지, 비디오가 어디에 있는지 의미합니다.
참가자가 본인이 회의라면, 다른 참가자에게 전송할 때 들어오는 레이아웃 정보는 통합되어야 합니다. 회의에 다시 전송할 때 레이아웃 정보는 통합되지 않습니다.
레이아웃 정보
레이아웃은 클라이언트 및 내부적으로 다음과 같은 형식의 벡터
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이 될 것입니다
미래
더 많은 통제를 허용하기 위해 별도의 스트림?
참고/평론
프로토콜은 미래의 필요에 따라 진화할 가능성이 높습니다. 저는 우리가 “판” 필드를 가지고 있다면 가장 좋다고 생각합니다. 이 필드가 빠진 경우 이전 버전이 인식될 것입니다.