OBS studio

Потребовалось настроить вещание на YouTube и ВК с четырех камер (на самом деле их пять, но комп не тянет).

Выбор пал на бесплатную OBS studio. Про настройки этой программы много всего в интернете, по этому разберем только частности (Умное переключение сцен, удаленное управление, управление скриптами, вещание на разные платформы, управление из программы Djin). Мы будем использовать в OBS studio режим «Режим студии». Если потребуются плагины ищем тут.

Переключение сцен

Задача:

  1. Переключение сцен осуществляется в определенном порядке
  2. Время между переключениями разное и настраивается
  3. Требуется простое удаленное управление с возможность остановить карусель сцен на конкретной сцене, а затем продолжить

Решение:
Для настройки переключения сцен, будем использовать плагин OBS studio Advanced Scene Switcher github

После того как мы настроили сцены переходим в меню OBS studio
Инструменты -> Advanced Scene Switcher
Затем вкладка Scene Sequence тут настраиваем очередность автоматического переключения сцен и время переключений.
Для того что бы делать паузы на определенных сценах, мы делаем копии этих сцен и добавляем в название например «Стат», то есть было «Диван» а копию называем «ДиванСтат». Затем переходим во вкладку pause и добавляем сцены на которых автоматическая ротация сцен остановится до тех пор пока не выберут сцену из списка во вкладке Scene Sequence.
Удаленное управление рассмотрим в следующем пункте.

Удаленное управление. Автоматическое управление OBS studio

Задача:

  1. Запуск/остановка вещания/записи по времени
  2. Запуск/остановка вещания/записи от программы Djin
  3. Простое управление переключением камер ведущими

Решение:
Для удаленного и локального управление OBS studio будем использовать плагины

После того как мы подключили и настроили плагин obs-websocket мы можем управлять как удаленно так и локально через плагин «Command line tool for obs-websocket plugin» из консоли.
Например запускать видео поток можно bat скриптом:

@echo OFF

C:\OBSscripts\OBSCommand\OBSCommand.exe /server=127.0.0.1:4444 /password=НАШСУПЕРПАРОЛЬ /startstream

Остальное в документации.

https://github.com/Palakis/obs-websocket/blob/4.x-current/docs/generated/protocol.md

Единственное уточнение по поводу /command
Например можно сделать скриншот:

/command=TakeSourceScreenshot,sourceName=СценаДиван,PictureFormat=png,saveToFilePath=D:\%DATE_TIME%.png

Или переключить коллекцию сцен:

/command=SetCurrentSceneCollection,sc-name=КоллСценГлавная

То есть в начале ставим класс команды (например SetCurrentSceneCollection), а потом саму команду (в нашем случае sc-name)

Так же мы можем управлять с любого браузера (в локальной сети, если конечно комп с OBS studio не имеет белый IP, тогда с с любого браузера) со страницы http://t2t2.github.io/obs-tablet-remote/ (Там скрипт клиент, который сразу работает, в общем там все просто и легко разобратся)

Профили

Задача:

  1. Вещание в должно запускаться автоматически
  2. В 7:05, 11:05 (Пн,Ср,Чт,Пт), 19:00 вещание должно осуществляться только на YouTube
  3. В 8:05, 11:05 (Вт) вещание должно осуществляться одновременно на YouTube и на ВК

Решение:
Создаем профили (в меню папка профиль) отличающиеся только сервером вещания (и соответственно ключом).
Файл -> Настройки -> Вещание
Для профиля который будет вещать на YouTube и ВК воспользуемся «бесплатным» сервисом https://restream.io/

Профиль для вещания только на YouTube назовем Youtube, а профиль для вещания на YouTube и ВК назовем VK_YouTube.

Так как вещание управляется максимально в автоматическом режиме воспользуемся «Планировщиком заданий» windows.
И так в В 7:05, 11:05 (Пн,Ср,Чт,Пт), 19:00 запускаем через планировщик заданий:

C:\OBSscripts\OBSCommand\OBSCommand.exe /server=127.0.0.1:4444 /password=НАШСУПЕРПАРОЛЬ /profile=YouTube /startstream

В 8:05, 11:05 (Вт):

C:\OBSscripts\OBSCommand\OBSCommand.exe /server=127.0.0.1:4444 /password=НАШСУПЕРПАРОЛЬ /profile=VK_YouTube /startstream

Теперь требуется добавить еще завершение вещания в конце часа:

C:\OBSscripts\OBSCommand\OBSCommand.exe /server=127.0.0.1:4444 /password=НАШСУПЕРПАРОЛЬ /stopstream

Решение проблемы с сохранением настроек у камер Ligitech

Для проекта были закуплены usb Web-камеры Logitech Webcamera C930e (Я бы купил ip-камеры, но не суть). Эти камеры на отрез не хотели сохранять настройки, например баланс белого и автофокус всегда были в режиме авто при перезагрузке ПК, а выдержка же слетала при перезапуске OBS studio.
Задача:

  1. Сохранение настроек камеры после перезагрузке ПК и перезапуске OBS studio

Решение:
Различные решения предложенные на форумах Logitech у кого то работали у кого то нет, у меня не работали. И вообще многие писали как техподдержка и в мягкой форме «посылала», в общем идея переписываться с тех поддержкой тоже отпала.
В итоге На форуме OBS studio нашел утилиту WebCameraConfig, которая сохраняет настройки всех usb камер (WebCameraConfig.exe --savedev) в файл в папке из которой запустили утилиту и при последующем вызове восстанавливает настройки. Поддерживает профили.

Распаковываем в папку C:\OBSscripts\WebCameraConfig

Читаем инструкцию:

WebCameraConfig.exe --help

CamCfg.Date.2017.version.1.0
To save and apply DirectShow webcam settings

Usage: WebCameraConfig.exe [options]

Options:
--readdev          : Read and print all devices short info.
--savedev          : Save devices current settings into .cfg file.
--profile [string] : Uses string as filename to save/load settings.
--ignorefn         : Ignore FriendlyName when looking for diveces.
--help             : Display this help info.

Without [options], it reads existing cam_sett.cfg file and applies settings
to all available devices.
It doesn't build new graph, only uses existing one.

Настраиваем камеры, затем сохраняем настройки:

cd C:\OBSscripts\WebCameraConfig
C:\OBSscripts\WebCameraConfig\WebCameraConfig.exe --savedev

В папке C:\OBSscripts\WebCameraConfig появится файл cam_sett.cfg значит все в порядке.

Так как OBS studio при запуске меняет выдержку то пришлось написать скрипт запуска:

@echo off

cd "C:\Program Files\obs-studio\bin\64bit"
start obs64.exe

ping -n 10 127.0.0.1

cd "C:\OBSscripts\WebCameraConfig"
"C:\OBSscripts\WebCameraConfig\WebCameraConfig.exe"

И на всякий случай для ручного быстрого восстановления настроек камер (например при смене коллекции сцен, тоже слетает настройки выдержки) скрипт который восстанавливает настройки камер при его запуске:

@echo off

cd "C:\OBSscripts\WebCameraConfig"
"C:\OBSscripts\WebCameraConfig\WebCameraConfig.exe"

Немного оффтоп, но в Win7 на панель задач никак не хотел вставать ярлык скрипта. Пришлось винду обмануть, переименовываем .bat в .exe кидаем ярлык на панель, затем редактируем ярлык в c:\Users\\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\ и возвращаем разрешение скрипту.

Запуск/остановка вещания/записи от программы Djin

Возможно это мало кому пригодится, но все таки.

Создаем два джингла «StartVideoOBS»и «StopVideoOBS». Первый джингл будет запускать, второй останавливать запись (Для вещания аналогично, команды OBSCommand.exe выше)

Аналогично описанному выше в папке C:\OBSscripts\ ПК с установленным Djin находятся файлы плагина Command line tool for obs-websocket plugin (Windows) и скрипты.

Скрипт запуск видеозаписи C:\OBSscripts\StartVideoRecDjin.bat

@echo off

chcp 1251
set DATE_TIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
set DATE_TIME=%DATE_TIME: =0%

C:\OBSscripts\OBSCommand\OBSCommand.exe /server=10.0.0.140:4444 /password=НАШСУПЕРПАРОЛЬ /startrecording /command=TakeSourceScreenshot,sourceName=Общий,PictureFormat=png,saveToFilePath=D:\GRAB\%DATE_TIME%.png

Разберем:

chcp 1251 — устанавливаем кодировку

Следующие две строки:

set DATE_TIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
set DATE_TIME=%DATE_TIME: =0%

Создает переменную DATE_TIME с текущей датой и временем вида 2019-08-22_14-20-11 (год-месяц-день_час-минута-секунда)

/server=10.0.0.140:4444 — ip адрес ПК с OBS studio
/startrecording — запустить запись
/command=TakeSourceScreenshot,sourceName=Общий,PictureFormat=png,saveToFilePath=D:\VIDEO\%DATE_TIME%.png создать скриншот сцены с названием «Общий» для загрузки на Youtube

Скрипт остановки видеозаписи C:\OBSscripts\StopVideoRecDjin.bat

@echo OFF

C:\OBSscripts\OBSCommand\OBSCommand.exe /server=10.0.0.140:4444 /password=НАШСУПЕРПАРОЛЬ /stoprecording

И скрипт парсинга C:\OBSscripts\ParserXMLDjin.bat, который запускается каждый раз когда меняется файл XML файла Djin (требуется настроить, об этом ниже) и если проигрываются ролики StartVideoOBS или StartVideoOBS запускает скрипты остановки или старта записи.

;@echo off

;Findstr -rbv ; %0 | powershell -c - 
;goto:sCode

[xml]$cp = Get-Content "C:\Program Files (x86)\Digispot II\DJin\cur_playing.xml"
$cp.ELEM_LIST.ELEM | Where-Object {$_.status -eq "playing"} | %{$_.NAME} | %{if ($_ -eq "StartVideoOBS") {& C:\OBSscripts\StartVideoRecDjin.bat}}
$cp.ELEM_LIST.ELEM | Where-Object {$_.status -eq "playing"} | %{$_.NAME} | %{if ($_ -eq "StopVideoOBS") {& C:\OBSscripts\StopVideoRecDjin.bat}}

;:sCode
;:eof

Разберем его.

Для начала рассмотрим пример XML файла создаваемого Djin-ом:

<?xml version="1.0" encoding="UTF-8"?>
<ELEM_LIST>
 <ELEM STATUS="playing" SCH_NAME="АРВ01" SCH_ID="9" PLAYER_NAME="Плеер 1" PLAYER_ID="6430">
  <START_TIME>16:38:26</START_TIME>
  <START_DATE>2019-07-03</START_DATE>
  <BLK_TYPE/>
  <TYPE>Д</TYPE>
  <NAME>StartVideoOBS</NAME>
  <ARTIST/>
  <AUTHOR/>
  <ALBUM/>
  <DBID>23697</DBID>
  <FILE_NAME>\\nvb\dfs\tract\root\SND\StartVideoOBS.wav.mp2</FILE_NAME>
  <DURATION>00:00:04</DURATION>
  <RETRANSMISSION>0</RETRANSMISSION>
 </ELEM>
 <ELEM STATUS="preloaded" SCH_NAME="АРВ01" SCH_ID="9" PLAYER_NAME="Плеер 1" PLAYER_ID="6430">
  <BLK_TYPE/>
  <TYPE>Д</TYPE>
  <NAME>StopVideoOBS</NAME>
  <ARTIST/>
  <AUTHOR/>
  <ALBUM/>
  <DBID>23698</DBID>
  <FILE_NAME>\\nvb\dfs\tract\root\SND\StopVideoOBS.wav.mp2</FILE_NAME>
  <DURATION>00:00:03</DURATION>
  <RETRANSMISSION>0</RETRANSMISSION>
 </ELEM>
</ELEM_LIST>

Как видно, в плеере 1 в аппаратной АРВ01 загружено два ролика: StartVideoOBS и StopVideoOBS, причем StartVideoOBS играет, это нам и требуется. (в целом играть могут несколько роликов из разных плееров одновременно)

Это оболочка bat-файла служит для запуска скрипта PowerShell внутри себя(Djin не захотел запускать скрипт на PowerShell):

;@echo off

;Findstr -rbv ; %0 | powershell -c - 
;goto:sCode
;:sCode
;:eof

Для PowerShell «;» знак комментария, а интерпретатор bat его игнорирует и выполняет команды.

Теперь разберем часть PowerShell: Создаем объект $cp с xml структурой загруженной из файла

[xml]$cp = Get-Content "C:\Program Files (x86)\Digispot II\DJin\cur_playing.xml"

Следующие две строки непосредственно парсят его и в зависимости от названия проигрываемого элемента запускает или нет различные bat файлы

$cp.ELEM_LIST.ELEM | Where-Object {$_.status -eq "playing"} | %{$_.NAME} | %{if ($_ -eq "StartVideoOBS") {& C:\OBSscripts\StartVideoRecDjin.bat}}
$cp.ELEM_LIST.ELEM | Where-Object {$_.status -eq "playing"} | %{$_.NAME} | %{if ($_ -eq "StopVideoOBS") {& C:\OBSscripts\StopVideoRecDjin.bat}}

разберем и их. Здесь используется конвейерная обработка. В начале выводим содержимое всех элементов ELEM

$cp.ELEM_LIST.ELEM

затем выберем только те из них у которых STATUS имеет значение playing

| Where-Object {$_.status -eq "playing"}

Теперь, из того что осталось, возьмем только содержимое блоков NAME

| %{$_.NAME}

и в следующих двух строчках проверяем не соответствует ли оно значению StartVideoOBS и StopVideoOBS соответственно и если находим соответствие выполняем скрипты действия

| %{if ($_ -eq "StartVideoOBS") {& C:\OBSscripts\StartVideoRecDjin.bat}}

Внимание, требуется разрешить запуск скриптов PowerShell. Из под админа в консоли PowerShell выполнить:

Set-ExecutionPolicy RemoteSigned

Настройка Djin

Требуется настроить создание файла XML и запуска скрипта C:\OBSscripts\ParserXMLDjin.bat.

Заходим в меню:

Сервис -> Настройки -> Доп. -> XML -> Воспроизводимые в данный момент элементы
Заполняем:

Производить запись XML файл Да
Имя XML файла C:\Program Files (x86)\Digispot II\DJin\cur_playing.xml
Запускать приложение при изменении файла C:\OBSscripts\ParserXMLDjin.bat

Все.

P.S. Бывает, что камера становится черной (то есть полностью перестает работать). Лечится это тем, что разрешение камеры меняется на минимальное, после того как картинка появится, возвращаем разрешение в исходное состояние. Это работает даже в случае если в данный момент осуществляется запись или вещание.

Leave a Reply