Титровальные скрипты

Здесь обсуждаются любые продукты компании СофтЛаб-НСК для телевизионного вещания (Форвард Т, Форвард ТС, Форвард Голкипер, Форвард Рефери, Форвард Офис, Форвард Инжест)

Модераторы: Людмила, PR, vd, Даниленко Сергей

Ответить
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Титровальные скрипты

Сообщение Даниленко Сергей »

Часть1

В новом релизе ПО для линейки продуктов ФорвардТх планируется добавить в титровальную систему возможность исполнения скриптов.
Каждый скрипт по своей сути представляет небольшую задачку, которая управляет поведением титровальных элементов в объекте.
Скрипт принадлежит самому титровальному объекту и управляет только элементами этого объекта.

Применение скриптов позволит:
1)В некоторых случаях резко сократить размер расписания программы OnAir. Например, для решения задачи "показываем музыкальный клип, а на его фоне плашку с подписью - сначала через 5 секунд после старта, а затем за 15 секунд до конца".

2)Реализовывать разные алгоритмы взаимодействия между титровальными элементами. Например, показ роликов "по рубрикам" - есть набор роликов, которые принадлежат определенным категориям-роликам (куплю, продам, ...). При показе каждого ролика нужно показывать рубрику, к которой относится этот ролик.

3)Делать некоторые вещи, которые не было возможности реализовать при использовании наших стандартных титровальных элементов. Например "остановку" телефона.

В этом топике мы постараемся изложить идеологию работы с титровальными скриптами на ряде примеров.
Последний раз редактировалось Даниленко Сергей 05 июн 2009 18:09, всего редактировалось 1 раз.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Часть 2

Общие правила написания скриптов

Скрипт, если он создан, принадлежит титровальному объекту, и может управлять только элементами, принадлежащими этому объекту, а также реагировать на события от этих элементов. Другими объектами и их элементами скрипт управлять не может, равно как и проектом с титрами, в котором содержатся все объекты.

Примечание: везде, где ниже упоминается слово «объект», имеется ввиду титровальный объект, в котором исполняется данный скрипт.

В самом начале скрипта имеется заголовок, в котором определяется набор библиотек, используемых в скрипте. Изменять его не рекомендуется, и обычно это не требуется:
import System.IO; // это модуль для файловых операций — если их нет, то он не нужен
import System.Diagnostics; // для вывода отладочных печатей — если их нет, то он не нужен
import SLTMTitleCommon.IScripting; // нужно всегда
import LogotypeLib; // нужно всегда

var crawl = new Script(titleRoot);

Переменная crawl (ее можно назвать как угодно) описывает создание экземпляра класса Script, то есть, это описание собственно и осуществляет вызов и исполнение скрипта.

В примере скрипта, который генерируется автоматически, имеется некоторый набор функций, изменять которые не рекомендуется, и обычно это не требуется:

function Script(obj) // конструктор
function CleanUp(obj, e : VsaScriptingHostEventArgs) // очистка
function init() // инициализация

В функции init можно добавить код инициализации, если требуется.

Скрипт содержит функции, которые перекрывают некоторый набор функций базового класса. Обычно, если функция, возвращающая булевское значение (boolean), перекрыта, то ее реализация должна возвращать false в случае, если необходимо вызвать исходную реализацию, и true, если все необходимые действия она выполнила сама, а исходную реализацию вызывать не требуется.

Набор функций следующий:

Unload(): boolean
Вызывается по выгрузке (деинициализации) объекта. Без особой необходимости ее перекрытие не требуется.

Start(atStart : double, fadeDuration : double) : booleanВызывается по запуску воспроизведения объекта. В параметре atStart передается время старта, в fadeDuration — время появления объекта на экране (может быть задано в программе FDOnAir).

Stop(atStop : double, fadeDuration : double) : boolean
Вызывается по остановке воспроизведения объекта. В параметре atStop передается время остановки, в fadeDuration — время исчезания объекта с экрана (может быть задано в программе FDOnAir).

Abort(fadeDuration : double) : boolean
Вызывается по прерыванию воспроизведения объекта. В параметре fadeDuration задается время исчезания объекта с экрана (может быть задано в программе FDOnAir).

GetTaskInfo(task: String, e: TitleObjectEvenArgs) : booleanВозвращает в e информацию о задании task.

GetPlayInfo(e: TitleObjectEvenArgs): boolean
Возвращает в e информацию о текущем состоянии воспроизведения объекта.

LoadTask(task: String) : boolean
Вызывается при загрузке задания task.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Часть 3

Обработка событий

В скрипте для каждого объекта (группы титровальных элементов) доступны функции, которые вызываются автоматически по событиям, связанным с показом титровальных элементов. Такие вызовы называются нотификациями от элементов. В таких функциях можно включить какую-либо специализированную обработку событий, и по ним осуществлять какие-то действия. Например, по завершению показа какого-либо элемента запускать показ другого.
Доступны следующие функции, вызываемые по соответствующим событиям:

OnStatusChanged(name: String, index: int, oldStatus: SLTMRunTimeStatus, newStatus: SLTMRunTimeStatus)
Вызывается по изменению состояния (статуса) титровального элемента с именем name, номером index. В параметре oldStatus передается предыдущее состояние элемента, в newStatus — новое. Возможные состояния элемента:
LogotypeLib.eStopping — идет процесс остановки
LogotypeLib.ePreparing — идет процесс подготовки
LogotypeLib.eStopped — воспроизведение остановлен
LogotypeLib.eStarting — идет процесс запуска
LogotypeLib.eRunning — воспроизведение запущено

OnStopTimeChanged(elementName: String, index: int, newStopTime: double)
Вызывается по изменению времени остановки показа элемента с именем name, номером index. В параметре newStopTime передается новое время остановки элемента.

OnElementStart(name: String, index: int, id: int, time: double, text: String)
Вызывается по запуску показа титровального элемента с именем name, номером index. В параметре time передается время старта, в параметре text — текст задания (последней его части, если их много; для бегущей строки — последнее объявление) для данного элемента. id — индекс части задания (например, очередное объявление в бегущей строке).

OnElementFinishing(name: String, index: int, id: int, time: double, text: String)
Вызывается, когда начато завершение показа титровального элемента с именем name, номером index. Например, это происходит в момент, когда бегущая строка начинает «уезжать» с экрана (показывается ее последний кусок). В параметре time передается время начала завершения, в параметре text — текст задания (последней его части, если их много; для бегущей строки — последнее объявление) для данного элемента. id — индекс части задания (например, очередное объявление в бегущей строке).

OnElementStop(name: String, index: int, id: int, time: double, text: String)
Вызывается по завершению показа (остановке) титровального элемента с именем name, номером index. Например, это происходит в момент, когда бегущая строка заканчивает «уезжать» с экрана. В параметре time передается время остановки, в параметре text — текст задания (последней его части, если их много; для бегущей строки — последнее объявление) для данного элемента. id — индекс части задания (например, очередное объявление в бегущей строке).
Alekzander
Сообщения: 17
Зарегистрирован: 17 сен 2009 15:58

Сообщение Alekzander »

По приведенному синтаксису сильно похоже на ActionScript3.
Это он или ваша разработка?
vd
Сообщения: 2311
Зарегистрирован: 05 мар 2003 19:21

Сообщение vd »

Наша.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Синтаксис похож потому, что и в ActionScript3 и у нас используется java-скрипт. Но внутри ActionScript3 используется какое-то свое API, а унас - DotNet
Alekzander
Сообщения: 17
Зарегистрирован: 17 сен 2009 15:58

Сообщение Alekzander »

Спасибо.
"используется java-скрипт" - значит что вы использовали что то вроде SpiderMonkey или V8? или что используется спецификация ECMA скрипта?

поясню свой интерес.
В настоящий момент реализую для собственных нужд титровалку, которая исполняет javascript. Я использую SpiderMonkey. И мне интересно, кто какие инструменты использует в подобных задачах.
А особенно интересно - почему :)
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

В нашем ПО ForwardT Software есть своя титровальная система. Написана она на DotNet. Когда разрабатывалась система скриптов, то был выбран java как наиболее удобный и наиболее распространенный язык. При этом перебирались несколько вариантов, но остановились на java. Но сами скрипты при своей работе обращаются к функциям DotNet.
Мы планируем далее в этом топике более подробно описать работу с нашими скриптами. Будут примеры кода и комментарии.
Alekzander
Сообщения: 17
Зарегистрирован: 17 сен 2009 15:58

Сообщение Alekzander »

Не совсем понял. Java? или, все же, javascript?
это не совсем одно и тоже.
vd
Сообщения: 2311
Зарегистрирован: 05 мар 2003 19:21

Сообщение vd »

javascript
Alekzander
Сообщения: 17
Зарегистрирован: 17 сен 2009 15:58

Сообщение Alekzander »

спасибо.

Учитывая связку с .Net подозреваю что речь идет о JScript.Net
это так?

поскольку если это он, то есть еще вопросы :)

Как насчет поддержки E4X? В интернете точного ответа не нашел.
Как насчет поддержки Windows.Forms?
Это было бы очень интересно, использовать всю мощь Windows.Forms в титровальных проектах.
vd
Сообщения: 2311
Зарегистрирован: 05 мар 2003 19:21

Сообщение vd »

Да, это JScript.Net

Насколько я знаю, из него можно вызывать все объекты, доступные в .Net из JScript.Net.

Разработчик скриптовой системы сказал примерно следующее. Windows.Forms, наверное, должны работать, но мы это не проверяли. Успешно работает использование .Net-объектов вроде массива, функции файловых операций (прочитать текстовый файл и т.п.).

Насчет E4X - с этим мы тем более не пробовали работать. Но возникают большие сомнения, т.к.
http://xpoint.ru/know-how/JavaScript/E4X
На данный момент из популярных браузеров E4X поддерживает только Firefox 1.5.
Не совсем понятно, каким образом поддержка этого дела относится к JScript.Net. Или на данный момент это в любом JScript поддерживается? Сами мы по этому поводу ничего не знаем, к сожалению.
Alekzander
Сообщения: 17
Зарегистрирован: 17 сен 2009 15:58

Сообщение Alekzander »

E4X это поддержка XML средствами JavaScript. это даже скорее очень тесная интеграция JavaScript и XML.
в JavaScript поддерживающий E4X можно написать так:

Код: Выделить всё

var i=100;
var xml=<root><element x="10" y=&#123;i&#125;/></root>
var ex=xml.element.@x;
var ey=xml.element.@y;
xml.element.@type="Test";
и все в таком роде. бывает очень удобно.

Скорее всего у .Net поддержка XML есть своя, потому MS не реализовала E4X.

В целом ситуация стала ясна, спасибо.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

В настоящий момент реализую для собственных нужд титровалку
Если не секрет, то под какое железо пишите титровалку?
Alekzander
Сообщения: 17
Зарегистрирован: 17 сен 2009 15:58

Сообщение Alekzander »

не секрет. под ваше :)
планирую сделать более менее стабильный релиз и дать здесь на него ссылку.
Ответить