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

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

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

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

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

не секрет. под ваше
Ясно. Планируете ли вы его тиражировать? Конкуренции не боимся, просто могли бы помочь с защитой.
Alekzander
Сообщения: 17
Зарегистрирован: 17 сен 2009 15:58

Сообщение Alekzander »

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

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

когда будет что защищать - можно будет обсудить.
Обращайтесь, поможем, подскажем.
Можно будет и сюда информацию разместить:
http://www.softlab-nsk.com/rus/forward/partners.html
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

Сообщение ВОВАН »

Доброго времени суток.
Что-то этими функциями можно реализовать всё то же самое, что из СДК, только на яве. А как насчет встроенной поддержки тегов(наподобие ХТМЛ) в бегущей строке? И как с помощью всего этого телефон останавливать?
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

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

Про теги форматирования (будут доступны в титровальных элементах бегущая строка и подпись).

Вот список тегов, которые будут поддерживаться в новой версии ПО:

1. Выравнивание по горизонтали (Alignment):
<AL> - выравнивать строки влево,
<AR> - выравнивать строки вправо,
<AC> - выравнивать строки по центру,
<AJ> - выравнивать оба края строки,
<AD> - установить выравнивание по умолчанию (как установлено в титровальном элементе).

2. Отступы в абзаце по горизонтали (Indent):
<IL n> - отступ строки слева (в пикселах),
n=-1 – установить отступ слева по умолчанию,
<IR n> - отступ строки справа (в пикселах),
n=-1 – установить отступ справа по умолчанию,
<IF n> - отступ красной строки – отступ первой строки вправо (в пикселах),
n=-1 – установить отступ первой строки по умолчанию,
<IH n> - нависание красной строки – отступ первой строки влево (в пикселах),
n=-1 – установить отступ первой строки по умолчанию.
Тэги IF и IH замещают друг друга (сработает только один из них – последний из найденных до конца текущей строки).

3. Разрядка по вертикали (Spacing):
<SB n> - отступ выше абзаца (в пикселах) , n=-1 – установить отступ по умолчанию,
<SA n> - отступ ниже абзаца (в пикселах) , n=-1 – установить отступ по умолчанию,
<SL n> - межстрочный интервал (в процентах),
n=-1 – установить интервал по умолчанию.

4. Выбор стиля (Style):
<ST n> - Далее использовать указанный стиль, n – номер или название стиля,
если n=-1, то далее использовать стиль по умолчанию.

5. Вставка изображения (Picture):
<PC n path> - вставить в строку картинку из файла path, n (в процентах) задает положение картинки в строке по вертикали: 0 - сверху строки, 100 - снизу строки,
50 - по центру строки, -1 – положение по умолчанию (на высоте базовой линии).

6. Фон (Background):
<BK a,r,g,b> - включить заливку фона указанным цветом
(цифры a,r,g,b – десятичные от 0 до 255, a – альфа/непрозрачность),
<BK r,g,b> - включить заливку фона указанным непрозрачным цветом
(цифры r,g,b – десятичные от 0 до 255),
<BK 0xAARRGGBB> - включить заливку фона указанным цветом
(цвет задан в формате HEX, AA – альфа/непрозрачность),
<BK 0xRRGGBB> - включить заливку фона указанным непрозрачным цветом
(цвет задан в формате HEX).

7. Фон страницы (Background):
<PB a,r,g,b > - залить страницу указанным цветом. Цифры как в пункте 6.

8. Подложить изображения(Picture) под текст:<PP hh vv path> - подложить картинку из файла path под текст, hh и vv задают горизонтальное и вертикальное положение картинки.
hh = HL – горизонтально к левому краю
hh = HC – горизонтально по центру
hh = HR – горизонтально к правому краю
hh = HS – горизонтально растянуть/сжать
hh = HT - горизонтально повторить до заполнения
vv = VU – вертикально к верхнему краю
vv = VC – вертикально по центру
vv = VD – вертикально к нижнему краю
vv = VS – вертикально растянуть/сжать
vv = VT - вертикально повторить до заполнения

9. Задать базовый путь к картинкам:
<BP path> - path путь к картинкам.

10. Задать коментарий:
<CC comment> - comment коментарий.

Если в тексте встречается неправильный тэг (с ошибками в формате, например <BK 0>), то он считается обычным текстом (печатается как и любой другой текст).
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

Сообщение ВОВАН »

О, здорово. А когда ж это можно будет пощупать(попробовать, поставить на эфир)?
Kurz
Сообщения: 1
Зарегистрирован: 03 мар 2010 13:03

Сообщение Kurz »

Вот и вышла новая версия TitleDesigner, однако вся документация по использованию скриптов исчерпывается сообщениями этой темы.
Экспериментировал с примером Program Files\ForwardT Software\FDTitle\TitleScripting\CrawlPhoneStopSpace.SLTitleProj
Возник ряд вопросов, основной из которых какова связь между проектом и скриптом?

1. Как (можно ли?) использовать функции класса Script?

нижеприведенный код должен по идее останавливать бегучку, но этого не происходит:

class Script extends SLTMTitleCommon.Scripting.ScriptBase {...}
var crawl = new Script(titleRoot);
crawl.Abort(5) //<-- функция выполняется но строка так и бежит //crawl.Stop тоже ничего не меняет

Напишите пример кода как запускать/останавливать титр

2. Параметры atStop: double, fadeDuration: double, time: double это количество секунд?

3. Как получить доступ (прочитать) файл задания (т.е. для бегучки ее содержимое)? В т.ч. при его смене в OnAir?
4. Как узнать какое объявление показывается в настоящий момент (показалось, предстоит показать)?

Судя по содержимому Debug в этом примере из функций класса Script выполняются только init и затем несколько раз OnStatusChanged. В общем совершенно непонятна логика взаимодействия скрипта с проектом.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

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

Сначала небольшая теория, потом ответы на конкретные вопросы.

Основные идеи "титровальных скриптов" следующие:
1.Каждый титровальный скрипт - это небольшая программа для управления титровальными элементами.
2.Каждый скрипт принадлежит какому-то определенному титровальному объекту.
3.Из титровального скрипта можно управлять только теми титровальными элементами, которые входят в титровальный объект-"хозяин" скрипта.
4.Из титровального скрипта можно получить некоторую информацию о титровальном проекте (например, частоту кадров, размер кадра,...).
5.В скрипте можно менять и устанавливать свойства титровальных элементов, входящих в титровальный объект.
6.Скрипт работает на модели "событий" (.Net). Это означает, что в скрипте можно получать информацию об определенных событиях и реагировать на нее.
7.Не обязательно реагировать абсолютно на все события.
8.Все функции и события скрипта можно разделить на следующие группы:
-Связанные с инициализацией/деинициализацией самого скрипта
-События от внешних источников, например, от программы OnAir
-События от титровальных элементов, которые входят в титровальный объект-"хозяин" скрипта
-Связанные с предоставлением служебной информации "наружу", например, для программы OnAir.
9.Вызывать какие-нибудь процедуры и функции для управления титровальными элементами можно только в пределах событий.
10.Можно создавать свои собственные классы, процедуры, функции.

Рассмотрим подробнее все встроенные методы (функции, процедуры) титровального скрипта.

Набор функций для инициализации/деинициализации скрипта.
function Script(obj) - конструктор
function CleanUp(obj, e : VsaScriptingHostEventArgs) - вызывается при "разрушении" скрипта
function init() - вызывается при инициализации скрипта
function Unload() - вызывается при выгрузке скрипта (на этапе "разрушения")

Практическое значение могут иметь:
function init() - чтобы поинициализировать свои переменные, создать объекты и т.д.
function CleanUp(obj, e : VsaScriptingHostEventArgs) - чтобы деинициализировать свои переменные и объекты

Предоставление информации:

!!!Обращаем внимание, что эти функции декларируются как override, т.е. по своей сути они являются виртуальными. Это означает, что если вы их не переопределите в своем коде, то будут вызваны аналогичные методы из базовых классов титровальной системы.

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

override function GetTaskInfo(task : String): TaskInfoArgs - возвращает структуру с информацией о задании. Например, о длительности задания, зациклено или нет воспроизведение.
override function GetLoopped() : TaskInfoArgs - возвращает структуру с информацией о задании(зациклено или нет воспроизведение).
override function GetPlayInfo() : PlayInfoArgs - возвращает информацию о некоторых свойствах титровального объекта на этапе вопроизведение
override function GetTask( ) : String - возвращает строчку с файлом-заданием, загруженным в титровальный объект
override function GetTaskMask( ) : String - возвращает маску с типами файлов, которые можно загрузить в данный титровальный объект
override function GetStatus(): LogotypeLib.SLTMRunTimeStatus - возвращает текущее состояние титровального объекта (запущен, остановлен,...)

События от внешних источников, например, от программы OnAir.

!!!Обращаем внимание, что эти функции декларируются как override, т.е. по своей сути они являются виртуальными. Это означает, что если вы их не переопределите в своем коде, то будут вызваны аналогичные методы из базовых классов титровальной системы.

Эти события возникают при выполнении в программе OnAir основных команд по управлению титрами - "Включить титровальный объект", "Выключить титровальный объект", "Прерывание исполнения объекта", "Загрузить титровальный объект".

override function Start(atStart : double, fadeDuration : double) - событие возникает при включении титровального объекта
override function Stop(atStop : double, fadeDuration : double) - событие возникает при выключении титровального объекта
override function Abort(fadeDuration : double) - событие возникает при прерывании воспроизведения титровального объекта
override function LoadTask(task: String ) - событие возникает при загрузке задания в титровальный объект

События от титровальных элементов, входящих в титровальный объект-"хозяин" скрипта

!!!Обращаем внимание, что эти функции декларируются как override, т.е. по своей сути они являются виртуальными. Это означает, что если вы их не переопределите в своем коде, то будут вызваны аналогичные методы из базовых классов титровальной системы.

override function OnStatusChanged(name: String, index: int, oldStatus: LogotypeLib.SLTMRunTimeStatus, newStatus: LogotypeLib.SLTMRunTimeStatus) - смена состояния титровального элемента name
override function OnStopTimeChanged(elementName: String, index: int, newStopTime: double) - изменение времени остановки титровального элемента name
override function OnElementStart(name: String, index: int, id: int, time: double, firstStopTime: double, stopTime: double, text: String) - старт титровального элемента name
override function OnElementFinishing(name: String, index: int, id: int, time: double, text: String) - титровальный элемент name практически закончил свой показ
override function OnElementStop(name: String, index: int, id: int, time: double, text: String)- титровальный элемент name полностью закончил свой показ


Теперь попробую ответить на вопросы.
1. Как (можно ли?) использовать функции класса Script?
нижеприведенный код должен по идее останавливать бегучку, но этого не происходит:
class Script extends SLTMTitleCommon.Scripting.ScriptBase {...}
var crawl = new Script(titleRoot);
crawl.Abort(5) //<-- функция выполняется но строка так и бежит //crawl.Stop тоже ничего не меняет
Нет, этот код ничего никому не должен.
Нельзя вызывать методы "на ровном" поле. Их можно вызывать только в пределах событий - см. п.6 и п.9
Напишите пример кода как запускать/останавливать титр


Открываем пример C:\Program Files\ForwardT Software\FDTitle\TitleScripting\CrawlPhoneStopSpace.SLTitleProj

Видим примерно следующее (здесь я сократил размер кода):

override function Stop(atStop : double, fadeDuration : double) : boolean {
try
{
Crawl.Stop(atStop, fadeDuration);

return true;
}
catch (ee)
{
;
}

return false;
}

Суть происходящего - бегучку останавливают тогда, когда снаружи останавливают титровальный объект ее содержащий. Соответственно все действия происходят в "событии" override function Stop. Жирным выделен сам процесс остановки.
2. Параметры atStop: double, fadeDuration: double, time: double это количество секунд?
Да.

Остальное немного позже.
advers
Сообщения: 5
Зарегистрирован: 28 май 2009 12:54
Откуда: Тюмень

Сообщение advers »

Здравствуйте. Тема затихла, видимо всем все ясно :)
А у меня вопрос возник по скрипту.

Когда я вызываю функцию:
Main1.LoadTask("Текст первого элемента однако", ETaskType.eTaskText);
то сразу же начинается воспроизведение в элементе Main1, а хотелось бы указать запуск чуть позже через Main1.Start(time,0) например.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

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

Функция LoadTask никогда не стартует вопроизведение титров. Скорее всего вы видите какой-то наведенный эффект.
но обсуждать эту проблему не имея достаточной информации нельзя. Нужно более детальное описание того, что вы видите. Например, текст вашего скрипта.
advers
Сообщения: 5
Зарегистрирован: 28 май 2009 12:54
Откуда: Тюмень

Сообщение advers »

Не знаю как тут на форуме с длинными постами со скрптами, потому положил скрипт на http://goo.gl/JoIFL

В бегущую строку загружается один и тот же текст для упрощения на период тестирования. Смысл в том чтобы сделать зацикленную бегущую строку, в данном случае используется 3 элемента "бегущая строка" Дальше, естественно, посложнее будет :)

Так вот у меня в версии 5.2.0 бежит это все в цикле очень замечательно и без Start. Строка 95.
shish07
Сообщения: 13
Зарегистрирован: 28 мар 2011 17:04

Сообщение shish07 »

advers писал(а):Когда я вызываю функцию:
Main1.LoadTask("Текст первого элемента однако", ETaskType.eTaskText);
то сразу же начинается воспроизведение в элементе Main1, а хотелось бы указать запуск чуть позже через Main1.Start(time,0) например.
Поведение функции LoadTask несколько отличается при работе под FDTitleDesigner и при работе под FDOnAir(или под FDTitleRunTimeTest.exe).
Разница заключается в том, что под FDOnAir(FDTitleRunTimeTest.exe) функция LoadTask всегда приводит к остановке элемента.
Под FDTitleDesigner все элементы запускаются в режиме превъю и по LoadTask перестартуют (начинают проигрывать новое задание). Это было сделано для того, чтобы пользователь, при загрузке задания (через OpenFileDialog), сразу увидел новое задание.

Чтобы предотвратить такое поведение элементов, в скрипте можно переопределить Функцию Start() и стартовать свои элементы в ней. Судя по приведённому стрипту вы собираетесь осуществлять достаточно сложное упраление элементами и вам это необходимо будет сделать.
advers
Сообщения: 5
Зарегистрирован: 28 май 2009 12:54
Откуда: Тюмень

Сообщение advers »

Хорошо. Благодарю, уже понтянее. Раз в FDTitleRunTimeTest работает как надо, буду тестировать в нем. Что мне даст переопределение Start не совсем ясно. Можно изнутри функции узнать какой элемент стартует?

И еще тогда вопрос, можно ли получить из титровального объекта все титровальные элементы ему принадлежащие? Хочется чтобы скрипт мог узнавать какие элементы есть, чтобы не прописывать их вручную.
shish07
Сообщения: 13
Зарегистрирован: 28 мар 2011 17:04

Сообщение shish07 »

advers писал(а):Что мне даст переопределение Start не совсем ясно. Можно изнутри функции узнать какой элемент стартует?
По умолчанию, по кнопке 'Start preview' FDTitleDesigner стартует ВСЕ элементы в режиме превъю.
Переопределив функцию Start() вы получаете полный контроль над стартом элементов. Т.е. вы сами должны будете старотовать только те элементы, которые вам необходимо. Насколько я понимаю, сначала вам надо старотовать только один элемент Main0, а затем, когда он закончится, стартовать следующий и т.д.
Кроме того, как я уже писал, стартовав элементы из скрипта вызовом функции Main0.Start(..), вы можете тестировать и отлаживатть скриты в самом FDTitleDesigner.
advers писал(а):И еще тогда вопрос, можно ли получить из титровального объекта все титровальные элементы ему принадлежащие? Хочется чтобы скрипт мог узнавать какие элементы есть, чтобы не прописывать их вручную.
Как написано в хелпе (TitleScriptDocumentation.chm), из скрипта доступен глобальный объект с именем 'titleRoot', типа 'TitleObjectWrapper'. У него есть свойство Count - кол-во элементов и индексированное свойство Item[], которое выдаёт элемент по индексу (0 <= i <= Count-1).

Успехов. Дмитрий.
advers
Сообщения: 5
Зарегистрирован: 28 май 2009 12:54
Откуда: Тюмень

Сообщение advers »

shish07 писал(а):Как написано в хелпе (TitleScriptDocumentation.chm),...
Вот это то, о чем я мечтал, но стеснялся спросить :)
Где можно добыть такой замечательный документ, чтобы не задавать глупые вопросы? При полной установке версии 5.2.0 такой не обнаружился.
Ответить