- Создал(а) Рудковский Михаил (доб. 1236), редактировал(а) Дмитрий Гаврилов июл 03, 2024
resources/archive/video_exporter.py
Модуль предоставляет высокоуровневый интерфейс экспорта видео в виде класса ShotSaver.
Аргументы класса
callback (callable[str, str], optional)
: Callback функция, в которую передается текущий статус экспорта.queue_maxlen (int, optional)
: Максимальная длина очереди на экспорт. По умолчанию1000
.
Публичные атрибуты класса
export_folder (str)
: Стандартная папка для экспорта видео. По умолчанию папка скриншотов сервера.file_name_tmpl (str)
: Шаблон стандартного имени файла. По умолчанию"{name} ({dt_start} - {dt_end}){sub}.avi"
callback (callable[str, str], optional)
: Тоже что аргументcallback
cancel_task_with_states (Tuple[int])
: Список статусов задач, которые удаляются из списка задач в gui интерфейсе трассира. По умолчанию(2, 3)
.
Список возможных статусов:- 0 - in queue
- 1 - exporting
- 2 - success
- 3 - failed
По умолчанию удаляются все задачи из списка, которые успешно завершены или звершились с ошибкой.
Для отладки можно отключить автоматическую очистку задач.
from video_exporter import VideoExporter ve = VideoExporter() ve.cancel_task_with_states = tuple()
Методы класса
- export - Создание задачи на экспорт видео фрагмента.
Спиоск аргументов:channel_full_guid (str)
: Guid канала видаChannelGuid_ServerGuid
dt_start (datetime.datetime)
: Дата/время начала видеофрагмента для экспортаdt_end (datetime.datetime, optional)
: Датавремя окончания видеофрагмента для экспортаduration (int, optional)
: Продолжительность видеофрагмента в секундах. Используется только если не заданоdt_end
. По умолчанию60
prefer_substream (bool, optional)
: ЕслиTrue
- экспортирует субпоток. По умолчаниюFalse
file_name (str, optional)
: Имя экспортируемого файла. Если не заано формирует имя согласно параметруfile_name_tmpl
file_path (str, optional)
: Путь для экспорта файла. Если не задано используется путь, указанный в параметреexport_folder
options (Dict[str: any])
: Доп. опции для экспорта, описание ниже.callback (callable[str, str], optional)
: Callback функция, в которую передается текущий статус экспорта. Если не задано - используется callback параметр класса.task_guid (str, optional)
: Guid задачи. По умолчанию задается с помощью функции host.random_guid()
Опции экспорта
is_hardware (bool)
: определяет источник видео.False
- TRASSIR,True
- камера.video_codec ('mpeg4'|'wmv')
: Название видеокодека. Регистр букв игнорируется. В случае задания любого другого значения, в том числе пустой строки, будет использоваться оригинальный формат видео (без перекодирования).video_bitrate (200|400|600|800|1000|2000|2500|3000|5000|7500|10000|16000)
: битрейт выходного видеопотока в Килобитах/с. В случае задания любого другого значения будет использоваться ближайшее не большее из поддерживаемых, т.е. при указании 999, будет использоваться значение 800, за исключением значений меньше 200 (включая отрицательные), в случае которых будет использоваться значение 200. По умолчанию используется оригинальный битрейт исходного видео, но при указании этого поля нельзя задать оригинальный битрейт. Поэтому если вам нужен оригинальный битрейт, вообще не задавайте полеvideo_bitrate
.
Применяется только если задан видеокодек (включено перекодирование), в противном случае игнорируется.video_resolution ('2560x1920'|'2048x1536'|'1920x1080'|'1600x1200'|'1280x1024'|'1280x1960'|'1280x720'|'1024x768'| '800x600'|'720x576'|'704x576'|'640x480'|'352x288'|'320x240'|'176x144')
: разрешение выходного видео. Не допускается задавать любые другие значения. В случае задания пустой строки будет использоваться оригинальное разрешение видео.
Применяется только если задан видеокодек (включено перекодирование), в противном случае игнорируется.audio_codec ('no audio'|'pcm'|'wma')
: название аудиокодека. Регистр букв игнорируется. В случае задания любого другого значения, в том числе пустой строки, будет использоваться оригинальный формат аудио (без перекодирования).audio_bitrate (64|128)
: битрейт выходного аудиопотока в Килобитах/с. В случае задания значения больше 96 будет использоваться значение 128, иначе будет использоваться значение 64. По умолчанию используется оригинальный битрейт исходного аудиопотока, но при указании этого поля нельзя задать оригинальный битрейт. Поэтому если вам нужен оригинальный битрейт, вообще не задавайте полеaudio_bitrate
.
Применяется только если задан аудиокодек (включено перекодирование), в противном случае игнорируется.need_fliprotate (bool)
: при значенииTrue
будут применяться параметры "flip" и "rotate" из настроек соответствующего канала.
Применяется только если задан видеокодек (включено перекодирование), в противном случае игнорируется.watermark_need_figures (bool)
: при значенииTrue
поверх видео будут рисоваться фигуры (при их наличии).
Применяется только если задан видеокодек (включено перекодирование), в противном случае игнорируется.need_channel_name_watermark (bool)
: при значенииTrue
поверх видео будут рисоваться имя канала (взятое из настроек соответствующего канала)
Применяются только если задан видеокодек (включено перекодирование), в противном случае игнорируются.need_timestamp_watermark (bool)
: при значенииTrue
поверх видео будут рисоваться таймстамп текущего кадра в области заданной полемwatermark_align
.
Применяются только если задан видеокодек (включено перекодирование), в противном случае игнорируются.watermark_align (0|1|2|3|4)
: определяет в какой области кадра будет рисоваться watermark-текст.- 0 или 1 - верхний левый угол;
- 2 - верхний правый угол;
- 3 - нижний левый угол;
- 4 - нижний правый угол.
Статусы экспорта
Возможные статусы 'экспорта содержатся в объекте status
:
status.canceled
- Задача отменена.status.exporting
- Видео экспортируется.status.error
- Произошла ошибка экспорта.status.success
- Видео успешно экспортировано.status.in_queue
- Задача в очереди на экспорт.
Примеры кода
Экспортируем архив за последние 15 секунд.
import datetime from video_exporter import VideoExporter CHANNEL_GUID = "uR76TlcA_O4Yazs8u" ve = VideoExporter() dt = datetime.datetime.now() - datetime.timedelta(seconds=15) ve.export(CHANNEL_GUID, dt, duration=15)
Экспортируем субпоток за сегодня с 12:00 до 12:15.
import datetime from video_exporter import VideoExporter CHANNEL_GUID = "uR76TlcA_O4Yazs8u" ve = VideoExporter() today = datetime.datetime.now().today() dt_start = datetime.datetime.combine(today, datetime.time(hour=12)) dt_end = datetime.datetime.combine(today, datetime.time(hour=12, minute=15)) ve.export(CHANNEL_GUID, dt_start, dt_end=dt_end, prefer_substream=True)
Отслеживаем статус экспорта видео
При успешном экспорте открываем видео.
import os import datetime import host from video_exporter import VideoExporter, status CHANNEL_GUID = "uR76TlcA_O4Yazs8u" tasks = {} def callback(guid, state): host.message("[%s] %s" % (guid, state)) if state == status.success: fpath = tasks.pop(guid) os.startfile(fpath) elif state == status.error: fpath = tasks.pop(guid) host.error("Export failed: %s" % fpath) ve = VideoExporter(callback=callback) dt = datetime.datetime.now() - datetime.timedelta(seconds=15) task_guid, file_path = ve.export(CHANNEL_GUID, dt, duration=15) tasks[task_guid] = file_path