среда, 15 июня 2016 г.

Soft DVR. Эмулятор видеорегистратора с циклической записью с IP камеры

Данный эмулятор (VBS скрипт) служит программным видеорегистратором (Soft DVR) с автоматическим контролем свободного места на дисковом пространстве с ведением лога и циклическим захватом видеопотоков в формат MPG с таких источников как IP (сетевая) камера, рабочий стол, WEB-камера или любое другое DirectShow-устройство в вашей ОС. По завершению работы эмулятор производит слияние всего видеоконтента в один файл с прореживанием кадров для последующего ускоренного просмотра.



Cистемные требования и зависимости:
  1. Windows 9х/NT/XP/Vista/7/8/8.1/10.
  2. Наличие кроссплатформенного фреймворка FFMPEG (приложена портабле 32bit версия).


Возможности
  1. Циклическая проверка свободного места на заданном диске.
  2. Если есть место на диске, запускаем на заданный интервал времени с конвертацией в заданный формат через FFMPEG в скрытом режиме захват потока - сетевого медиапотока c IP-камеры; экрана рабочего стола или DirectShow-устройства (WEB-камеры, тюнера, той же сетевой камеры через DS.JPEG фильтр).
  3. Если места на диске не хватает, удаляется самый старый файл заданного формата до достижения свободного места.
  4. При завершении работы скрипта производится склеивание медиафайлов в один с прореживанием кадров для последующего ускоренного просмотра.
  5. Завершение работы скрипта по нажатию клавиши 'ESCAPE'.
Код эмулятора (полностью на VBS):
' ПОЛЬЗОВАТЕЛЬСКИЕ ПАРАМЕТРЫ =====================================
' Адрес и порт вещания сетевой камеры, логин и пароль доступа

adress = "rtsp://192.168.0.254:8080"
login = "admin"
pass = "password"
' Контролируемый диск
namedisk = "d"
' Минимум свободного места, MB
free = 27000
' Формат файла, в который пишем и контролируем в каталоге 'grab'.
' MPG задан из соображений возможности их прямой склейки FFMPEG-ом.

ext = "mpg"
' Разрешаем склеивание
enfull = true
' Формат файла склеивания
extout = "mp4"
' Разрешаем голосовое сопровождение.
' В боевом режиме в false, чтобы избежать пропусков между интервалами захвата!!!
' Захват разбит на интервалы с целью минимизации загрузки процессора и
' памяти при записи больших по длительности файлов.

speakon = false


' ПАРАМЕТРЫ ИНИЦИАЛИЗАЦИИ ========================================
' Месторасположение эмулятора видеорегистратора

DirPath = WScript.ScriptFullName
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
DirPath = fso.GetParentFolderName(DirPath)
' Целевая папка для сохранения медиапотока с IP-камеры
FolderPath = DirPath & "\grab"
enn = fso.FolderExists(FolderPath)
If (enn = false) then
 fso.createfolder FolderPath
End if
' Файл логгирования
Logger = "\delete_" & Date & ".log"

' Захват сетевого потока IP камеры через FFMPEG по 5 минут записи
'grabing = "ffmpeg.exe" & chr(34) & " -t 00:05:00 -i " & adress & "/user=" & login & "&" & pass & "&channel=1&stream=0.sdp -vcodec copy -b:v 64k " & chr(34) & FolderPath & "\"
' Захват экрана рабочего стола по 30 сек, через DS-фильтр https://sourceforge.net/projects/screencapturer
'grabing = "ffmpeg.exe" & chr(34) & " -t 00:00:05 -f dshow -i video=screen-capture-recorder -r 24000/1001 -q 1 " & chr(34) & FolderPath & "\"
' Захват видео с DirectShow-устройства (WEB-камеры) по 30 сек
grabing = "ffmpeg.exe" & chr(34) & " -t 00:00:05 -f dshow -s 640x480 -i video=" & chr(34) & "Lenovo EasyCamera" & chr(34) & " " & chr(34) & FolderPath & "\"


' Доступ к SAPI
Set Speak = CreateObject("sapi.spvoice")
' Доступ к Shell
Set WshShell = WScript.CreateObject("WScript.Shell")
' регистрируем COM объект DynamicWrapperX в тихом режиме
WshShell.Run "regsvr32.exe dynwrapx.dll /s",3, true
' создаем объект DynamicWrapperX.2
Set Wrap = CreateObject("DynamicWrapperX.2")
' Подключаем функцию перехвата нажатий клавиш
Wrap.Register "user32.dll", "GetAsyncKeyState", "i=l", "f=s", "r=l"
' Доступ к свойствам диска
Set disk = fso.GetDrive(namedisk)

' Информируем пользователя о начале работы
if (speakon = true) then
 Speak.Speak "Видеорегистратор запущен. "&"Контроль диска, " & namedisk &", запущен."
End if


' ОСНОВНОЙ ЦИКЛ =========================================
' ставим перехватчик ошибок, если не удается удалить файл
' да и нечего юзверю на ошибки смотреть :)

On Error Resume Next
' по условию нажатия 'Escape' выходим из цикла
Do While Wrap.GetAsyncKeyState(27) = "0"

' свободно на диске, MB
FreeSpace = disk.FreeSpace/1024/1024
' озвучиваем
if (speakon = true) then
 Speak.Speak "Свободно на диске " & FreeSpace & " мегабайт."
End if
  
' проверяем свободное место
if (FreeSpace < free) then

    ' Открываем файл для дозаписи сеансов
    Set f = fso.OpenTextFile(FolderPath & Logger, 8, True)

    ' Сканируем целевой каталог-сборник
    OldDate = Date
    OldName = ""
    Set Files = FSO.GetFolder(FolderPath).Files
    For Each File In Files ' получаем список файлов с расширением EXT
     If LCase(fso.GetExtensionName(file)) = ext Then

      ' Получаем дату последней модификации файла
      If (file.datelastmodified < OldDate) Then
       OldDate = file.datelastmodified
       OldFile = file.Path
       OldName = file.name
      End If

     End If
    Next

    if (OldName<>"") then
     ' озвучиваем
     if (speakon = true) then
      Speak.Speak "Удаляем самый старый найденный файл. " & OldName
     End if
     ' удаляем самый старый найденный файл
     fso.DeleteFile(OldFile)
     ' Дозапись сеансов
     f.WriteLine(OldFile)
    End if
    ' закрываем файл для дозаписи сеансов
    f.Close

' если места хватает, запускаем грабинг
else
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Запускаем грабинг."
 End if
 path = chr(34) & DirPath & "\" & grabing & Date & "_" & hour(time) & "-" & minute(time) & "-" & second(time) & "." & ext & chr(34)
 ' запускаем внешнюю утилиту в скрытом режиме
 ' и приостанавливаем работу скрипта до завершения внешнего приложения

 WshShell.Run path, 0, true
End if 

Err.Clear
loop ' завершаем цикл
On Error GoTo 0


' склеиваем
if (enfull = true) then
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Склеиваем видео файлы."
 End if

 ' Склейка медиафайлов в один большой с ускоренной промоткой
 ' Ускорение в десять раз = 1/10=0.1

 lists = ""
 Set Files = FSO.GetFolder(FolderPath).Files
 For Each File In Files ' получаем список файлов с расширением EXT
  If LCase(fso.GetExtensionName(file)) = ext Then
   lists = lists & chr(34) & file.Path & chr(34) & "|"
  End If
 Next
 full = "ffmpeg.exe" & chr(34) & " -i " & chr(34) & "concat:" & lists & chr(34) & " -qscale:v 0 -filter:v " & chr(34) & "setpts=0.1*PTS" & chr(34) & " -an " & chr(34) & FolderPath & "\all." & extout & chr(34)
 path = chr(34) & DirPath & "\" & full
 ' запускаем внешнюю утилиту в скрытом режиме
 ' и приостанавливаем работу скрипта до завершения внешнего приложения
 ' FIX: данная функция не работает без конвертации в CP866 (OEM) путей с кириллицей
 ' добавление кавычек или кода символа 34 проблему не решает для параметра concat утилиты FFMPEG

 WshShell.Run path, 0, true
End if

' озвучиваем
if (speakon = true) then
 Speak.Speak "Видеорегистратор отключен."
End if

ПОРЯДОК УСТАНОВКИ И ОГРАНИЧЕНИЯ
  1. Производите копирование каталога 'EmulVideoReg' со всем содержимым на локальный ПК в требуемый каталог (без кириллицы и пробелов, см.выше FIX). 
  2. Производите регистрацию OLE-сервера 'DynWrapX.2' в ОС путем запуска bath-файла 'regdynwrapx.bat' от имени Администратора по правой кнопке мыши в ОС выше Vista.
  3. Задаете требуемые пользовательские параметры (адрес IP-камеры, логин, пароль, контролируемый диск, предел свободного пространства на диске, формат конвертации видеопотоков и формат файла для ускоренного просмотра, метод захвата путем комментирования/раскомментирования параметра 'grabing') в скрипте 'emulvideoreg.vbs'.
  4. Запуск скрипта производите командным файлом 'runemulvideoreg.cmd' от имени Администратора.
  5. При необходимости помещаете командный файл 'runemulvideoreg.cmd' в автозагрузку.
Ресурсы
  1. Скачать сабж 
  2. Скачать с моего SourceForge
Профит :)

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.