Запуск видеофайла с определенной временной позиции

Флейм. Только просьба - не материться! :)
kreator
✯ Ветеран ✯
Сообщения: 3468
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Запуск видеофайла с определенной временной позиции

Сообщение kreator » 20 Апрель 2016, 22:03

Функция:

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

PlayMedia            PROCEDURE  (LOC:File, LOC:From, LOC:Duration) ! Declare Procedure
LOC:SoundName        CSTRING(256)                          !
LOC:mciCommand       CSTRING(256)                          !
LOC:mciReturn        CSTRING(256)                          !
LOC:Extention        CSTRING(4)                            !

  CODE
! Включение или выключение звука
! Пауза
 if Loc:File='#'
   LOC:mciCommand = 'pause video'
!   LOC:mciCommand = 'pause sound'
   mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   return(1)
 elsif LOC:File='>'
   if LOC:From
     LOC:mciCommand = 'play video from ' & LOC:From
     mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   else   
     LOC:mciCommand = 'play video'
     mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   end   
   return 1
 elsif LOC:File='!'
   LOC:mciCommand = 'stop video'
   mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   LOC:mciCommand = 'close all'
   mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   return 1
 elsif LOC:File='?'   
   LOC:mciCommand = 'set video time format milliseconds'
   mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   LOC:mciCommand = 'status video length'
   mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   duration# = LOC:mciReturn 
   return duration#
 elsif LOC:File='??'   
   LOC:mciCommand = 'status video position'
   mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
   duration# = LOC:mciReturn 
   return duration#
 end

 ! Проверим, есть ли вообще звуковые каналы
 LOC:mciCommand = 'capability waveaudio can play'
 mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
 if upper(LOC:mciReturn)<>'TRUE'
  return 0
 end

 LOC:mciCommand = 'status video mode'
 mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
 LOC:mciCommand = 'stop video'
 mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
 LOC:mciCommand = 'close all'
 mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)

 if ~LOC:File
   return 0
 end   

 LOC:SoundName = clip(LOC:File)

 LOC:Extention = upper( sub( LOC:File, len( clip(LOC:File) ) -2, 3) )
 case LOC:Extention
   of 'WAV' 
   orof 'MP3' 
   orof 'OGG' 
!   orof 'MP4' 
   orof 'M4A' 
   orof 'WMA'
               LOC:mciCommand = 'open "' & LOC:SoundName & '" alias sound'
               mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
               LOC:mciCommand = 'play sound'
               if LOC:From
                 LOC:mciCommand = LOC:mciCommand & ' from ' & LOC:From * 10
               end
               If LOC:Duration
                 LOC:mciCommand = LOC:mciCommand & ' to ' & (LOC:From + LOC:Duration) * 10
               End
               mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
  of 'AVI'
               LOC:mciCommand = 'open "' & LOC:SoundName & '" alias sound'
               mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
               LOC:mciCommand = 'play sound fullscreen'
               mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
  of 'MP4' 
               LOC:mciCommand = 'open "' & LOC:SoundName & '" type mpegvideo alias video' ! Parent ' & 0{prop:Handle} & ' style child'
               mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
               LOC:mciCommand = 'play video'
               mciSendString(LOC:mciCommand, LOC:mciReturn, 128, 0)
 end
 return 1
Некоторые вызовы.
Старт:

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

if LOC:SoundFile2=LOC:SoundFile and LOC:Status=2
  if PlayMedia('>')
    LOC:Status = 1
  end
else  
  LOC:SoundFile2 = LOC:SoundFile
  if PlayMedia(LOC:SoundFile)
    LOC:Status = 1
    LOC:Duration = PlayMedia('?')
    ?Image2{prop:Hide} = False
  end  
end
Пауза:

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

if PlayMedia('#')
  LOC:Status = 2
end  
Останов:

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

if PlayMedia('!')
  LOC:Status = 0
  ?Image2{prop:Hide} = True
  ?Image2{prop:at,3} = 0
end
Старт с произвольного места:

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

x# = mousex() - ?Image1{prop:at,1}
from# = x# * LOC:Duration / ?Image1{prop:at,3}
if PlayMedia('>', from#)
end
Как-то так. Для начала покатило. Привязку к окну не допилил. Видимо, вот это не сделал:

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

 MciCmd = 'put ' & Vname & ' window client at ' & |
              Loc:N{Prop:Xpos}  & ' ' & |
              Loc:N{Prop:Ypos}   & ' ' & |
              W & ' ' & H 
              
We are hard at work… for you. :)

NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар

Запуск видеофайла с определенной временной позиции

Сообщение NewUser » 21 Апрель 2016, 21:54

Спасибо, kreator, здорово!
А как быть с функцией захвата и сохранения на диск скриншота? Она для меня принципиальна в своей архиважности!

kreator
✯ Ветеран ✯
Сообщения: 3468
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Запуск видеофайла с определенной временной позиции

Сообщение kreator » 22 Апрель 2016, 9:58

Я не занимался этим. Посмотри на форуме, где-то проскакивало. А, вообще, хорошо бы иметь функцию или может быть класс, которая (-ый) все возможности mciSendString учтёт. У меня руки не дойдут, не актуально и работы много другой.
We are hard at work… for you. :)

NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар

Запуск видеофайла с определенной временной позиции

Сообщение NewUser » 22 Апрель 2016, 10:13

Понял, спасибо.

Yufil
Ветеран движения
Сообщения: 1170
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Yufil » 22 Апрель 2016, 10:33

Есть такой пакет clarionfreeimage, халявный. http://www.clarionfreeimage.com/
Если его скачать, установить и погуглить 'clarionfreeimage screenshot'...
В общем, у меня работало, но удавалось сохранить только bmp, В jpg получалась знаменитая картина Малевича.
А ещё скриншотилось не текущее состояние окна, а предыдущее, приходилось пляски с бубном устраивать. В окончательную версию программы решили не включать :?

Вот, нашёл чужую переписку по этому поводу, там и фрагменты программ можно найти
http://78.83.222.4/index.php?group=9&id=16456

Yufil
Ветеран движения
Сообщения: 1170
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Yufil » 22 Апрель 2016, 10:38

mciSendString имеет много разных команд (грубо говоря, свой язык управления), у команд есть много разных параметров, некоторые параметры со временем изменяются или вовсе отменяются. Так что все возможности вряд ли удастся реализовать, да и не надо, наверное...
Надо просто открыть раздел в MSDN и внимательно просмотреть список команд.

NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар

Запуск видеофайла с определенной временной позиции

Сообщение NewUser » 22 Апрель 2016, 11:25

Попробую разобраться. Благодарю, Юрий!

Yufil
Ветеран движения
Сообщения: 1170
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Yufil » 23 Апрель 2016, 12:23

У нас контора (http://www.tacis-dipol.ru) помимо прочего занимается разного рода обучающими приложениями, в том числе включающими видео.
Большая часть делается на самопальной программе hyper-service (фрагменты кода я оттуда надёргал).
Сделать пачку экранчиков с фильмами, картинками, текстами, флэшками и простенькими скриптами для обработки - без проблем...
Есть частичный конвертор, преобразующий обучалку hyper-service в приложение HTML + JS (возможно, с поддержкой стандарта SCORM)
Может быть, больше ничего и не надо ?

Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Stalker » 24 Апрель 2016, 8:53

NewUser писал(а): Пишу БД по огромным залежам видео материалов разных категорий, тем, авторов и т.д. С доступом к каждой лекции (файл), разделу лекции (позиция в файле), тезису (еще одна временная подпозиция в файле), мыслям по тезису, скриншотами и т.п.
Чтобы не заморачиваться (по крайней мере на начальном этапе) с написанием своего плеера, принял решение использовать наиболее распространенный, содержащий все необходимые функции для видео просмотра, а также умеющий позиционироваться на нужном месте при запуске из командной строки.
Добрый день! Писал прогу примерно такой же тематики, программный комплекс для создания электронных учебников, ЭУМК (электронных учебно-методических комплексов) и других информресурсов. Одним из элементов комплекса является работа с видео материалом, то есть в проге есть встроенный плеер который при загрузке пути (ссылки) загружает файл и проигрывает его с начальной позиции. Но ваша идея обратится к определенному месту файла меня заинтересовала, так как дает дополнительные возможности детализации лекции не используя дробление основного файла на более мелкие (это и увеличение объема и временных затрат). В моем ПК используется File Explorer от CapeSoft.Посмотрел документацию там имеется метод : ( прошу не смотреть на ошибки текста-таков автоперевод)

ThisViewer1.Navigate (1)! Перейти к первой странице
ThisViewer1.Navigate (5, 3)! На страницу 3
ThisViewer1.Navigate (3, 0, 50)
Этот метод используется для навигации в пределах загруженного файла. Расположение параметр может быть одним из следующих :
1 - Гото начало загруженного файла
2 - Переход к предыдущей странице или назад на один "шаг" или "кадр"
3 - Переход к следующей странице, или вперед на один "шаг" или "кадр"
4 - Гото конец загруженного файла
5 - Гото специфический "PageNumber" (если вы используете этот параметр, передайте номер страницы в качестве второго [опционально] параметр - как показано ниже в примере 2)
Примечание: Если вы используете местоположение 2 или 3 для объекта Media Player, то Navigate метод будет фактически принять вас к предыдущему или следующему кадру загруженного фильма. На самом деле вы на самом деле прыгать вперед или назад на заданное число миллисекунд, создавая впечатление , что вы прыжки кадры. Число миллисекунд по умолчанию равно 100 (т.е. одна десятая секунды). Если вы предпочитаете использовать другой временные рамки, вы можете передать количество миллисекунд в качестве OPTIONALS третьего параметра. Пример 3 показывает , как переход вперед к следующему "рамке", где следующий кадр 50 миллисекунд после текущего кадра, а не 100 мс по умолчанию:

Поэтому попробую внедрить в прогу (ПК GIOS) доступ к определенному месту файла а затем отпишусь. В проге скриншоты экранов можно присоединять в виде html файла. Для этого делать скриншот экрана на нужном месте,нажав клавишу PrtSc и в текстовом редакторе Word вставить в файл картинку и сохранить его в виде html, а затем в проге сделать на него ссылку.
Кстати прогу можно скачать с адреса http://stalker1960.ucoz.net и интегрировать под свои нужды.Она в свободном плавании.
С уважением Stalker.
Специализация - программы для образования, делопроизводство, складской учет

Аватара пользователя
Admin
Администратор
Сообщения: 3482
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Admin » 24 Апрель 2016, 14:40

Stalker писал(а): Кстати прогу можно скачать с адреса
Убрал бы рыбу... "LOREM IPSUM SIT DOLOR"
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Stalker » 24 Апрель 2016, 15:05

А что это такое... я в английском не силен брал стандартный шаблон ucoz при разработке сайта, а текст не мог убрать если не трудно что там написано....Спасибо...
Специализация - программы для образования, делопроизводство, складской учет

Аватара пользователя
Admin
Администратор
Сообщения: 3482
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Admin » 24 Апрель 2016, 16:51

Да просто текстовая заготовка описания картинки.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Stalker » 24 Апрель 2016, 17:02

Спасибо !
Специализация - программы для образования, делопроизводство, складской учет

NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар

Запуск видеофайла с определенной временной позиции

Сообщение NewUser » 24 Апрель 2016, 18:24

Stalker писал(а): Кстати прогу можно скачать с адреса
Скачал. Запустил. При запуске программа выдала сообщение о том, что необходимая для её запуска библиотека PWUTIL.dll отсутствует. Это так задумано?

Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Запуск видеофайла с определенной временной позиции

Сообщение Stalker » 24 Апрель 2016, 20:24

NewUser писал(а): Скачал. Запустил. При запуске программа выдала сообщение о том, что необходимая для её запуска библиотека PWUTIL.dll отсутствует. Это так задумано?
Нет, должна работать, все нужные библиотеки (*.dll) в корне проги, а данный файл как я понимаю относится к системе Windows. Есть одно ограничение, прога работает только в 32 разрядных системах винды.
Кстати, как я и думал можно организовать доступ к любой точке видео-моно файла, это уже реализовал для видео файлов. Как сделаю для звуковых загружу новую версию.
Для этого в форме дополнительно к полю ссылки (путь для загрузки файла) добавил числовое поле, определяющее сколько секунд нужно пропустить от начала и после этого начать показ ролика, причем это всего несколько строчек кода типа
if kol_kadrow <>0 ! поле отступа от начала файла не равно 0
ThisViewer1.Navigate (5, kol_kadrow *1000) ! kol_kadrow = 20 сек,40 и т.д перевод секунд под шаблон
ThisViewer1.Play()
.
В самом окне плэера создал кнопку с таким же кодом а рядом поле типа long для ввода сек, в поле вводим кол сек и нажимаем кнопку , идет переход к указанному месту. Вот только нет показа при проигрывании позиции ползунка в сек. Переход к нужному месту приходится делать методом подбора отступа в сек. Но думаю это поправимо.
Специализация - программы для образования, делопроизводство, складской учет

Ответить