# Video — Tech review — VID-204 JIRA: https://devjira.skyeng.ru/browse/VID-204 ## 1/4 — Блиц опрос про бизнес - мне четко понятен Definition of done - мне четко понятна корневая бизнес-задача - мне четко понятно почему это важней, чем другие доступные задачи - я согласен решать бизнес-задачу именно так <!-- Удалить кого не было на ревью --> Состав (галочка означает согласие со всеми утверждениями выше): - [ ] Кирилл Роговой - [ ] Илья Левин - [ ] Антон Тейхриб - [ ] Юрий Юрин ## 2/4 — Конечный результат **Front end:** 1. Единый API для групповых звонков и 1-на-1 2. Поддержка simulcast и выбора получаемого качества 3. API для полного mute/unmute партнеров 4. Дополнительная информация в tech-summary **Back end:** 1. У /get-video-config есть параметр, который отвечает за то, какой тип комнаты нужен - 1-на-1: максимум 2 участника, без simulcast, интеллектуальный выбор сервера, открыты все кодеки - групповой: много участников, simulcast, тупой выбор сервера, force vp8 **Записи:** 1. Конвертировать аудио по-умолчанию, совмещая все дорожки в один mp3 3. Видео пока не конвертируем, потому что сложно ## 3/4 — Шаги достижения ### Milestone 1 — video-backend Добавить фичи групповой связи. Если group=1, то: 1. publishers должен быть не 2, а 10 2. единственный доступный кодек — vp8 (потому что есть у всех, а в группе договориться о лучшем кодеке — сложно) 3. включен simulcast 4. выбирается специальный сервер с флагом group=true 5. признак, что комната групповая должен сохраняться в БД Использовать JanusGroupVideoConfigBuilder за основу. ### Milestone 1.1 — перевести фронт на использование серверного эндпоинта Научить текущий клиент в group-video ходить на правильный серверный эндпоинт, не меняя остальную логику ### Milestone 2.1 — видео-либа на фронте План: _для выяснения точных отличий групповой либы от 1-на-1, диффнуть две папки_ - [x] Добавить групповые звонки в storybook используя текущий group-video, убедиться, что все ок - [x] Добавить в IVideoClient и IVideoClientEvent все необходимые методы и события для поддержки групповых звонков. В конкретных имплементациях вставить "пустышки". Убедиться, что звонки 1-на-1 в storybook все еще работают. - У событий PartnerJoined, PartnerLeft, PartnerStreamAttached должны появиться поля publisherId - Руководствоваться диффом - [x] Реализовать новые методы и события в clients/janus. Убедиться, что звонки 1-на-1 в storybook работают. - [x] Добавить множественных партнеров в video-state - [ ] Добавить поддержку групповых в SkyVideoService - partnerEvents и partnerState адаптировать под групповые звонки: e.g. `partnersState$: State<{ partnerId: number, state$: State<... тоже самое что сейчас partnerState ...> }>` - Перевести storybook со звонками 1-на-1 и убедиться, что они работают - [ ] Перевести групповые звонки в storybook с group-video на video - Убедиться, что все работает как раньше - Дропнуть group-video - [ ] Перевести групповые звонки в vimbox и убедиться, что все работает - [ ] JanusClientBuilder? ### Milestone 2.2 — mute/unmute Добавить возможность отписываться и подписываться заново на потоки клиентов в комнате. Должно прекращать получение от них медиа данных. Дока: https://janus.conf.meetecho.com/docs/videoroom.html 1. Добавить в IVideoClient методы 1. `unsubscribeFromPublisher(publisherId: number): void` 2. `subscribeToPublisher(publisherId: number): void` — ведет к IVideoClientEventPartnerStreamAttached 3. Вставить пустышки в остальные клиенты 4. Добавить фичу в storybook для звонков 1-на-1 ### Milestone 2.3 — simulcast (quality selector) 1. Добавить в IJanusVideoClientConfig параметр `simulcast` (false по-умолчанию). Если true и кодек — vp8, врубать simulcast 2. Добавить в IVideoClient метод `setReceivingQuality(publisherId: number, quality: 'high' | 'medium' | 'low')`. Если publisher не simulcast-ит, ничего не делать 3. Добавить фичу в storybook для звонков 1-на-1 ### Milestone 2.4 — tech-summary 1. не трогаем tech-summary для звонков 1-на-1 2. для групповых делаем два события: tech-summary-sender, tech-summary-partner - в отдельном файле: libs/shared/video/src/webrtc-incident-monitor/tech-summary-split.ts - старый переименовываем на `tech-summary-singular.ts` 4. добавить в IJanusVideoClientConfig: `techSummaryType: 'singular' | 'split'` (не опциональный, нужно задавать явно) 5. добавить if в logVideoRoomEventsToServer — startCollectingSingularSummary или startCollectingSplitSummary в зависимости от techSummaryType - событие для split называем `tech-summary-sender` / `tech-summary-partner` и объект помещаем в `techSummarySender` / `techSummaryPartner` в теле лога 7. написать имплементацию для Split версии 8. протестить в storybook **tech-summary-sender** ```typescript= export interface IVideoCallSummarySender { type: 'sender'; // появляется тип userAgent: string; webrtcSupport: boolean; durationMs: number; durationM: number; localStreamReady: boolean; publishedSuccessfully: boolean; slowLinkCount: { toServer: number; }; incidentCount: IIncidentCount; incidentDuration: IIncidentDuration; lastWebrtcReport?: IWebrtcReport; error?: Error; } ``` **tech-summary-partner** ```typescript= export interface IVideoCallSummaryPartner { type: 'partner'; partnerId: number; // у partner есть id durationMs: number; durationM: number; remoteStreamReady: boolean; slowLinkCount: { fromServer: number; }; incidentCount: IIncidentCount; incidentDuration: IIncidentDuration; lastWebrtcReport?: IWebrtcReport; error?: Error; } ``` ### Milestone 3 — конвертация аудио Так как мы конвертируем все аудио, нужно научить конвертор понимать, что запись принадлежит групповому уроку и склеивать все аудио в один канал. ## 4/4 — Блиц опрос про решение - задачу нельзя или нет смысла декомпозировать далее - будущий исполнитель проставил Original Estimate и мы пересмотрим задачу, если превысим его <!-- Удалить кого не было на ревью --> Состав (галочка означает согласие со всеми утверждениями выше): - [ ] Кирилл Роговой - [ ] Илья Левин - [ ] Антон Тейхриб - [ ] Юрий Юрин