Да, именно поэтому там и нужно это проверять, ибо событие срабатывает и после отображения картинки. Сам этот цикл вечного запуска на телеке наблюдал, пока проверку не сделал.
Так, погодите. У меня это дело срабатывало после запуска отображения картинки, потом опять запускалось отображение картинки...
А у вас видео не до конца проигралось, а уже сработал скрипт окончания воспроизведения??
По-идее, скрипт №2 должен сработать только по окончании видео ролика.
А у вас он через 1-2 секунды после начала.. Хм. А ролики локально расположены? У них в программе время (длительность) правильно выставлена?
Какое-то из устройств посылает HMS, что он проиграл файл. Проверить настройки устройств, все ли поддерживают UPnP-события. Там в "UPnP, DLNA" в самом низу есть галочка "Обработка запроса окончания транскодированного файла", может её убрать, а то он как передал файл телеку, так и сформировал событие "окончания"...
Но, это всё догадки и предположения.
По F8 да, переменная CurrentMediaItem не будет установлена. Я добавлял в код такие строки:
HmsLogMessage(1, "CurrentMediaItem[mpiTitle ]: "+CurrentMediaItem[mpiTitle ]);
HmsLogMessage(1, "CurrentMediaItem[mpiFilePath]: "+CurrentMediaItem[mpiFilePath]);
HmsLogMessage(1, "CurrentMediaItem.ItemParent[mpiTitle ]: "+CurrentMediaItem.ItemParent[mpiTitle ]);
HmsLogMessage(1, "CurrentMediaItem.ItemParent[mpiFilePath]: "+CurrentMediaItem.ItemParent[mpiFilePath]);
Чтобы при срабатывании скрипта в лог программы вываливались сообщения и там смотрел.
Если так и не выяснится причина срабатывания этого события раньше времени, то можно в крайнем случае, применить грязный хак: проверять в скрипте №2 сколько времени прошло с момента запуска скрипта №1.
Типа того:
var
MediaFolder: THmsScriptMediaItem; nCounter: Integer;
begin
//MediaFolder := HmsFindMediaFolder(mfVideoPodcastsFolderItemID, '-Showroom');
MediaFolder := HmsFindMediaFolder(mfVideoCollectionsItemID, 'Test');
if (MediaFolder <> nil) and MediaFolder.HasChildItems then begin
nCounter := MediaFolder[mpiTrack]; // Получаем значение счётчика очерёдности
HmsPlayToGroup(MediaFolder.ChildItems[nCounter], 'GroupNoOne', false); // Запуск воспроизведения очередного видео из папки
nCounter := nCounter + 1; // Увеличиваем счётчик
if nCounter >= MediaFolder.ChildCount then nCounter := 0; // Если значение счётчика больше количества видео - начинаем сначала
MediaFolder[mpiTrack ] := nCounter; // Запоминаем значение счётчика в свойствах папки
MediaFolder[mpiTimeStart] := DateTimeToTimeStamp1970(Now, false); // Запоминаем TimeStamp старта показа видео
end;
end.
// Находим папку с видео, после которых будет запускаться заставка
VideoFolder := HmsFindMediaFolder(mfVideoCollectionsItemID, 'Test');
//VideoFolder := HmsFindMediaFolder(mfVideoPodcastsFolderItemID, '-Showroom');
if VideoFolder<> nil then begin
n := DateTimeToTimeStamp1970(Now, false) - StrToIntDef(VideoFolder[mpiTimeStart], 0);
if n < 30 then Exit; // Если прошло менее 30 сек - выходим, не срабатываем.
end;
...
Т.е. если прошло менее 30 сек, скрипт №2 не будет срабатывать.
Но тут нужно чтобы он сработал после 30 секунд. Нужно проверить, может быть он после 30 секунд и не сработает - устройства уже послали событие "конец показа".
А ещё проблема может поджидать в том, что устройств то не одно и каждый будет посылать событие об окончании - и будет срабатывать скрипт несколько раз, заставка запускаться для всех несколько раз - будет дёргаться изображение, как минимум.
Так что первоначальная моя идея не годится.
Поэтому, думаю, код запуска заставок должен срабатывать не по событию, всё-таки, а по таймеру после срабатывания группового запуска видео.
Это можно сделать в одном скрипте.
Const VideosDuration = 30; // Длительность видео по-умолчанию (через сколько секунд будут включены заставки)
///////////////////////////////////////////////////////////////////////////////
// Отображение заставок (фото) на устройствах (вызывается таймером "Timer4GroupNoOne")
Procedure ShowPictures();
Var
MediaFolder, MediaItem: THmsScriptMediaItem; n: Integer;
Begin
HmsExecuteByTimer("Timer4GroupNoOne", "", 0); // Сброс таймера
//HmsLogMessage(1, "Сработала функция отображения заставок");
// Находим папку с фото, которые будут отображаться на разных устройствах
MediaFolder := HmsFindMediaFolder(mfImageAlbumsItemID, '-Showroom');
if (MediaFolder <> nil) and MediaFolder.HasChildItems then begin
// В цикле обходим все картинки и запускаем их на показ устройствам
// по MAC-адресу, указанному в комментариях к картинке
for n := 0 to MediaFolder.ChildCount - 1 do begin
MediaItem := MediaFolder.ChildItems[n];
HmsPlayToDevice(MediaItem, MediaItem[mpiComment], false)
end;
end;
End;
///////////////////////////////////////////////////////////////////////////////
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
Var
MediaFolder, MediaItem: THmsScriptMediaItem; nCounter, nTime: Integer;
Begin
// Находим папку с видео, которые мы будем запускать
//MediaFolder := HmsFindMediaFolder(mfVideoPodcastsFolderItemID, '-Showroom');
MediaFolder := HmsFindMediaFolder(mfVideoCollectionsItemID, 'Test');
if (MediaFolder <> nil) and MediaFolder.HasChildItems then Begin
nCounter := MediaFolder[mpiTrack]; // Получаем значение счётчика очерёдности
MediaItem := MediaFolder.ChildItems[nCounter]; // Получаем элемент очередного видео
HmsPlayToGroup(MediaItem, 'GroupNoOne', false); // Запуск воспроизведения очередного видео из папки
nCounter := nCounter + 1; // Увеличиваем счётчик
if nCounter >= MediaFolder.ChildCount then nCounter := 0; // Если значение счётчика больше количества видео - начинаем сначала
MediaFolder[mpiTrack] := nCounter; // Запоминаем значение счётчика в свойствах папки
nTime := HmsTimeConvert(MediaItem[mpiTimeLength]); // Получаем длительность видео в секундах
if nTime = 0 then nTime := VideosDuration; // Если длительности видео нет, то по-умолчанию 30 сек
HmsExecuteByTimer("Timer4GroupNoOne", "ShowPictures", nTime); // Запускаем таймер, который через n секунд вызовет функцию "ShowPictures"
End;
End.
При таком случае скрипт нужен только один и не нужно выставлять скрипт на событие "После завершения воспроизведения медиа-ресурса" (очистить то поле).
А для этого скрипта просто настроить запуск по-расписанию.
При экспериментах с функцией HmsExecuteByTimer осторожней! При срабатывании данной функции, делается слепок данного скрипта и вызываемая функция хранится где-то в памяти, пока не будет сброшен таймер вызовом этой функции с ИД таймера и пустыми параметрами. Это значит, что просто отредактировав код вызываемой функции (например, там забыли вызвать сброс таймера), это никак не повлияет на периодический вызов функции и она всё также будет вызываться пока не будет исполнена новая команда вызова HmsExecuteByTimer с данным идентификатором.
Sony Bravia KDL-32CX523