Source:Object
{
name:String;
title:String;
type:Enum[SHOT, CHAT, VIDEO];
}
Объект Template хранит в себе идентификатор шаблона, его заголовок и массив объектов TemplateSource.
Template:Object
{
id;
title:String;
templateSources:Array;
}
Объект TemplateSource описывает собой объект, который должен быть помещен в шаблон. Здесь храниться идентификатор, информация о расположении объекта – x, y координаты. Ширина – width, высота – height. Видимость (true, false) и глубина объекта в контейнере (от -∞ до +∞). Имя источника для объекта и его тип.
TemplateSource:Object
{
id:int;
x:int;
y:int;
width:int;
height:int;
visible:boolean;
depth:int;
source:string;
title:string;
type:Enum[SHOT, CHAT, VIDEO];
}
Объект Layout представляет собой пустую раскладку для шаблонов. В нем храниться идентификатор, название и массив с объектами LayoutGap.
Layout:Object
{
id:int;
title:String;
layoutGaps:Array;
}
Объект LayoutGap представляет собой пустой объект TemplateSource. Этот объект используется только для макетов, на основе которых в редакторе шаблонов можно создавать полноценные шаблоны, просто заполнив источники для каждого пустого LayoutGap.
LayoutGap:Object
{
x:int;
y:int;
width:int;
height:int;
depth:int;
}
5Контроль состояния соединения с сервером
Для корректной работы приложения и предоставления пользователю актуальной информации во время проведения события в режиме реального времени необходимо осуществлять постоянный контроль соединения с сервером, осуществляющему работу с удаленными общими объектами и потоковыми данными.
В приложение может существовать несколько объектов, которым необходимо предоставить подключение к серверу. Поэтому работу всего приложения необходимо устроить таким образом, чтобы реально существовало одно единственное подключение, но оно могло быть предоставлено любому объекту, который его запросит. Для этого был разработан класс ConnectionManager с использованием паттерна проектирования Singleton.
Реализация паттерна проектирования Singleton на языке ActionScript 3.0
Паттерн Singleton [12] (одиночка) разработан для того, чтобы исключить возможность существования более одного единственного экземпляра класса. Это достигается запретом на создание экземпляра класса другими объектами, кроме него самого.
Так как в языке ActionScript отсутствует возможность объявлять конструктор класса приватным, то для реализации паттерна Singleton приходится применять следующую схему:
public class Singleton
{
private static var _instance:Singleton;
private static var _allowInstantination:Boolean = false;
public function Singleton ()
{
if (!_allowInstantination)
{
throw new Error("Error: Instantiation failed!");
}
else
{
//entry point
}
}
public static function getInstance():Singleton
{
if (!_instance)
{
_allowInstantination = true;
_instance = new Singleton ();
_allowInstantination = false;
}
return _instance;
}
Как видно из приведенного кода, для предотвращения вызова конструктора класса Singleton из внешнего объекта используется проверка состояния флага _allowIntsantination. Если функция getInstance() вызывается впервые, то создается экземпляр класса, который сохраняется в приватной статической переменной _instance.
Основные функции ConnectionManager
· Создание и последующий контроль состояния подключения;
· Предоставление текущего соединения другим объектам по запросу;
· Автоматическое восстановление соединения с сервером, в случае если соединение было разорвано;
· Оповещение всех объектов, которые использовали это подключение о том, что оно обновилось, и самим объектам надо получить новое соединение для работы.
5.2.4. Управление удаленными общими объектами
Основное взаимодействие с информацией, хранящейся на сервере, flash приложение осуществляет с помощью удаленных общих объектов. Удаленные общие объекты SharedObject могут изменяться как сервером, так и клиентом (см. пункт 4.3.3). В целях обеспечения безопасности системы, клиентскому приложению запрещено изменять удаленные общие объекты, используя стандартные методы. Это позволит избежать ситуации, когда злоумышленник, каким-то образом модифицировав клиентское приложение, получит возможность вносить изменения в SharedObject, что приведет к обновлению информации на сервере и у других клиентов.
При создании SharedObject на сервере Wowza Media Server можно запретить клиентскому приложению запись в удаленный общий объект. Но в таком случае, если к SharedObject ещё не был подключен ни один клиент, то общий объект не будет создан, и клиент не сможет получить доступ к информации, хранимой в нем. Другими словами SharedObject существует только, когда к нему подключены пользователи. Но при этом клиент не может инициировать создание объекта на сервере. Для решения этой проблемы, перед подключением клиентского приложения к любому удаленному общему объекту, клиент вызывает функцию “prepareSO” и ожидает ответ. В случае успешного ответа клиент подключается к SharedObject. Для реализации такого процесса получения ссылки на удаленный общий объект был написан класс SharedObjectProxy с использованием паттерна проектирования Proxy [12]. Применение данного паттерна позволяет управлять ходом создания удаленного общего объекта, а также скрыть часть интерфейса этого объекта, в частности стандартные методы записи информации.
Во время проектирования системы возникла необходимость в использовании объекта, который выполняет следующие функции:
· Отслеживает состояние уже созданных SharedObjectProxy объектов;
· При попытке инициализации нового объекта, проверяет на возможное существование такого объекта. В случае если объект существует, возвращает ссылку на SharedObjectProxy;
· Поддерживает связь с ConnectionManager объектом. В случае если создается новое соединение, переводит все SharedObject объекты на новое соединение.
Для выполнения этих функций был разработан класс SharedObjectProxyManager, который создан с использованием паттерна Singleton. На изображении ниже приведена схема взаимодействия этого объекта с другими объектами системы.

Изображение 4. Схема управления удаленными общими объектами.
5.2.5. Управление аудио и видео потоками
Для передачи аудио и видео содержимого между клиентским компьютером и сервером в приложении на платформе Adobe Flash необходимо создать объект NetStream [14]. Данный объект представляет собой одностороннее потоковое подключение, что позволяет либо опубликовать поток, либо подписаться на уже опубликованный поток и получать из него данные.
При проведении события в режиме реального времени пользователь системы, имеющий соответствующие права, может принять участие в событии, передавая изображение и звук с камеры, подключенной к компьютеру. В таком случае необходимо, чтобы в видео объекте, который содержит соответствующий источник, отображалось изображение с камеры пользователя, а не поток, который будет возвращаться к клиенту с вещательного сервера. Это позволит снизить количество трафика передаваемого пользователю. Для решения данной задачи необходимо было разработать объект, хранящий пул всех созданных потоков, и имеющий возможность управлять ими.
В итоге была разработана схема управления потоками, которая несколько похожа на схему управления удаленными общими объектами.

Изображение 5. Схема управления аудио и видео потоками.
Данная схема взаимодействия между объектами системы позволяет решать следующие задачи:
· При обновлении подключения с сервером необходимо пересоздать все потоки, чтобы восстановить передачу данных как от сервера клиенту, так и в обратном направлении;
· Контроль количества создаваемых подключений. Если в шаблоне существует несколько видео объектов, которые используют одинаковые источники, то им будет предоставлен уже существующий поток, вместо инициализации дополнительного;
· Отслеживание количества подписчиков на поток. Если видео объект, к которому подключен в качестве источника видео поток, перестает существовать, то видео объект пытается закрыть этот поток. И в случае если этот поток больше нигде не используется, он будет закрыт;
· Управление звуком.
5.3. Разработка зрительского представления
Зрительское представление – это графическое представление объектов из шаблона с подключенными источниками, которые отображает пользователю информацию о происходящем событие. Любой пользователь принимающий участие в событие в качестве зрителя получает полное визуальное отображение события. Пример показан на изображении 7. Если права пользователя позволяют ему писать сообщения в чате, то он может оставлять свои сообщения.

Изображение 6. Интерфейс зрительского представления.
Но при этом для пользователей, которые имеют расширенные права по управлению событием, или являются участниками, зрительское представление имеет дополнительный функционал:
· Управление событием. Сюда входят возможности: начать, приостановить, продолжить и завершить событие. Управление состоянием записи события. Переключение шаблонов;
· Управление титрами для видео объектов;
· Управление правами доступа в чате и удаление сообщений;
· Вещание данных с камеры, подключенной к клиентскому компьютеру, на сервер. Запуск захвата рабочего стола.
5.3.1. Управление событием
При подключении к системе flash приложение проверяет права пользователя на данное событие посредством вызова на сервере функции “getMyUserRole”. В случае если пользователь является редактором события, то для управления событием ему будет предоставлено меню, представленное на изображении 7.

Изображение 7. Интерфейс управления событием, вкладка «Управление».
Управление реализовано через вызовы функций на сервере. Для начала и продолжения события вызывается функция “start”, для приостановки события – функция “pause”, а для завершения события – функция “stop”. Меню также содержит индикатор состояния записи события и кнопку быстрого доступа к редактору шаблонов.
Для выбора шаблонов представлен весь список шаблонов для события. Чтобы переключиться на необходимый шаблон достаточно просто кликнуть мышкой на него. При выборе шаблона на сервере вызывается функция “selectTemplate” и ей в качестве параметра передается идентификатор выбранного шаблона. После чего сервер обновляет удаленный общий объект хранящий информацию о событии и происходит переключение шаблона у всех пользователей, подключенных к событию.
5.3.2. Управление чатом
Для управления правами доступа в чате пользователю достаточно нажать кнопку «Права доступа» (см. изображение 7). В открывшемся модальном окне можно выбрать права доступ для различных групп пользователей, которые будут иметь возможность оставлять сообщения в чате. После выбора прав доступа на сервере будет вызвана функция “setAccess”, которой в качестве параметра будет передан уровень доступа к конкретному чату.
Для удаления сообщения в чате нужно нажать на иконку с изображением крестика и сообщение будет удалено.
5.3.3. Управление титрами
Для управления титрами видео объекта необходимо нажать кнопку «Титры», расположенную поверх изображения. В открывшемся модальном окне можно задать титры или убрать уже существующие. Титр для видео состоит из двух частей: информации о выступающем человеке (имя, должность или другая дополнительная информация), информации о событии (место, название).
С титрами можно произвести следующие операции:
· Установить информацию о выступающем человеке, вызвав на сервере функцию “setMan” и передав в качестве параметров имя, дополнительную информацию и время, на которое установить титр;
· Убрать титр с информацией о выступающем человеке, вызвав функцию “removeMan”;
· Установить титр с информацией о событии, вызвав функцию “setPlace” и передав в качестве параметров место и название события.
5.3.4. Вещание
При запуске приложения на сервере вызывается функция “getMySources”, которая возвращает список источников, доступных пользователю для вещания изображения с камеры на сервер. В случае если у пользователя есть источники, то ему становится доступна вкладка «Вещание», которая содержит меню, предоставляющее управление передачей изображения с клиентской камеры и захват рабочего стола (см. изображение 8).
Захват камеры
В этом списке содержатся все источники для передачи изображения с камеры. Для каждого источника можно выбрать отдельную камеру и микрофон, после чего установить настройки битрейта и разрешения. Само приложение позволяет одновременно захватывать несколько устройств, подключенных к одному компьютеру. Таким образом, с одной машины можно проводить многокамерное представление события.
При разработке системы одной из главных проблем было избежание возникновения петли между динамиками и микрофоном. Она возникает, если микрофон, с которого захватывается звук для передачи на сервер, и динамики находятся в одном помещении, то микрофон будет захватывать звук, возвращающийся из динамиков. Так как flash на момент разработки не имел встроенных средств подавления акустического эха Acoustic Echo Cancellation (AEC) [13], пришлось использовать другое решение проблемы. Пользователь, который вещает со своего компьютера, может выбрать опцию «Глушить поток для меня» (по умолчанию эта опция всегда включена) и таким образом во входящем потоке звук не будет приниматься.

Изображение 8. Интерфейс управления событием, вкладка «Вещание».
Захват рабочего стола
Захват рабочего стола осуществляется посредством запуска стороннего приложения на компьютере пользователя. Кнопка «Захват рабочего стола» просто загружает приложение со специального адреса, таким образом, что оно запускается со специальными настройками для передачи снимков рабочего стола именно в качестве заданного источника презентации.
5.3.5. Формат удаленных общих объектов для презентации, чата и видео
Каждый объект, отображающий презентацию, подключается к удаленному общему объекту, который имеет следующий формат: name – это имя удаленного общего объекта, title – это заголовок, current – это текущий объект Shot, history – это массив объектов Shot.
name:String;
title:String;
current:Shot;
history:Array;
Объект Shot, представляет собой информацию об отдельном слайде презентации и содержит в себе ссылку на изображение, дату создания изображения и идентификатор изображения.
Shot:Object
{
url:String;
time:Date;
id:int;
}
Каждый чат создает подключение с удаленным общим объектом, содержащим имя объекта, его заголовок и информацию обо всех сообщениях для этого чата (массив объектов Message).
name:String;
title:String;
messages:Array;
Объект Message предоставляет информацию, которая хранится в базе данных на сервере. В нем храниться идентификатор сообщения, имя пользователя, оставившего сообщение, роль пользователя, идентификатор пользователя, текст и дата сообщения.
Message:Object
{
id:int;
user:String;
role:Enum[ADMIN, EDITOR, USER, ALIEN];
userId:String
text:String;
date:Date
}
Каждый объект, воспроизводящий аудио или видео поток подключается к удаленному общему объекту, который содержит имя удаленного объекта, его заголовок, объект VideoSource и объект Caption
name:String;
title:String;
primary:VideoSource;
caption:Caption;
Объект VideoSource – это объект содержащий информацию о потоке, который необходимо воспроизвести. Server – это url адрес сервера, stream – имя потока, а дальше следуют характеристики потока: битрейт, число кадров в секунду, ширина и высота кадра.
VideoSource:Object
{
server:String;
stream:String;
bitrate:uint;
fps:uint;
width:uint;
height:uint;
}
В Caption храниться вся информация для показа титров об участвующем в видеовзаимодействии человеке и о текущем событии: имя, специальность, место выступления и название мероприятия.
Caption:Object
{
name:String;
job:String;
place:String;
event:String;
}
5.4. Разработка редактора шаблонов
Проведение системы тесно связано с системой шаблонов, поэтому для создания и редактирования шаблонов был разработан редактор шаблонов, который обладает следующим функционалом:
· Добавление источников для события;
· Изменение источников объектов;
· Управление источниками звука в шаблоне;
· Создание новых шаблонов на основе макетов.

Изображение 9. Интерфейс редактора шаблонов, главное меню.
5.4.1. Добавление источников
При создании события рассматриваются два стандартных варианта: видео и презентация; видео, презентация и чат. Событие по умолчанию содержит набор источников и шаблонов. Но при проведении нестандартного события может существовать шаблон с дополнительными источниками. Таким образом, возникла необходимость разработать возможность добавления новых источников для события в редакторе шаблонов.
Для добавления нового источника необходимо нажать кнопку «Добавить» во вкладке «Источники» (см. изображение 9). После этого в модальном окне можно выбрать название источника и его тип. На сервере будет вызвана функция “createSource”, которой в качестве параметров необходимо передать название источника и его тип. Сервер обновит удаленный общий объект, и источник станет доступным для добавления в шаблон.
5.4.2. Изменение источников объектов
Операция по изменению источников объектов – это наиболее часто используемая функция редактора шаблонов. Чтобы она была простой для пользователя, было принято решение реализовать ее с помощью перетаскивания (drag-and-drop) [14]. Пользователь должен перетащить необходимый источник и отпустить его над объектом в шаблоне, тогда этот объект будет подключен к данному источнику.
5.4.3. Управления источниками звука в шаблоне
Шаблон может содержать в себе как видимые, так и невидимые объекты. В качестве невидимых объектов могут быть видео объекты, содержащие в качестве источников аудио и видео потоки. Необходимо было предусмотреть возможность добавления в шаблон таких объектов. Поэтому в редактор шаблонов была добавлена кнопка «Расширенные настройки звука» (см. изображение 10). При нажатии на нее появляется модальное окно, в котором можно добавить в шаблон источник звука. Это необходимо, например, в случае, когда на шаблоне крупно показывается только презентация, но при этом нужно слышать, что говорит выступающий человек.
5.4.4. Создание новых шаблонов на основе макетов
В текущей версии редактора шаблонов не предусмотрена возможность полноценного редактирования или создания нового шаблона, чтобы пользователь мог изменять расположение объектов и их размеры или добавлять новые объекты. Шаблоны можно создавать только на основе существующих макетов.
Для создания нового шаблона необходимо нажать кнопку «Создать новый шаблон» в основном окне редактора шаблонов, пользователь увидит модальное окно, представленное на изображении 10. Для создания шаблона пользователю необходимо выбрать макет из списка, ввести имя, после чего нажать кнопку «Создать шаблон». И шаблон появится в основном окне редактора и станет доступным для редактирования.

Изображение 10. Интерфейс редактора шаблонов, меню выбора макета.
5.4.5. Взаимодействие редактора шаблонов с сервером
Помимо добавления новых источников, в редакторе шаблонов должны выполняться дополнительные функции:
· Добавление шаблона выполняется с помощью вызова функции “addTemplate” на сервере. В качестве параметров функции передаются имя шаблона и массив объектов TemplateSource (см. пункт 5.2.6.);
· Удаление шаблона – “removeTemplate”, функции передается идентификатор шаблона, который нужно удалить;
· Обновление шаблона – “updateTemplate”, функции передается идентификатор шаблона, его имя и массив объектов TemplateSource.
5.5. Разработка воспроизведения записей
5.5.1.Разработка формата xml файла для воспроизведения записи
При проведении события в базу данных на сервере записывается следующая информация, которая необходима для воспроизведения записи события:
· Аудио и видео потоки, которые передаются от клиентов на сервер, записываются постоянно, независимо от того отображаются они в шаблоне в текущий момент времени или нет;
· Переданные на сервер слайды презентаций с клиентских компьютеров;
· Переключения шаблонов и сами шаблоны, используемые в трансляции;
· Сообщения в чате.
После завершения события сервер обрабатывает записи в базе данных и на их основе генерирует xml файл, который имеет следующий формат:
<event end="" start="" title="FMLE H264">
<timelines>
<timeline end="" endOffset="-1" id="346" start="" startOffset="-1" title="5037">
<time start="">
<change.../>
</time>
</timeline>
</timelines>
<templates>
<template id="429">
<object depth="0" height="510" id="1598" source="video-493-WT4UrMw4uKAdBD9L" sourceId="493" type="VIDEO" visible="true" width="680" x="15" y="40"/>
<object depth="0" height="510" id="1597" source="chat-495-pi53tN0B6BDtuVf9" sourceId="495" type="CHAT" visible="true" width="280" x="705" y="40"/>
</template>
<template id="430">
<object depth="0" height="510" id="1601" source="shot-494-9qbvfZZo42PHr7BI" sourceId="494" type="SHOT" visible="true" width="680" x="15" y="40"/>
</template>
</templates>
</event>
В тэге event указывается время начала и окончания события, а также заголовок события. В теге timelines может быть несколько тегов timeline, потому что каждая приостановка события разбивает его на составные части, которые и представляют собой timeline. Каждому timeline можно задать значения атрибутов startOffset и endOffset, которые задают сдвиг соответственно относительно начала и конца записи в миллисекундах. Это дает возможность вырезать куски из записи и предоставлять пользователю только определенный фрагмент для просмотра.
В каждый тэг timeline записывается тэг time с атрибутом start, в котором храниться временная метка. Тэг time представляет собой момент времени, в который произошло какое-то событие, записанное сервером в базу данных. А само событие, которое было записано, храниться в тэге change внутри time. Варианты тэгов change для каждого типа записи выглядят следующим образом:
· Добавление сообщения в чат, где атрибут sourceId содержит идентификатор чата, в который нужно добавить сообщение;
<change date="" id="85" name="chat-148-itD32WS42lhZ80mZ" role="ADMIN" sourceId="148" text="Сообщение" type="MESSAGE" user="Konstantin. *****@***com"/>
· Переключение шаблона, где атрибут template – это идентификатор шаблона, на который нужно переключиться;
<change id="957" template="429" type="TEMPLATE"/>
· Показ слайда, где атрибут filename – это URL адрес изображения, которое нужно загрузить в объект, отображающий презентацию, с идентификатором sourceId;
<change filename="http://sdev. /ud6/usergroup_Fix4DQufvhcPjKaky32y2U0HVD3uPv0foUAzZtH4kMcT4tkYlafhnYpXf96VqhNU/event-107-DAMHmSB5veJ9ddURn38mTSt4elWOQMHQ/r26/shot-19-tfu8ObE46FyEOll5/0018387LxSjcUMN. jpg" id="387" name="shot-19-tfu8ObE46FyEOll5" sourceId="19" type="SHOT"/>
· Воспроизведение аудио и видео файлов, где атрибут filename – это URL адрес файла, а атрибут sourceId – это идентификатор объекта, в котором нужно воспроизвести файл.
<change duration="60" filename="http://sdev. /ud6/usergroup_Fix4DQufvhcPjKaky32y2U0HVD3uPv0foUAzZtH4kMcT4tkYlafhnYpXf96VqhNU/event-107-DAMHmSB5veJ9ddURn38mTSt4elWOQMHQ/r26/video-18-QgfJCR8APscomeXZ/video-18-QgfJCR8APscomeXZ75839-nT2DmbKk. flv" id="11" name="video-18-QgfJCR8APscomeXZ" sourceId="18" type="VIDEO"/>
В тэге templates храниться весь набор шаблонов для текущего события. Такая модель воспроизведения записи предоставляет возможность редактирования шаблонов уже после завершения события (об этом будет рассказано ниже в перспективах разработки). В каждом тэге template содержится описание объектов этого шаблона. В тэге object, описывается стандартный объект, и имеются следующие данные: размер, расположение, идентификатор, тип, видимость и идентификатор источника для этого объекта. 5.5.2. Обработка входных данныхПосле загрузки xml файла, приложение обрабатывает его и генерирует вектор с объектами Timeline, который представляют собой ActionScript имплементацию того, что записано в xml. В свою очередь каждый Timeline объект хранит вектор объектов Time, который хранит два вектора changes и previousChanges c объектами типа Change. Здесь получается некоторая избыточность информации, так как она может повторяться, но это является вынужденной мерой. Рассмотрим следующие случаи: · Если пользователь перешел в какую-то точку воспроизведения записи, и программа просто найдет ближайшее изменение данных, то возможно, что в другом объекте будут отображать устаревшие данные. Так как, если в шаблоне существует больше одного объекта, то изменения для них могли произойти до того временного промежутка, на который перешел пользователь. Но при этом эти изменения не будут отражены в последнем объекте Change, который нашла программа. · Существовал альтернативный путь решения этой проблемы. Можно было бы находить все объекты, которые существуют в текущей точке воспроизведения, после чего находить последние входные данные для них и обновлять объекты, но это вызвало бы множество проходов векторов с объектами, что сказалось бы на скорости перехода по таймлайну записи. Таким образом, можно утверждать, что дублирование информации является правильным решением этой проблемы. 5.5.3. Взаимодействие между объектами при воспроизведении записиВектора с данными полученными из xml файла хранятся в объекте Record, он же и сопоставляет текущее время записи с временными метками этих векторов и отправляет событие объекту RecordBridge с информацией для обновления шаблона и его содержимого. Объект RecordMenu представляет собой графический интерфейс пользователя для управления воспроизведением записи и состоит из стандартных элементов управления любым плеером: управление звуком, таймлайн, кнопок пауза/воспроизведение и переходом между различными записями. Для воспроизведения записи необходимо было решить следующие задачи: · Так как RecordMenu содержит элемент управления таймлайн, а Record хранит в себе данные с временными метками, то оба эти класса должны иметь доступ к текущему времени воспроизведения записи, а в случае его изменения синхронизироваться относительно него; · Контроль состояния воспроизведения мультимедиа файлов. При воспроизведении файла Video объект может находиться в состояниях: буферизации, паузы, воспроизведения, перехода по таймлайну; · Контроль воспроизведения всей записи. Так как в случае, если один из объектов Video находится в состоянии буферизации, то воспроизведение записи и все остальные Video должны быть приостановлены; · Управление звуком всех Video объектов. В первом варианте воспроизведения записи существовал управляющий объект RecordController, который отслеживал текущее внутреннее время записи и статусы Video. При этом предполагалось, что RecordController знает только общее количество объектов Video, которое ему сообщает RecordBridge при инициализации каждого нового объекта. У такого подхода существовал ряд недостатков: RecordController не имеет прямого доступа ко всем объектам Video. Для того чтобы остановить воспроизведение файлов или изменить звук, приходится обращаться к RecordBridge, который проходит массив всех текущих активных объектов при поиске среди них Video; Video объекты являются активными обработчиками событий, в то время, как должны быть всего лишь контейнерами для видео содержимого. Другими словами Video объект должен представлять собой оболочку, которая принимает команду на проигрывание файла, но при этом не участвует в работе с файлом. RecordBridge также несет в себе функции управления событием, хотя сам по себе представляет контейнер для шаблона с его содержимым. По сути, в схеме, представленной ниже, объект RecordController не может выполнять функции управления воспроизведением и делегирует их другим объектам. Что приводит к усложнению работы системы и лишним вызовам функций внутри объектов.
Изображение 11. Устаревшая схема взаимодействия между объектами при воспроизведении записи. После анализа недостатков первой схемы взаимодействия объектов при воспроизведении записи, было принято решение провести рефакторинг кода. В результате получилась схема, представленная на изображении 12.
Изображение 12. Текущая схема взаимодействия между объектами при воспроизведении записи. | |
Объекту Record была передана функция отслеживания текущего времени воспроизведения. RecordMenu стал на прямую взаимодействовать с Record. Главным отличием является то, что вместо RecordController появился объект RecordStreamsManager. Рассмотрим основные функции нового объекта: · Хранение всех потоков RecordStream с воспроизводимыми в них файлами; · Предоставление потоков объектам Video; · Прямой доступ к управлению состоянием воспроизведения потоков и управлению звуком потоков; · Отслеживание состояний всех потоков и принятие решения о приостановке/воспроизведении записи в случае различных состояний потоков. Как видно из схемы контроль воспроизведения осуществляется теперь на уровне потоков, а не на уровне Video объектов. Что позволило делегировать всю работу, связанную с отслеживанием ситуаций с буферизацией различных файлов одному объекту, который напрямую взаимодействует с Record и сам же может управлять воспроизведением потоков. Таким образом, были исправлены недостатки, указанные для первой схемы. 5.6. Перспективы разработки5.6.1. Разработка рабочего места режиссераПри проведении крупных событий с помощью платформы Viditory возникает потребность дополнительных функций управления событием. Для реализации этой задачи необходимо разработать рабочее место режиссера, предоставляющее кроме универсального интерфейса управления событием следующие возможности: · Служебная связь, внедрение которой позволит режиссеру координировать действия участников события и оперативно решать возникшие проблемы. · Управление аудио и видео потоками сделает возможность запретить или наоборот разрешить вывод в эфир определенного потока. 5.6.2. Доработка редактора шаблоновВ новой версии редактора шаблонов планируется реализовать возможность полностью видоизменять шаблон. Редактор позволит изменять расположение, размеры существующих объектов и добавлять новые объекты. 5.6.3. Использование Acoustic Echo CancellationВ мае 2011 года вышел релиз Flash Player версии 10.3, в котором появилась возможность использовать акустическое подавление эха, что позволит решить проблему звуковой петли и отказаться от применения гарнитуры. 5.6.4. Монтаж записейПосле проведения события редактор сможет получить возможность монтировать запись, помещенную в архив. Например, можно будет изменить последовательность переключения шаблона или добавить новый шаблон, которого не было при проведении события в прямом эфире. 5.6.5. Добавление новых интерактивных элементовСейчас в системе существует только три типа объектов: видео, чат и презентация. Для использования платформы Viditory в качестве сервиса для проведения удаленных мастер-классов, дистанционного обучения в систему необходимо добавить такие элементы, как интерактивная доска для рисования, передача удаленного управления рабочим столом и так далее. Это позволит сделать платформу Viditory более разнообразной и функциональной. 5.6.6. Разработка версии для портативных мультитач устройствРынок мультитач устройств быстро развивается, поэтому для расширения аудитории пользователей платформой Viditory необходимо учитывать необходимость разработки версии для данной категории пользователей. Для разработки под мобильные устройства на платформе Adobe Flash существует технология Air, которая обладает функционалом необходимым для реализации управления сервисом с помощью мультитач. Перенести приложение на данную технологию является сравнительно нетрудоемкой задачей, так как в ней используется тот же самый язык ActionScript, возникнет необходимость только добавить управление пользовательским интерфейсом через сенсорный экран. Технология Adobe Air поддерживается операционной системой Android OS, которой оснащены многие смартфоны и планшетные компьютеры, выпускаемые в данный момент. Для переноса же системы на продукцию компании Apple, которая также занимает большую долю рынка мобильных устройств, придется разрабатывать полностью новое клиентское приложение и серверную часть. |
6. Экспериментальная часть.
6.1. Оценка соответствия разработанной системы техническому заданию
В результате работы была разработана клиентская часть платформы Viditory. Основные задачи поставленные в техническом задании были выполнены в полном объеме, дополнительные задачи будут решены на следующих этапах разработки. Результаты отражены в таблице 2.
Таблица 2
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 |




