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

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

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

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

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

По поводу "захвата" tga-файлов.
Поисследовали. К сожалению, проблема не у нас, а у корпорации Микрософт.
При загрузке нового задания в титровальный элемент DirectShow мы "убиваем" граф, который был создан для показа предыдущего файла, и создаём новый. Так вот при удалении старого графа в нём происходит взрыв. В результате он не закрывается нормально и не "отпускает" tga-файл.

Единственный выход - это использовать для показа tga и роликов титровальный элемент АнимЛого.
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Сообщение AlMaz »

Добрый день. Новый вопрос.

При нажатии кнопки "стоп" такой цикл корректно оборвет все?

for (var i:int = titleRoot.Count-1 ; i >= 0; i--) {
if (titleRoot.Status!=SLTMRunTimeStatus.eStopped) {
titleRoot.Abort( 0);
}
}

Или лучше просто руками поименно останавливать:

UPSHOW_4.Abort( 0);
..
UPSHOW_1.Abort( 0);
SOUND_1.Abort(0);
BACKGROUND_1.Abort(0);
MAIN.Abort(0);
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

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

Нужно использовать немного другую логику поведения.
У вас есть (по всей видимости служебный) элемент MAIN. Который, как мне представляется, живёт всё время работы титровального скрипта.
В обработчике команды Stop именно ему нужно говорить stop(). Причём с тем временем, которое прилетает в обработчик.
А уже потом ловить нотификационное сообщение об остановке MAIN и останавливать (через команду abort()) все остальные ваши элементы.

По конструкции. Преимущество цикла состоит в том, что вам не нужно задумываться в случае расширения количества титровальных элементов в скрипте. Добавили новый и он автоматически обработается в цикле.
Во втором варианте (при ручном управлении) вам потребуется не забыть добавить новый элемент в цепочку остановки.

И ещё. Если вы используете команду abort(), а не stop() для остановки элементов, то статус можно не проверять.
Т.е. проверку titleRoot.Status!=SLTMRunTimeStatus.eStopped можно убрать.
svnvlad
Сообщения: 1
Зарегистрирован: 16 сен 2013 16:41

Сообщение svnvlad »

Здравствуйте, уважаемые специалисты!
В титровалках не понимаю ничего, возникла необходимость из внешней программы на Delphi импортировать данные в реальном времени для отображения их на ТВ. Я представляю, что, видимо, у титровалки должно быть API для импорта данных из внешнего источника. Я хочу импортировать текстовые данные, а в титровалке, вроде, есть уже свое оформление, дизайн.
Что можете пояснить, ответить по данному вопросу?
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

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

Для начала хотелось бы услышать ответы на пару вопросов:

1)Речь идёт о какой-то абстрактной титровалке? Или речь идёт о титровальной системе наших продуктов?
2)У вас есть какое-нибудь наше ПО + железо?
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Сообщение AlMaz »

Добрый день. Возник еще один вопрос.
Расскажите в каком порядке обрабатываются функции
function CleanUp(obj, e : VsaScriptingHostEventArgs)
и
function Unload(): boolean.

В CleanUp я чищу массив

var i:int;
while (WORKSCENE_BANERS.Count>0) { // чистим сценарий
i=WORKSCENE_BANERS.Count-1;
WORKSCENE_BANERS=null;
WORKSCENE_BANERS.RemoveAt(i);
}

А по своим логам не вижу что функция CleanUp вообще вызывается =(.
shish07
Сообщения: 13
Зарегистрирован: 28 мар 2011 17:04

Сообщение shish07 »

Добрый день.
AlMaz писал(а):Расскажите в каком порядке обрабатываются функции
function CleanUp(obj, e : VsaScriptingHostEventArgs)
и
function Unload(): boolean.
Методы вызываются в таком порядке:
1. Unload()
2. CleanUp()

И тот и другой вызываются когда Титровальный Объект выгружается из памяти. Просто это происходит на разных этапах.
Unload() вызывается когда объект(и скрипт) ещё живой и в этот момент можно вызывать методы Титровальных Элементов.
CleanUp() вызывается когда выгружается исполняющая среда скрипта, и в нём можно делать только самые необходимые действия (Release COM объектам, если они создавались и т.д.)

Есть один нюанс. В TitleDesigner-е и в OnAir-е это происходит немного по разному.
Разность заключается в том что, инициализация и выгрузка в TitleDesigner-е происходит при каждом запуске/остановке просмотра, а OnAir-e это происходит один единственный раз, инициализация - при загрузке всего проекта(старте OnAir-а), выгрузка при выходе из OnAir или при выгрузке/перезагрузке всего проекта.
AlMaz писал(а):А по своим логам не вижу что функция CleanUp вообще вызывается =(.
Вы не забыли в конструкторе или методе init() вставить строчку

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

 
        _scriptingHost.add_CleanUp(CleanUp);
Вот такие дела!

[/code]
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Сообщение AlMaz »

Спасибо. Заработало. Действительно, не знал, что строчку надо добавить =(
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Сообщение AlMaz »

Добрый день.

Нужен ваш совет.

Делаю выдачу рекламных банеров во время эфира. Выдается картинка на 5-8 секунд, затем пауза, затем новая по сценарию.

Реализовал такой механизм:
Элемент MAIN (подпись) - главный, живет все время между стартом/стопом титр.скрипта.

Элементы BANER_1, BANER_2 (подпись) - это сами выдаваемые картинки.

Элемент TIMER (подпись) - зацикленный, время цикла пауза+время выдаваемой картинки.

В OnElementStop - TIMERа, останавливаю по Abort текущий первый банер на всякий случай (если он не остановился). Перезагружаю в него задание и запускаю второй.
Или наоборот - если крутился второй, остановим его, загрузим, запустим уже подготовленный первый.

Но иногда возникает проблема что TIMER успевает запустить банер во время обработки стопа/аборта скрипта. Или сам продолжает крутиться не смотря на то что скрипт уже остановлен =)

Ясно что дело в моем непонимании принципов работы титр.элементов и в реализации на программном уровне.

Сейчас дошло, что можно вроде обойтись без этого зацикленного элемента.

И просто по OnElementStop BANER_1 - запускать BANER_2.

Расскажите:

1) Можно ли в OnElementStop BANER_1 - делать его же перезагрузку
BANER_1 .LoadTask() ?
2) Можно ли там же менять его параметры - время выезда/нахождения на экране?
3) Или придется в OnElementStop BANER_1 сначала BANER_2 .LoadTask() потом BANER_1 .Start()?
shish07
Сообщения: 13
Зарегистрирован: 28 мар 2011 17:04

Сообщение shish07 »

Добрый день!
AlMaz писал(а): можно вроде обойтись без этого зацикленного элемента.
И просто по OnElementStop BANER_1 - запускать BANER_2.
Совершенно верно, в OnElementStop от одного элемента можно вычислять время старта следующего и запускать его на проигрывание.
AlMaz писал(а): Расскажите:
1) Можно ли в OnElementStop BANER_1 - делать его же перезагрузку
BANER_1 .LoadTask() ?
2) Можно ли там же менять его параметры - время выезда/нахождения на экране?
3) Или придется в OnElementStop BANER_1 сначала BANER_2 .LoadTask() потом BANER_1 .Start()?
Загружать задания и менять параметры, в OnElementStop, для элемента пославшего уведомление, можно но не желательно.
Это связано с тем, что OnElementStop (так-же OnElementStart и OnElementFinising) посылаются примерно за 5 кадров(не больше) до указанного времени события.
Это сделано для того чтобы можно было вовремя (заранее) стартовать следующий элемент, но загрузка задания приведёт к немедленной остановке текущего элемента.
Иногда это приводит к нежелательным визуальным артефактам.

Так-же есть одна особенность у элемента 'Подпись' - после изменения параметров влияющих на длительность (InDuration, OutDuration, Speed, ...),
информацию о задании (GetTaskInfo(), GetPlayInfo()) можно спрашивать только через некоторое время, конкретно, через время кадра (40мс для PAL).

В Вашем случае, если расписание известно заранее, можно сделать например так:
1. В методе Start() (в большом старте всего объекта) загрузить задание для элемента BANER_1 и запустить MAIN и BANER_1 (в указанное время)
2. В OnElementStart от очередного элемента(BANER_1), загрузить задание для следующего(BANER_2) и занести его в список готовых.
3. В OnElementStop от очередного элемента(BANER_1), запустить следующий из списка готовых(BANER_2).
4. Ну и так далее флип/флоп, пока не закончится список заданий или не прилетит OnElementStop от MAIN или OnStatusChanged от MAIN.

или так:

1. В методе Start() (в большом старте всего объекта) загрузить задания для элементов BANER_1 и BANER_2, запустить MAIN и BANER_1 (в указанное время)
2. В OnElementStop от очередного элемента(BANER_1), запустить следующий готовый(BANER_2).
3. В OnStatusChanged (newStatus == SLTMRunTimeStatus.eStopped) от очередного элемента(BANER_1), загрузить задание для него-же(BANER_1).
OnStatusChanged прилетает когда статус элемента уже изменился.
4. Ну и так далее флип/флоп, пока не закончится список заданий или не прилетит OnElementStop от MAIN или OnStatusChanged от MAIN.

Примерно такое поведение реализовано в примере 'AdvMix', только там более сложные задания ещё и разных типов.

Успехов.
Vados
Сообщения: 7
Зарегистрирован: 03 апр 2014 03:44

Сообщение Vados »

Здравствуйте.

Пытаюсь реализовать следующее:
при старте титровального объекта, состоящего, например, из двух титровальных элементов, первый элемент стартует сразу, а второй элемент через 5 секунд.

Как я понимаю, сделать это можно двумя путями: с помощью пауз в расписании (OnAir) или с помощью титровальных скриптов. Последнее снижает количество лишних элементов в расписании, однако писать скрипты на JScript.Net я не умею :)
Возможно у кого-то уже есть подобные решения, или хотя бы примерное (может смогу разобраться)? Пробовал ещё QML, но как понял, он по большому счёту здесь для анимаций.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

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

QML для вашей задачи не подходит. Он действительно предназначен для анимации, а не для управления.
Есть скрипты с открытым кодом (TSF_), которые нами разрабатывались в качестве примеров для самостоятельного написания. Если есть желание, то можете воспользоваться ими.
http://www.softlab-nsk.com/rus/forward/ ... d.html#tsf
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Сообщение AlMaz »

Добрый день. Снова вас Красноярск беспокоит по скриптам =) Возникла такая задача:
- есть два титр. обекта логотип канала, логотип новостей. Когда на эфире один - второго не показываем. Это просто картинки. Запускаются вручную.
- есть третий титр. объект: плашка "далее". Она должна выдаваться в разные места в зависимости от того логотипа что на экране.

Не хочется делать еще 2 картинки "далее" на кнопки выпускающему. Хотелось бы иметь один титр. объект "Далее" с двумя картинками.

Вы писали что в скрипте титр. объекта можно работать только с элементами титр.объекта к которому скрипт относится.

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

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

К сожалению, доступиться до других объектов из скрипта невозможно в принципе.

А почему нельзя всё перенести в один объект?
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Сообщение AlMaz »

Не можем перенести в один объект - потому что тогда как оператору вручную включать нужный один из 2-х логотипов?
Ответить