Автоматизация выхода титровальных объектов (текст+подложка)

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

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

Ответить
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

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

Я сделал и с добавлением строки и с импортом ДДЛ, теперь при запуске всё останавливается на строке TitleManager->Init(project, 0, &guidTitleTarget); и говорит "Project Project1.exe raised exception class EAccessViolation with message "Access violation at address 00401B3B in module 'Project1.exe'. Read of address 00000000'
Вот сижу и думаю что бы это значило. :(
amir
Сообщения: 11
Зарегистрирован: 15 дек 2003 12:51
Откуда: Softlab-Nsk

Сообщение amir »

Что можно сказать?
Попробуйте подсунуть неверный GUID - должно вернуть Class not regidtered, попробуйте неверное имя файла - должно поругаться.
Если все так будет, возможно дело в проекте, если нет - что-то не то в коде.
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

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

Хм, поставил вместо CLSID_SLTMTitleServerTargetMgr CLSID_TitleProjectMgr, затем имя файла сделал несуществующего-в обоих случиях ничего в ошибке не поменялось. :(
Тут ещё одна вещь-если я ставлю BSTR project = SysAllocString("D:\BS\MUZ.SLTitleProj");, то выдает ошибку: [C++ Error] Unit1.cpp(27): E2034 Cannot convert 'char *' to 'const wchar_t *'
[C++ Error] Unit1.cpp(27): E2340 Type mismatch in parameter 1 (wanted 'const wchar_t *', got 'char *'). Когда я просто пишу TitleManager->Init( (BSTR) "D:\BS\MUZ.SLTitleProj", 0, &guidTitleTarget); , то вроде запускается и уже ругается ошибкой, которую я выше написал. Большая ли разница в этом самом (BSTR) "D:\BS\MUZ.SLTitleProj" ? Так можно делать? Может быть это всё из-за этого?
vd
Сообщения: 2311
Зарегистрирован: 05 мар 2003 19:21

Сообщение vd »

Когда я просто пишу TitleManager->Init( (BSTR) "D:\BS\MUZ.SLTitleProj"
Так делать нельзя. Почитайте про работу с BSTR. Такую строку нужно правильно выделять в памяти. Если в вашем Builder поддерживается ATL, то в ней должен быть класс CComBSTR - нужно пользоваться им, например:

CComBSTR bstrProj("D:\BS\MUZ.SLTitleProj");

и далее передавать в Init указатель на переменную bstrProj.

Если же ATL у вас нет, то нужно именно выделять строку, а только потом ее передавать. Почему у вас компилятор ругается - не знаю. У нас на 6-м Builder никто не пишет, только на MS Visual Studio, так что помочь вам несколько затруднительно.

Могу лишь предположить, что в SysAllocString нужно передавать OLE-строку (юникодную), а вы пытаетесь передать обычную (ANSI). Преобразуйте строку сначала в Wide Char, а потом передавайте.

В VisualStudio для этого строку достаточно окружить макросом TEXT("string") или _T("string"), или просто перед первой кавычкой добавить L"string". Надеюсь, что какая-то из этих конструкций должна сработать и в Builder.
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

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

Ок, попробую с BSTR поиграться.
Вообще, я уже думаю посмотреть, хотя бы дома, на MS Visual Studio, если там проще всё делается, то может есть смысл свои маленькие программки автоматизации переписать на нем. Но пока что надо постараться добиться вывода из того, что уже есть.
P.S. Спасибо за помощь
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

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

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

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

В нашем SDK есть документ, описывающий как можно получать требуемую информацию из программы OnAir.
SDK можно взять здесь:
http://www.softlab-nsk.com/rus/forward/ ... areSDK.zip
Вам нужны следующие документы:
...\Other\OnAirExternalTaskMsg.doc
...\Other\OnAirTitleMessages.txt
vd
Сообщения: 2311
Зарегистрирован: 05 мар 2003 19:21

Сообщение vd »

Вы из своей программы управляете титрами, которые в самом OnAir не загружены? Если так, то совершенно логично, что он вашими титрами управлять не может - он при них ничего не знает.
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

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

День добрый.
Попытался я сделать что-нибудь путное с OnAirExternalTaskMsg.doc, OnAirTitleMessages.txt ...что-то получилось, но мне не нравится. Во - первых я не понял содержимое OnAirTitleMessages.txt :(
А из OnAirExternalTaskMsg.doc сделал вот что: висит второй он-аир, в нем расписание вида:
wait follow 0
waitshout raz_dva_tri
titleObjLoad {TitleObject} 0:00:00.96 d:\bs\tochka.txt
repeat script

Когда включены титры в ОнАире, то расписание мне через каждую секунду стукается в мою прогу и она знает, что титры можно пускать, если секунду с половиной нет этого запроса, то титры выключаются. Вроде работает(уже даже это дело в эфире запустил), но есть недостатки всего этого: 1) все равно запускать два онАира, 2) внизу экрана пробегает маленькая точка(tochka.txt), хотя её практически ни один телек не показывает 3) сработка ТитрамСтоп в моей проге происходит с задержкой(почти в 2 секунды). :(
Как бы это все-таки по-лучше сделать? (без второго ОнАира и вообще без всех этих выкрутасов) Просто чтобы шел в ОнАир запрос из моей проги, а он бы отвечал(титры вкл или нет) и как можно чаще(чтобы срабатка выкления титров была быстрей).
amir
Сообщения: 11
Зарегистрирован: 15 дек 2003 12:51
Откуда: Softlab-Nsk

Сообщение amir »

Поскольку ваша программа уже ловит сообщения shoot/waitshoot, то вам нужно доработать ее совсем немного.

OnAirTitleMessages.txt:
#define FrwMsgAirTitling (1<<16)
WPARAM = FrwMsgAirTitling+(BoardIndex<<8)+cmd
enum cmd {amAsk,amLogo,amTitle,amTime};

amAsk - запущенная задача шлет эту команду, чтобы кто-нибудь сообщил ей текущие значения Logo и Title.
amLogo - сообщает LPARAM = Logo
amTitle - сообщает LPARAM = Title
amTime - сообщает LPARAM = Time, (решено) через сколько миллисекунд в расписании будет TitleOff.
Time == 0 - означает отсутствие ограничений.
BoardIndex всегда на единицу меньше номера платы.
Предположим, вы работаете на третьей плате.

При старте программы вы один раз перебираете все top-level окошки с классом TForwardMessager и вызываете
PostMessage(hwnd,WM_USER,0x10200,0);
0x10200 = FrwMsgAirTitling+(2<<8)+amAsk

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

Ваша программа, получив сообщение WM_USER, должна проверить,
что это титровальное сообщение:
WPARAM & 0xffff0000 == FrwMsgAirTitling,
и что это сообщение относится к вашей плате:
(WPARAM>>8) & 0xff == 2.

После этого код (WPARAM & 0xff) определяет значение величины в LPARAM.
amLogo(1) - LPARAM = текущее значение Logo
amTitle(2) - LPARAM = текущее значение Title
amTime(3) - LPARAM = через сколько миллисекунд в расписании будет TitleOff. 0 - означает отсутствие ограничений.
ВОВАН
Сообщения: 168
Зарегистрирован: 16 окт 2005 03:02
Откуда: г.Туапсе

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

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

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

Пожалуйста, обращайтесь еще :)
dmitro_sev
Сообщения: 92
Зарегистрирован: 05 фев 2009 17:40
Откуда: севастополь
Контактная информация:

Сообщение dmitro_sev »

Доброе время суток!!! Подскажите, пожалуйста, как составить расписание в air, идея токая в расписании ставим показывать видео на проход 20 мин, а за 1 минуту до конца показа включить титр «Смотрите дальше …», титр создан как рекламный блок
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

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

Например, вот так:
Изображение

1)в команде "видео" время не указывается
2)пауза на 18 минут
3)запускаем "рекламный блок", но обязательно с командой запускать следующий одновременно (голубая стрелка), чтобы длительность титров не учитывалась
4)пауза на 2 минуты
dmitro_sev
Сообщения: 92
Зарегистрирован: 05 фев 2009 17:40
Откуда: севастополь
Контактная информация:

Сообщение dmitro_sev »

ОК СПАСИБО :)
Ответить