Титровальные скрипты
Модераторы: Людмила, PR, vd, Даниленко Сергей
-
- Сообщения: 7091
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
По поводу "захвата" tga-файлов.
Поисследовали. К сожалению, проблема не у нас, а у корпорации Микрософт.
При загрузке нового задания в титровальный элемент DirectShow мы "убиваем" граф, который был создан для показа предыдущего файла, и создаём новый. Так вот при удалении старого графа в нём происходит взрыв. В результате он не закрывается нормально и не "отпускает" tga-файл.
Единственный выход - это использовать для показа tga и роликов титровальный элемент АнимЛого.
Поисследовали. К сожалению, проблема не у нас, а у корпорации Микрософт.
При загрузке нового задания в титровальный элемент DirectShow мы "убиваем" граф, который был создан для показа предыдущего файла, и создаём новый. Так вот при удалении старого графа в нём происходит взрыв. В результате он не закрывается нормально и не "отпускает" tga-файл.
Единственный выход - это использовать для показа tga и роликов титровальный элемент АнимЛого.
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Добрый день. Новый вопрос.
При нажатии кнопки "стоп" такой цикл корректно оборвет все?
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);
При нажатии кнопки "стоп" такой цикл корректно оборвет все?
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 можно убрать.
У вас есть (по всей видимости служебный) элемент MAIN. Который, как мне представляется, живёт всё время работы титровального скрипта.
В обработчике команды Stop именно ему нужно говорить stop(). Причём с тем временем, которое прилетает в обработчик.
А уже потом ловить нотификационное сообщение об остановке MAIN и останавливать (через команду abort()) все остальные ваши элементы.
По конструкции. Преимущество цикла состоит в том, что вам не нужно задумываться в случае расширения количества титровальных элементов в скрипте. Добавили новый и он автоматически обработается в цикле.
Во втором варианте (при ручном управлении) вам потребуется не забыть добавить новый элемент в цепочку остановки.
И ещё. Если вы используете команду abort(), а не stop() для остановки элементов, то статус можно не проверять.
Т.е. проверку titleRoot.Status!=SLTMRunTimeStatus.eStopped можно убрать.
-
- Сообщения: 1
- Зарегистрирован: 16 сен 2013 16:41
Здравствуйте, уважаемые специалисты!
В титровалках не понимаю ничего, возникла необходимость из внешней программы на Delphi импортировать данные в реальном времени для отображения их на ТВ. Я представляю, что, видимо, у титровалки должно быть API для импорта данных из внешнего источника. Я хочу импортировать текстовые данные, а в титровалке, вроде, есть уже свое оформление, дизайн.
Что можете пояснить, ответить по данному вопросу?
В титровалках не понимаю ничего, возникла необходимость из внешней программы на Delphi импортировать данные в реальном времени для отображения их на ТВ. Я представляю, что, видимо, у титровалки должно быть API для импорта данных из внешнего источника. Я хочу импортировать текстовые данные, а в титровалке, вроде, есть уже свое оформление, дизайн.
Что можете пояснить, ответить по данному вопросу?
-
- Сообщения: 7091
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Добрый день. Возник еще один вопрос.
Расскажите в каком порядке обрабатываются функции
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 вообще вызывается =(.
Расскажите в каком порядке обрабатываются функции
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 вообще вызывается =(.
-
- Сообщения: 13
- Зарегистрирован: 28 мар 2011 17:04
Добрый день.
1. Unload()
2. CleanUp()
И тот и другой вызываются когда Титровальный Объект выгружается из памяти. Просто это происходит на разных этапах.
Unload() вызывается когда объект(и скрипт) ещё живой и в этот момент можно вызывать методы Титровальных Элементов.
CleanUp() вызывается когда выгружается исполняющая среда скрипта, и в нём можно делать только самые необходимые действия (Release COM объектам, если они создавались и т.д.)
Есть один нюанс. В TitleDesigner-е и в OnAir-е это происходит немного по разному.
Разность заключается в том что, инициализация и выгрузка в TitleDesigner-е происходит при каждом запуске/остановке просмотра, а OnAir-e это происходит один единственный раз, инициализация - при загрузке всего проекта(старте OnAir-а), выгрузка при выходе из OnAir или при выгрузке/перезагрузке всего проекта.
Вот такие дела!
[/code]
Методы вызываются в таком порядке:AlMaz писал(а):Расскажите в каком порядке обрабатываются функции
function CleanUp(obj, e : VsaScriptingHostEventArgs)
и
function Unload(): boolean.
1. Unload()
2. CleanUp()
И тот и другой вызываются когда Титровальный Объект выгружается из памяти. Просто это происходит на разных этапах.
Unload() вызывается когда объект(и скрипт) ещё живой и в этот момент можно вызывать методы Титровальных Элементов.
CleanUp() вызывается когда выгружается исполняющая среда скрипта, и в нём можно делать только самые необходимые действия (Release COM объектам, если они создавались и т.д.)
Есть один нюанс. В TitleDesigner-е и в OnAir-е это происходит немного по разному.
Разность заключается в том что, инициализация и выгрузка в TitleDesigner-е происходит при каждом запуске/остановке просмотра, а OnAir-e это происходит один единственный раз, инициализация - при загрузке всего проекта(старте OnAir-а), выгрузка при выходе из OnAir или при выгрузке/перезагрузке всего проекта.
Вы не забыли в конструкторе или методе init() вставить строчкуAlMaz писал(а):А по своим логам не вижу что функция CleanUp вообще вызывается =(.
Код: Выделить всё
_scriptingHost.add_CleanUp(CleanUp);
[/code]
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Добрый день.
Нужен ваш совет.
Делаю выдачу рекламных банеров во время эфира. Выдается картинка на 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()?
Нужен ваш совет.
Делаю выдачу рекламных банеров во время эфира. Выдается картинка на 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()?
-
- Сообщения: 13
- Зарегистрирован: 28 мар 2011 17:04
Добрый день!
Это связано с тем, что 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', только там более сложные задания ещё и разных типов.
Успехов.
Совершенно верно, в OnElementStop от одного элемента можно вычислять время старта следующего и запускать его на проигрывание.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 (так-же 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', только там более сложные задания ещё и разных типов.
Успехов.
-
- Сообщения: 7
- Зарегистрирован: 03 апр 2014 03:44
Здравствуйте.
Пытаюсь реализовать следующее:
при старте титровального объекта, состоящего, например, из двух титровальных элементов, первый элемент стартует сразу, а второй элемент через 5 секунд.
Как я понимаю, сделать это можно двумя путями: с помощью пауз в расписании (OnAir) или с помощью титровальных скриптов. Последнее снижает количество лишних элементов в расписании, однако писать скрипты на JScript.Net я не умею
Возможно у кого-то уже есть подобные решения, или хотя бы примерное (может смогу разобраться)? Пробовал ещё QML, но как понял, он по большому счёту здесь для анимаций.
Пытаюсь реализовать следующее:
при старте титровального объекта, состоящего, например, из двух титровальных элементов, первый элемент стартует сразу, а второй элемент через 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
Есть скрипты с открытым кодом (TSF_), которые нами разрабатывались в качестве примеров для самостоятельного написания. Если есть желание, то можете воспользоваться ими.
http://www.softlab-nsk.com/rus/forward/ ... d.html#tsf
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Добрый день. Снова вас Красноярск беспокоит по скриптам =) Возникла такая задача:
- есть два титр. обекта логотип канала, логотип новостей. Когда на эфире один - второго не показываем. Это просто картинки. Запускаются вручную.
- есть третий титр. объект: плашка "далее". Она должна выдаваться в разные места в зависимости от того логотипа что на экране.
Не хочется делать еще 2 картинки "далее" на кнопки выпускающему. Хотелось бы иметь один титр. объект "Далее" с двумя картинками.
Вы писали что в скрипте титр. объекта можно работать только с элементами титр.объекта к которому скрипт относится.
Возможно ли получить свойства от других титр. объектов, в частности на экране лого или нет? И в зависимости от этого скриптом плашки "далее" выдавать именно ту картинку на том месте которое нужно.
- есть два титр. обекта логотип канала, логотип новостей. Когда на эфире один - второго не показываем. Это просто картинки. Запускаются вручную.
- есть третий титр. объект: плашка "далее". Она должна выдаваться в разные места в зависимости от того логотипа что на экране.
Не хочется делать еще 2 картинки "далее" на кнопки выпускающему. Хотелось бы иметь один титр. объект "Далее" с двумя картинками.
Вы писали что в скрипте титр. объекта можно работать только с элементами титр.объекта к которому скрипт относится.
Возможно ли получить свойства от других титр. объектов, в частности на экране лого или нет? И в зависимости от этого скриптом плашки "далее" выдавать именно ту картинку на том месте которое нужно.
-
- Сообщения: 7091
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация: