Similar presentations:
Интеграция 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.
Какие возможности появились?• Код внутри окон больше не заботится о подключениях
• Код внутри окон может разом отправлять список требований и
быть уверенным, что результат будет так или иначе
• Глобальный архив между всеми окнами