Работа с объектами

IP-камеры, каналы, шаблоны, входы, выходы, сервера, зоны SIMT и многие другие объекты собраны в дерево. Дерево объектов можно увидеть в интерфейсе оператора, отобразив в шаблоне Дерево объектов (CMS) или добавить в скрипт нажав кнопку Вставить -> Объекты в редакторе скриптов.

Все объекты объединены в классы:

  • Folder - класс родительских объектов ("Channels", "IP Devices", "Templates"), которым принадлежат все остальные классы;
  • Server - класс подключенных серверов;
  • IP Device - класс подключенных IP-устройств;
  • Channel - класс подключенных каналов;
  • GPIO Input - класс тревожных входов;
  • GPIO Output - класс тревожных выходов;
  • OperatorGUI - класс интерфейса оператора;
  • Template - класс шаблонов.

Чтобы запросить список объектов класса, необходимо вызвать функцию objects_list().

	alert(objects_list("Channel"))

В сообщении будет показан массив, состоящий из объектов класса "Channel".

[
	('AC-D1050 1', 'Qmez0La2', 'Channel', 'p0aDXZdXC'), 
	('DVS Full 8', 'nBSAqWT1', 'Channel', 'p0aDXZdXC'), 
	('DVS Full 1', 'xeLzkjpd', 'Channel', 'p0aDXZdXC')
]

В данном примере ответ содержит:

  • 'AC-D1050 1' - имя объекта;
  • 'Qmez0La2' - уникальный guid объекта;
  • 'Channel' - класс объекта;
  • 'p0aDXZdXC' - guid родительской объекта, которому принадлежит данный объект.

Кроме этого, у каждого объекта есть состояние и методы, то есть функции которые можно вызвать.

Найти объект в скрипте очень просто:

	obj = object("Камера 1")

Состояние объекта можно узнать вызовом функции state(). У каждого объекта есть несколько состояний (вектор состояния). Например у канала есть состояния "motion", "signal", "recording", "recording_on_device".

	m = obj.state("motion")
	if m=="No Motion":
		alert("Движения нет")

Чтобы выяснить, какие состояния есть у объекта, нужно вызвать state() с произвольной строкой. Текст ошибки при выполнении этой операции будет содержать названия элементов в векторе состояний.

Чтобы узнавать об изменениях состояния, нужно использовать активацию по состоянию объекта:

	cam1 = object("Камера 1")
	def f():
		message("Движение: %s" % cam1.state["motion"])
	cam1.activate_on_state_changes(f)

Кроме состояния, можно выяснить имя, идентификатор, класс объекта.

	alert(obj.name)
	alert(obj.guid)
	alert(obj.class_name)

Список методов также можно узнать при помощи функции dir(), которая распечатывает содержимое любой структуры в Python.

alert(dir(obj))
Методы объекта класса "канал"
	cam1 = object("Камера 1")
  • Включить запись архива канала

    	obj.manual_record_start()
  • Выключить запись архива канала

    	obj.manual_record_stop()
  • Получить положение поворотной камеры

    	obj.ptz_position_query()

    Значения сохраняются в настройках камеры:

    	settings("channels/[GUID_канала]/ptz/current_pan")
    	settings("channels/[GUID_канала]/ptz/current_tilt")
    	settings("channels/[GUID_канала]/ptz/current_zoom")
  • Переместить поворотную камеру на предустановку [preset]

    	obj.ptz_preset([preset])
  • Включить запись

    	obj.record(True or False)
  • Выключить ручную запись архива канала

    	obj.record_off()
  • Включить ручную запись архива канала

    	obj.record_on()
  • Сохранить скриншот

    	obj.screenshot()
  • Сохранить скриншот из архива

    	obj.screenshot_ex("[timestamp]", "[directory]")

    [timestamp] - время кадра из архива;

    [directory] - директория на сервере, в которую сохраняется скриншот.

  • Сохранить скриншот из архива

    	obj.screenshot_v2("[time]", "[filename]", "[directory]", [make_thumb])

    [time] - время кадра из архива;

    [filename] - имя сохраняемого скриншота;

    [directory] - директория на сервере, в которую сохраняется скриншот;

    [make_thumb] - создать миниатюру (0 - нет).

  • Добавить текст на видео

    	obj.set_watermark("[text]", [text_pos], [time_pos])

    [text] - произвольный текст;

    [text_pos] и [time_pos] - угол расположения текст и времени: 1-левый верхний, 2-правый верхний, 3-левый нижний, 4-правый нижний.

  • Экспорт основного/дополнительного потока из архива канала

    	obj.export_archive("[start_time]", "[end_time]", "[filename]", "[options]")

    [start_time] и [end_time] - время начала и конца экспортируемого фрагмента архива, в формате YYYYMMDD_HHMMSS;

    [filename] - имя сохраняемого файла;

    [options] - дополнительные опции, передаваемые в формате "name" : value:

    • "is_hardware" - экспортировать архив с устройства (0 - нет)
    • "want_ss" - экспортировать дополнительный поток (0 - нет)
    • "video_codec" - перекодировать видео в кодек ("MPEG4" или "WMV")
    • "video_bitrate" - перекодировать с использованием битрейта (значение в кбит/с)
    • "video_resolution" - изменить разрешение видео ("2560x1920", "2048x1536", "1920x1080", "1600x1200", "1280x1024", "1280x960", "1280x720", "1024x768", "800x600", "720x576", "704x576", "640x480", "352x288", "320x240", "176x144")
    • "audio_codec" - кодек для аудио ("PCM")
    • "audio_bitrate" - битрейт для аудио (64, 128) кбит/с
    • "need_channel_name_watermark" - вписать в видео название канала (0 - нет)
    • "need_timestamp_watermark" - вписать в видео время съёмки (0 - нет)
    • "need_fliprotate" - использовать настройки поворота изображения из канала (0 - нет)
    • "watermark_need_figures" - добавить фигуры (0 - нет)
    • "watermark_align" - расположение вписанного текста (1 - верх-лево, 2 - верх-право, 3 - низ-лево, 4 - низ-право)

Методы объекта класса "интерфейс оператора"
	obj = object("Интерфейс оператора maskaev-pc")
  • Экспорт основного/дополнительного потока из архива канала

    	obj.archive_export("[channel]", "[start_time]", "[end_time]", "[filename]", [on_device])
    	obj.archive_export_ss("[channel]", "[start_time]", "[end_time]", "[filename]", [on_device])

    [channel] - имя канала или его GUID;

    [start_time] и [end_time] - время начала и конца экспортируемого фрагмента архива;

    [filename] - имя сохраняемого файла;

    [on_device] - экспорт архива с устройства (не 0).

  • Открыть архив канала

    	obj.archive_open_inplace("[channel]", "[start_time]")

    [channel] - имя канала или его GUID;

    [start_time] - время позиционирования.

  • Добавить каналы на монитор

    	obj.assign_channels("[csv_channels]", [monitor_n])

    [csv_channels] - список каналов через запятую;

    [monitor_n] - номер монитора.

  • Изменить настройки внешнего вида окна камеры, точно также как и при помощи диалогового окна настроек внешнего вида.

    	obj.change_view_settings("[name]", "[value]")

    [name] - имя настройки:

    	"opts_[GUID_канала]_use_common"
    	"opts_[GUID_канала]_figures_on"
    	"opts_[GUID_канала]_figures_mode"
    	"opts_[GUID_канала]_border_mode"
    	"opts_[GUID_канала]_keep_ratio"
    	"opts_[GUID_канала]_show_osd"
    	"opts_[GUID_канала]_show_channel_name"
    	"opts_[GUID_канала]_show_channel_bold"
    	"opts_[GUID_канала]_switch_to_ss_pixels"
    	"opts_[GUID_канала]_turtle_enable"

    Подсказка

    Если вам необходимо изменить настройки внешнего вида всех камер, то вместо [GUID_канала] используете common.

    Например:

    	obj = object("Интерфейс оператора maskaev-pc")
    	obj.change_view_settings("opts_common_figures_on", "1")
    	obj.change_view_settings("opts_common_figures_mode", "3")
    	obj.change_view_settings("opts_syQURNtf_show_osd", "1")
    	obj.change_view_settings("opts_syQURNtf_show_channel_name", "0")

    [value] - значение настройки.

  • Включить/выключить экономичный режим

    	obj.eco_start("[channel]", [monitor_n])
    	obj.eco_stop("[channel]", [monitor_n])

    [channel] - имя канала или его GUID;

    [monitor_n] - номер монитора.

  • Включить/выключить управление PTZ-камерой

    	obj.ptz_start("[channel]", [monitor_n])
    	obj.ptz_stop("[channel]", [monitor_n])

    [channel] - имя канала или его GUID;

    [monitor_n] - номер монитора, на котором будет производиться управление PTZ-камерой.

  • Управлять PTZ-камерой

    	obj.ptz_focus_auto("[channel]", [monitor_n])
    	obj.ptz_iris_auto("[channel]", [monitor_n])
    	obj.ptz_set_coordinates("[channel]", [monitor_n], [pan], [tilt], [zoom])
    	obj.ptz_set_focus("[channel]", [monitor_n], [speed])
    	obj.ptz_set_iris("[channel]", [monitor_n], [speed])
    	obj.ptz_set_zoom("[channel]", [monitor_n], [speed])
    	obj.ptz_start("[channel]", [monitor_n])
    	obj.ptz_stop("[channel]", [monitor_n])
    	obj.ptz_turn_x("[channel]", [monitor_n], [speed_pan])
    	obj.ptz_turn_y("[channel]", [monitor_n], [speed_tilt]

    [channel] - имя канала или его GUID;

    [monitor_n] - номер монитора, на котором будет производиться управление PTZ-камерой;

    [pan], [tilt], [zoom] - координаты поворота (дробное);

    [speed], [speed_pan], [speed_tilt] - скорость поворота (целое).

  • Отобразить монитор поверх всех окон

    	obj.raise_monitor([monitor_n])

    [monitor_n] - номер монитора.

  • Сохранить скриншот из архива

    	obj.screenshot("[channel]", "[time]", "[filename]")
    	obj.screenshot_ex("[channel]", "[time]", "[filename]", "[directory]", [make_thumb])

    [channel] - имя канала или его GUID;

    [time] - время кадра из архива;

    [filename] - имя сохраняемого скриншота;

    [directory] - директория на сервере, в которую сохраняется скриншот;

    [make_thumb] - создать миниатюру (0 - нет).

  • Отобразить канал или шаблон на мониторе

    	obj.show("[name]", [monitor_n])
    	obj.show_channel("[name]", [monitor_n])
    	obj.show_template("[name]", [monitor_n])
    	obj.show_template_by_guid("[name]", [monitor_n])

    [name] - имя канала или шаблона;

    [monitor_n] - номер монитора.

  • Показать архив канала на мониторе или в шаблоне

    	obj.show_archive("[name]", [monitor_n], "[start_time]", "[end_time]")

    [name] - имя канала или шаблона;

    [monitor_n] - номер монитора;

    [start_time] и [end_time] - время начала и конца фрагмента архива.

  • Отобразить html-страницу на мониторе или в шаблоне

    	obj.show_html("[source]", "[url]")
    	obj.show_html_on_monitor([monitor_n], "[source]", "[url]")
    	obj.show_html_on_templete([monitor_n], "[name]", "[source]", "[url]")

    [monitor_n] - номер монитора;

    [name] - имя шаблона;

    [source] - идентификатор минибраузера;

    [url] - адрес отображаемой html-страницы.

  • Обновить активный монитор

    	obj.update_active_monitor([csv_channels])

    [csv_channels] - список каналов через запятую.