91.64K

Интеграция NetVideo SDK в Web Domination Client

1.

Интеграция NetVideo SDK
В Domination Client

2.

Что узнаем?
• Какие проблемы стояли И как с ними справились
• Какие попытки принимались И почему пришли к тому что есть
• Какие возможности появились И зачем это всё

3.

С чего всё началось

4.

Пакет отображения видео (wsv) содержал в себе
слишком много сторонних ответственностей
• Обеспечение и настройка транспорта (ws-подключения)
• Формирование и отправка команд видеосерверу
• Обеспечение своевременной отрисовки кадров в случае с архивом
• Сложность внедрения поддержки протокола NetVideo

5.

Как поступили?
• Создали пакет netvideo-sdk
• Пакет netvideo-sdk наделили ответственностями по:
+ обеспечению транспортов (подключения к видеосерверам)
+ поддержке работы с 2-мя протоколами (WSMP и NetVideo)
+ слежкой за своевременной отдачей кадров на отрисовку в режиме архива
• Из пакета wsv удалили весь код, НЕ отвечающий за отрисовку fMP4
• В пакет wsv добавили demuxer, позволяющий определять признаки
видео-сегмента (кодек и isKey) в режиме потока, без необходимости
накапливать кадры

6.

Какие проблемы оставались?
Каждое окно создавало свои объекты sdk, это влекло за собой следующие
неприятности:
• Каждый объект sdk требовал под собой транспорт (tpc/ws-соединение, в
зависимости от протокола), это приводило к дублированию трафика.
• Нарушение единой ответственности, что усложняет дальнейшее расширение
кодовой базы, усложняет процессы отладки, приводит к неожиданному
поведению.

7.

Работники NetVideo SDK
Познакомимся с нашими сотрудниками поближе
Protocol
Transport
Обеспечивать
подключение к
видеосерверу
Обеспечивать
взаимодействие с
видеосервером по
определённому
протоколу
(WSMP / NetVideo)
RealtimePlayer
Обеспечивать
realtime-поток
данных
ArchivePlayer
ArchiveSettings
Обеспечивать
archive-поток
данных
Обеспечивать
контроль над
архивом
Sdk
Обеспечивать команды
NetVideo SDK

8.

Отношения в коллективе
1 Transport : 1 Protocol
Protocol
Transport
Обеспечивать
подключение к
видеосерверу
Обеспечивать
взаимодействие с
видеосервером по
определённому
протоколу
(WSMP / NetVideo)
Protocol
Обеспечивать
взаимодействие с
видеосервером по
определённому
протоколу
(WSMP / NetVideo)

9.

Отношения в коллективе
1 Protocol : 1 RealtimePlayer
RealtimePlayer
Обеспечивать
realtime-поток
данных
1 Protocol : 1 SDK
ArchivePlayer
Protocol
Обеспечивать
взаимодействие с
видеосервером по
определённому
протоколу
(WSMP / NetVideo)
Обеспечивать
archive-поток
данных
Sdk
Обеспечивать команды
NetVideo SDK

10.

Отношения в коллективе
1 Protocol : 1 ArchivePlayer
RealtimePlayer
Обеспечивать
realtime-поток
данных
ArchivePlayer
Protocol
Обеспечивать
взаимодействие с
видеосервером по
определённому
протоколу
(WSMP / NetVideo)
Обеспечивать
archive-поток
данных
Sdk
Обеспечивать команды
NetVideo SDK

11.

Отношения в коллективе
ArchivePlayer
1 ArchiveSettings : N ArchivePlayer
Обеспечивать
archive-поток
данных
ArchivePlayer
Обеспечивать
archive-поток
данных
ArchiveSettings
Обеспечивать
контроль над
архивом
ArchivePlayer
Обеспечивать
archive-поток
данных

12.

Расточительство и
неэффективный менеджмент
Представим, что наше приложение - это компания,
окна нашего приложения
— отделы компании, а объекты SDK — сотрудники
Окно 1
Мне нужен react-разработчик
видеопоток с 20 канала со 130
сервера
Я найму его сам
самостоятельно создам
соединение к 130 серверу
Я сам скажу что ему делать
сам отправлю команду на
получение видео по 20-му
каналу
Я самостоятельно создам
соединение к 130 серверу
Я сам отправлю команду на
получение видео по 20-му
каналу
Я самостоятельно создам
Я сам отправлю команду на
Окно 2: «А чем я хуже?»
Мне нужен
видеопоток с 20 канала со 130
сервера
Окно 3: «А чем я хуже?»
Мне нужен

13.

Расточительство и
неэффективный менеджмент
Окно 1
Окно 2
Окно 3
Хочешь сделать хорошо
— сделай это сам
Хочешь сделать хорошо
— сделай это сам
Хочешь сделать хорошо
— сделай это сам
Окно 4
Окно 5
Окно 6
Хочешь сделать хорошо
— сделай это сам
Хочешь сделать хорошо
— сделай это сам
Хочешь сделать хорошо
— сделай это сам
Разработчик приложения
Где эффективность, козлы?
Вам нужен координатор!

14.

Новый отдел агент
Окно 1
Окно 2
Ок
Без Б
Общий агент
Общайтесь со мной по
почте MessagePort,
как со мной общаться вы
знаете — присылайте
требования, отпишусь
чё да как
Окно 3
Окно 4
Хорошо
Хочу видео

15.

Новый отдел агент
Окно 1
Окно 2
А дай SDK
Мне нужно 144 видео
потока
Общий агент
Я сделаю что захотите
Окно 3
Окно 4
А дай архив
Мне то же, что и 3-му,
ещё и аудио,
ещё и SDK как у 1-го
Но как?....

16.

Попытка 1. Графы
Общий агент
— У меня на входе список требований, я могу создавать объекты SDK и
строить из них граф.
Хочу видео
с канала 1
с сервера 1
Добавлю
требование
в граф
— Окей, вроде справился
Создам Transport
к серверу 1,
добавлю его в граф
Создам Protocol
для RealtimePlayer,
добавлю его в граф
Создам
RealtimePlayer,
добавлю его в граф

17.

Попытка 1. Графы
Окно 2
— Хочу видео с канала 2 с сервера 1
Общий агент
— Меня вроде уже просили видео с сервера 1, посмотрю в графе.
Хочу видео
с канала 2
с сервера 1
Найду в графе
RealtimePlayer
для сервера 1
Дам команду на подписку
на видео с канала 2
Найду в графе Protocol
для сервера 1
Найду в графе Transport
для сервера 1
Добавлю требование
в граф

18.

Попытка 1. Графы
Окно 2
— Слушай, помнишь я просил тебя видеопоток? Короче, уже не надо
Общий агент
— Хорошо, я отрублю видеопоток
Найду то
самое
требование
от окна 2
Найду в графе
RealtimePlayer,
пошлю
команду
отписаться от
канала 2
Посмотрю, есть ли в графе
зависимости у этого
RealtimePlayer,
если нет - удалю его
Найду в графе
Protocol, на который
был завязан
RealtimePlayer
Посмотрю есть ли у этого
протокола ещё
зависимости в графе,
и если нет, удалю его

19.

Попытка 2. Контроль причин
Общий агент
— Мне сложно работать с графом, а это я ещё разрыв
соединения не обрабатывал... К тому же граф должен быть не
только направленным, а ещё и с разными типами рёбер.
Попробую поставить во главу угла причину существования
того или иного объекта:
Пусть каждый объект будет связан с некоторым множеством
причин своего существования, и когда причин не останется
— он удалит себя.

20.

Попытка 2. Контроль причин
Окно 1
— Хочу видео с канала 1 с сервера 1
Общий агент
Хочу видео
с канала 1
с сервера 1
Создам Transport
к серверу 1,
добавлю ему
причину
— Окей, вроде справился
Создам Protocol
для RealtimePlayer,
добавлю ему
причину
Создам
RealtimePlayer,
добавлю ему
причину
Создам FrameEmitter
по каналу 1,
добавлю ему
причину

21.

Попытка 2. Контроль причин
Окно 2
— Хочу видео с канала 2 с сервера 1
Общий агент
— Меня вроде уже просили видео с сервера 1, поищу по похожим причинам.
Хочу видео
с канала 2
с сервера 1
Найду во
множестве
RealtimePlayer
с похожей
причиной,
добавлю ему
причину
Создам FrameEmitter по
каналу 2, добавлю ему
причину

22.

Попытка 2. Контроль причин
Окно 2
— Слушай, помнишь я просил тебя видеопоток? Короче, уже не надо
Общий агент
— Хорошо, я отрублю видеопоток
Найду ту
самую
причину по
требованию
от окна 2
Найду все
объекты,
имеющие в
множестве
причин данную
причину.
Удалю причину у каждого объекта
связанным с ней.
Затем удалю каждый объект, чьё
множество пустое

23.

Попытка 3. ООП
Общий агент
— Уже лучше, но все-равно неудобно каждый раз перебирать все объекты.
У нас же есть паттерны, попробую Provider/Consumer.

24.

Попытка 2. Контроль причин
Окно 1
— Хочу видео с канала 1 с сервера 1
Общий агент
Хочу видео
с канала 1
с сервера 1
Создам Transport
к серверу 1
Создам VideoProvider
по каналу 1,
добавлю его в
потребители
RealtimePlayer
Создам Protocol
для RealtimePlayer,
добавлю Protocol в
потребители
Transport
Создам
RealtimePlayer,
добавлю его в
потребители Protocol
Создам VideoEnforcer как конечный
обеспечитель требования,
добавлю его в потребители VideoProvider

25.

Попытка 2. Контроль причин
Окно 2
— Хочу видео с канала 2 с сервера 1
Общий агент
— Меня вроде уже просили видео с сервера 1, поищу существующие провайдеры.
Хочу видео
с канала 2
с сервера 1
Найду во существующих провайдерах
RealtimePlayer, у которого Protocol
является потребителем Transport
сервера 1
Создам VideoProvider для канала 2,
добавлю его в потребители
RealtimePlayer
Найду во существующих провайдерах
RealtimePlayer, у которого Protocol
является потребителем Transport
сервера 1
Создам VideoEnforcer для
требования,
добавлю его в потребители
VideoProvider

26.

Попытка 2. Контроль причин
Окно 3
— Слушай, помнишь я просил тебя видеопоток? Короче, уже не надо
Общий агент
— Хорошо, я отрублю видеопоток
VideoEnforcer,
канал 1
VideoProvider,
канал 1
RealtimePlayer,
сервер 1
VideoEnforcer,
канал 2
VideoProvider,
канал 2
Protocol,
сервер 1
Transport,
сервер 1

27.

Какие возможности появились?
• Код внутри окон больше не заботится о подключениях
• Код внутри окон может разом отправлять список требований и
быть уверенным, что результат будет так или иначе
• Глобальный архив между всеми окнами
English     Русский Rules