<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Неофициальный форум DLNA Home Media Server &mdash; Возврат к воспроизведению после выполнения обработки по расписанию]]></title>
	<link rel="self" href="https://hms.lostcut.net/extern.php?action=feed&amp;tid=283&amp;type=atom" />
	<updated>2016-11-08T18:22:24Z</updated>
	<generator>PunBB</generator>
	<id>https://hms.lostcut.net/viewtopic.php?id=283</id>
		<entry>
			<title type="html"><![CDATA[Re: Возврат к воспроизведению после выполнения обработки по расписанию]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=6471#p6471" />
			<content type="html"><![CDATA[<p>Только сегодня добрался до этой задачи. Проверил, второй вариант отрабатывает замечательно. Единственное, что заставки могут по таймингу не совпадать. Но это решается клонированием скрипта и запуском каждого скрипта по своему расписанию.</p><p>Еще раз огромное спасибо за помощь!</p>]]></content>
			<author>
				<name><![CDATA[Snake]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=672</uri>
			</author>
			<updated>2016-11-08T18:22:24Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=6471#p6471</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Возврат к воспроизведению после выполнения обработки по расписанию]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=6443#p6443" />
			<content type="html"><![CDATA[<p>Да, именно поэтому там и нужно это проверять, ибо событие срабатывает и после отображения картинки. Сам этот цикл вечного запуска на телеке наблюдал, пока проверку не сделал.</p><p>Так, погодите. У меня это дело срабатывало после запуска отображения картинки, потом опять запускалось отображение картинки...<br />А у вас <strong>видео</strong> не до конца проигралось, а уже сработал скрипт окончания воспроизведения??</p><p>По-идее, скрипт №2 должен сработать только <strong>по окончании</strong> видео ролика.<br />А у вас он через 1-2 секунды после начала.. Хм. А ролики локально расположены? У них в программе время (длительность) правильно выставлена?</p><p>Какое-то из устройств посылает HMS, что он проиграл файл. Проверить настройки устройств, все ли поддерживают UPnP-события. Там в &quot;UPnP, DLNA&quot; в самом низу есть галочка &quot;Обработка запроса окончания транскодированного файла&quot;, может её убрать, а то он как передал файл телеку, так и сформировал событие &quot;окончания&quot;...<br />Но, это всё догадки и предположения.</p><p>По F8 да, переменная CurrentMediaItem не будет установлена. Я добавлял в код такие строки:<br /></p><div class="codebox"><pre><code>  HmsLogMessage(1, &quot;CurrentMediaItem[mpiTitle   ]: &quot;+CurrentMediaItem[mpiTitle   ]);
  HmsLogMessage(1, &quot;CurrentMediaItem[mpiFilePath]: &quot;+CurrentMediaItem[mpiFilePath]);
  HmsLogMessage(1, &quot;CurrentMediaItem.ItemParent[mpiTitle   ]: &quot;+CurrentMediaItem.ItemParent[mpiTitle   ]);
  HmsLogMessage(1, &quot;CurrentMediaItem.ItemParent[mpiFilePath]: &quot;+CurrentMediaItem.ItemParent[mpiFilePath]);</code></pre></div><p>Чтобы при срабатывании скрипта в лог программы вываливались сообщения и там смотрел.</p><p>Если так и не выяснится причина срабатывания этого события раньше времени, то можно в крайнем случае, применить грязный хак: проверять в скрипте №2 сколько времени прошло с момента запуска скрипта №1.<br />Типа того:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Скрипт №1</div><div class="fancy_spoiler"><div class="codebox"><pre><code>var
  MediaFolder: THmsScriptMediaItem; nCounter: Integer;
begin
  //MediaFolder := HmsFindMediaFolder(mfVideoPodcastsFolderItemID, &#039;-Showroom&#039;);
  MediaFolder := HmsFindMediaFolder(mfVideoCollectionsItemID, &#039;Test&#039;);
  if (MediaFolder &lt;&gt; nil) and MediaFolder.HasChildItems then begin
    nCounter := MediaFolder[mpiTrack];                                     // Получаем значение счётчика очерёдности
    HmsPlayToGroup(MediaFolder.ChildItems[nCounter], &#039;GroupNoOne&#039;, false); // Запуск воспроизведения очередного видео из папки
    nCounter := nCounter + 1;                                              // Увеличиваем счётчик
    if nCounter &gt;= MediaFolder.ChildCount then nCounter := 0;              // Если значение счётчика больше количества видео - начинаем сначала
    MediaFolder[mpiTrack    ] := nCounter;                                 // Запоминаем значение счётчика в свойствах папки
    MediaFolder[mpiTimeStart] := DateTimeToTimeStamp1970(Now, false);      // Запоминаем TimeStamp старта показа видео
  end;
end.</code></pre></div></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;В скрипте №2</div><div class="fancy_spoiler"><div class="codebox"><pre><code>  // Находим папку с видео, после которых будет запускаться заставка
  VideoFolder := HmsFindMediaFolder(mfVideoCollectionsItemID, &#039;Test&#039;);
  //VideoFolder := HmsFindMediaFolder(mfVideoPodcastsFolderItemID, &#039;-Showroom&#039;);
  
  if VideoFolder&lt;&gt; nil then begin
    n := DateTimeToTimeStamp1970(Now, false) - StrToIntDef(VideoFolder[mpiTimeStart], 0);
    if n &lt; 30 then Exit; // Если прошло менее 30 сек - выходим, не срабатываем.
  end;
  ...</code></pre></div></div></div><p>Т.е. если прошло менее 30 сек, скрипт №2 не будет срабатывать.<br />Но тут нужно чтобы он сработал после 30 секунд. Нужно проверить, может быть он после 30 секунд и не сработает - устройства уже послали событие &quot;конец показа&quot;.</p><p>А ещё проблема может поджидать в том, что устройств то не одно и каждый будет посылать событие об окончании - и будет срабатывать скрипт несколько раз, заставка запускаться для всех несколько раз - будет дёргаться изображение, как минимум.<br /><strong>Так что первоначальная моя идея не годится.</strong></p><p>Поэтому, думаю, код запуска заставок должен срабатывать не по событию, всё-таки, а по таймеру после срабатывания группового запуска видео.<br />Это можно сделать в одном скрипте.</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Скрипт запуска видео и заставок</div><div class="fancy_spoiler"><div class="codebox"><pre><code>Const VideosDuration = 30; // Длительность видео по-умолчанию (через сколько секунд будут включены заставки)

///////////////////////////////////////////////////////////////////////////////
// Отображение заставок (фото) на устройствах (вызывается таймером &quot;Timer4GroupNoOne&quot;)
Procedure ShowPictures();
Var
  MediaFolder, MediaItem: THmsScriptMediaItem; n: Integer;
Begin
  HmsExecuteByTimer(&quot;Timer4GroupNoOne&quot;, &quot;&quot;, 0); // Сброс таймера
  //HmsLogMessage(1, &quot;Сработала функция отображения заставок&quot;);
  
  // Находим папку с фото, которые будут отображаться на разных устройствах
  MediaFolder := HmsFindMediaFolder(mfImageAlbumsItemID, &#039;-Showroom&#039;);
  
  if (MediaFolder &lt;&gt; 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, &#039;-Showroom&#039;);
  MediaFolder := HmsFindMediaFolder(mfVideoCollectionsItemID, &#039;Test&#039;);
  if (MediaFolder &lt;&gt; nil) and MediaFolder.HasChildItems then Begin
    nCounter  := MediaFolder[mpiTrack];                           // Получаем значение счётчика очерёдности
    MediaItem := MediaFolder.ChildItems[nCounter];                // Получаем элемент очередного видео
    HmsPlayToGroup(MediaItem, &#039;GroupNoOne&#039;, false);               // Запуск воспроизведения очередного видео из папки
    nCounter := nCounter + 1;                                     // Увеличиваем счётчик
    if nCounter &gt;= MediaFolder.ChildCount then nCounter := 0;     // Если значение счётчика больше количества видео - начинаем сначала
    MediaFolder[mpiTrack] := nCounter;                            // Запоминаем значение счётчика в свойствах папки
    nTime := HmsTimeConvert(MediaItem[mpiTimeLength]);            // Получаем длительность видео в секундах
    if nTime = 0 then nTime := VideosDuration;                    // Если длительности видео нет, то по-умолчанию 30 сек
    HmsExecuteByTimer(&quot;Timer4GroupNoOne&quot;, &quot;ShowPictures&quot;, nTime); // Запускаем таймер, который через n секунд вызовет функцию &quot;ShowPictures&quot;
  End;
End.</code></pre></div></div></div><p>При таком случае скрипт нужен только один и не нужно выставлять скрипт на событие &quot;После завершения воспроизведения медиа-ресурса&quot; (очистить то поле).<br />А для этого скрипта просто настроить запуск по-расписанию.</p><p><em>При экспериментах с функцией HmsExecuteByTimer осторожней! При срабатывании данной функции, делается слепок данного скрипта и вызываемая функция хранится где-то в памяти, <strong>пока не будет сброшен таймер вызовом этой функции с ИД таймера и пустыми параметрами</strong>. Это значит, что просто отредактировав код вызываемой функции (например, там забыли вызвать сброс таймера), это никак не повлияет на периодический вызов функции и она всё также будет вызываться <strong>пока не будет исполнена новая команда вызова HmsExecuteByTimer с данным идентификатором</strong>.</em></p>]]></content>
			<author>
				<name><![CDATA[WendyH]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=2</uri>
			</author>
			<updated>2016-11-06T07:35:21Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=6443#p6443</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Возврат к воспроизведению после выполнения обработки по расписанию]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=6439#p6439" />
			<content type="html"><![CDATA[<p>Большое человеческое спасибо за помощь!</p><p>Есть только одна проблема. Через 1-2 секунды после начала воспроизведения видео оно прерывается и на экран выводится картинка. Я так полагаю, что у меня некорректно отрабатывает вот эта строчка второго скрипта:</p><div class="codebox"><pre><code>if (MediaFolder &lt;&gt; nil) and MediaFolder.HasChildItems and (CurrentMediaItem.ItemParent = VideoFolder) then begin</code></pre></div><p>Как вы писали:<br /></p><div class="quotebox"><blockquote><p>Эта обработка будет запускаться всегда, когда будет окончено воспроизведение показа видео или фото или чего бы то нибыло. Поэтому в этой обработке мы проверяем, откуда сработал скрипт и является ли текущий элемент воспроизведения нашим видео из нашей папки. Если да, то обрабатываем - запускаем цикл воспроизведения наших фото на конкретных устройствах, MAC-адреса которых прописаны в комментариях к фото.</p></blockquote></div><p>Т.е. я так думаю, что сразу после запуска видео срабатывает триггер на событие &quot;После завершения воспроизведения медиа-ресурса&quot; (показ картинки),&nbsp; выполняется обработка и срабатывает указанное выше условие. Соответственно тут же запускается показ картинок, а видео прерывается. Посмотреть текущее значение CurrentMediaItem.ItemParent я не могу, в редакторе по F8 этого значения не увидишь.<br />У Вас я так понимаю все корректно отработало. Почему у меня проблема - не могу понять. Делал все в точности по инструкции, видео лежит в коллекции Test, фото в альбоме -Showroom.<br />На всякий прилагаю обработки. Версия сервера - 2.20.</p>]]></content>
			<author>
				<name><![CDATA[Snake]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=672</uri>
			</author>
			<updated>2016-11-06T01:18:46Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=6439#p6439</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Возврат к воспроизведению после выполнения обработки по расписанию]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=6435#p6435" />
			<content type="html"><![CDATA[<p>Можно сделать следующим образом.</p><p>Допустим, в HMS у нас есть папка с нашими видео.<br />Также у нас есть в разделе &quot;Фото&quot; папка с фотографиями. Например, в разделе Альбомы создадим папку &quot;Showroom&quot; со значением поля &quot;Файл&quot; -Showroom.</p><p>В папке фотографий, добавляем ссылки на фотографии, которые будут высвечиваться на устройствах как заставки. В каждой такой ссылке на фото в поле &quot;Комментарий&quot; указываем MAC-адрес устройства, на котором данная картинка будет отображаться.</p><p>В папке видео добавляем ссылки на видео файлы, которые будут по очереди воспроизводится.</p><p>Теперь нужно создать две обработки.<br />Одну как у вас - она будет по расписанию запускать видео (например, каждые 30 мин).<br />Вторая обработка будет запускать воспроизведение фото на устройства.</p><p><strong>Вот пример первой обработки:</strong><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Запуск видео по-расписанию</div><div class="fancy_spoiler"><div class="codebox"><pre><code>var
  MediaFolder: THmsScriptMediaItem; nCounter: Integer;
begin
  MediaItem := HmsFindMediaFolder(mfVideoCollectionsItemID, &#039;Test&#039;);
  if (MediaFolder &lt;&gt; nil) and MediaFolder.HasChildItems then begin
    nCounter := MediaFolder[mpiTrack];                                     // Получаем значение счётчика очерёдности
    HmsPlayToGroup(MediaFolder.ChildItems[nCounter], &#039;GroupNoOne&#039;, false); // Запуск воспроизведения очередного видео из папки
    nCounter := nCounter + 1;                                              // Увеличиваем счётчик
    if nCounter &gt;= MediaFolder.ChildCount then nCounter := 0;              // Если значение счётчика больше количества видео - сбрасываем счётчик
    MediaFolder[mpiTrack] := nCounter;                                     // Запоминаем значение счётчика в свойствах папки
  end;
end.</code></pre></div></div></div><br /><p><strong>Пример второй обработки:</strong><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Запуск отображения заставок</div><div class="fancy_spoiler"><div class="codebox"><pre><code>var
  MediaFolder, MediaItem, VideoFolder: THmsScriptMediaItem; n: Integer;
begin
  // Находим папку с видео, после которых будет запускаться заставка
  VideoFolder := HmsFindMediaFolder(mfVideoCollectionsItemID, &#039;Test&#039;);
  
  // Находим папку с фото, которые будут отображаться на разных устройствах
  MediaFolder := HmsFindMediaFolder(mfImageAlbumsItemID, &#039;-Showroom&#039;);
  
  // Проверяем, есть ли папка с фото и точно ли произошёл запуск этого скрипта
  // после остановки наших видео (проверяем, является ли родительский элемент
  // текущего элемента той папкой, которая содержит наши видео)
  if (MediaFolder &lt;&gt; nil) and MediaFolder.HasChildItems and (CurrentMediaItem.ItemParent = VideoFolder) then begin
  
    // В цикле обходим все картинки и запускаем их на показ устройствам
    // по MAC-адресу, указанному в комментариях к картинке
    for n := 0 to MediaFolder.ChildCount - 1 do begin
      MediaItem := MediaFolder.ChildItems[n];
      HmsPlayToDevice(MediaItem, MediaItem[mpiComment], false)
    end;
    
  end;
  
end.</code></pre></div></div></div><p>И вторую обработку &quot;Запуск отображения заставок&quot; выставляем в настройках, в разделе &quot;События&quot; в событии &quot;После завершения воспроизведения медиа-ресурса&quot;.<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p><span class="postimg"><img src="https://hms.lostcut.net/misc.php?action=pun_attachment&amp;item=1416" alt="https://hms.lostcut.net/misc.php?action=pun_attachment&amp;amp;item=1416" /></span></p></div></div><p>Эта обработка будет запускаться всегда, когда будет окончено воспроизведение показа видео или фото или чего бы то нибыло. Поэтому в этой обработке мы проверяем, откуда сработал скрипт и является ли текущий элемент воспроизведения нашим видео из нашей папки. Если да, то обрабатываем - запускаем цикл воспроизведения наших фото на конкретных устройствах, MAC-адреса которых прописаны в комментариях к фото.</p><p>Осталось выставить расписание запуска обработки, запускающей видео на группу устройств и будет происходить следующее:<br />1) Запустится видео из папки в соответствии с счётчиком, счётчик увеличится;<br />2) По окончании воспроизведения видео запустится обработка запуска воспроизведения заставок на устройствах;<br />3) Заставка будет отображаться пока не случится событие по расписанию и не запустится цикл с пункта 1).</p><p>Как то вот так.</p><p>Для кучи, прилагаю свои тестовые обработки. Правда я сделал папку с видео как папку в разделе &quot;Подкасты&quot; и там воспроизводятся ссылки с видео ресурса, а не локальные видео-файлы. Но, думаю, под себя всё сделать не составит труда.<br /> Showroom_Photos - это папка раздела &quot;Фото&quot; в папке &quot;Альбомы&quot; со списком фотографий (заставок).<br /> Showroom_Videos - это папка подкаста с видео ссылками, видео которых будет запускаться по-расписанию.</p>]]></content>
			<author>
				<name><![CDATA[WendyH]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=2</uri>
			</author>
			<updated>2016-11-05T18:20:41Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=6435#p6435</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Возврат к воспроизведению после выполнения обработки по расписанию]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=6430#p6430" />
			<content type="html"><![CDATA[<p>Добрый день!</p><p>Есть следующая задача. На четырех телевизорах в баре отображается меню в виде статичной картинки jpg. На каждом телевизоре своя картинка. Возникла потребность раз в полчаса крутить на всех четырех экранах 30-секундный ролик. Пока один, но боюсь в будущем их будет около 10 и каждые полчаса нужно будет крутить новый по кругу. По аналогии с DLNA-будильником сделал обработку, запускаю ее раз в полчаса:</p><div class="codebox"><pre><code>var
  MediaItem: THmsScriptMediaItem;
begin
  MediaItem := HmsFindMediaFolder(mfVideoCollectionsItemID, &#039;Test&#039;);
  if (MediaItem &lt;&gt; nil) and MediaItem.HasChildItems then
    HmsPlayToGroup(MediaItem.ChildItems[0], &#039;GroupNoOne&#039;)  
end.</code></pre></div><p>Отрабатывает нормально, но после демонстрации ролика - черный экран. А вот как сделать, чтобы после демонстрации ролика на каждом телевизоре опять автоматически отображалась своя картинка - не знаю. Если кто-то может поделиться опытом реализации подобного решения или хотя бы подскажет, в какую сторону копать - буду весьма признателен.<br />Заранее благодарю за ответы.</p>]]></content>
			<author>
				<name><![CDATA[Snake]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=672</uri>
			</author>
			<updated>2016-11-05T11:41:14Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=6430#p6430</id>
		</entry>
</feed>
