569 lines
25 KiB
Markdown
569 lines
25 KiB
Markdown
################################################################
|
||
# #
|
||
# SDI-BRIDGE :: RTSP -> DECKLINK #
|
||
# #
|
||
# Автоматическая выдача RTSP-потоков на SDI-выходы #
|
||
# платы Blackmagic DeckLink #
|
||
# #
|
||
################################################################
|
||
|
||
|
||
================================================================
|
||
ОГЛАВЛЕНИЕ
|
||
================================================================
|
||
|
||
1. Что это
|
||
2. Как это работает
|
||
3. Структура папки
|
||
4. Требования
|
||
5. Первичная настройка
|
||
6. Файл streams.txt
|
||
7. Запуск и остановка
|
||
8. Как проверить, что всё работает
|
||
9. Частые проблемы и решения
|
||
10. Полезные мелочи
|
||
|
||
|
||
================================================================
|
||
1. ЧТО ЭТО
|
||
================================================================
|
||
|
||
Набор скриптов для Windows, который:
|
||
|
||
* Принимает до N RTSP-потоков (N = число портов карты).
|
||
* Декодирует их через FFmpeg.
|
||
* Выдаёт каждый поток на отдельный SDI-выход платы
|
||
Blackmagic DeckLink в формате 1080i50 (Hi50).
|
||
* Автоматически переподключается при обрыве потока.
|
||
* Автоматически определяет модель карты и её каналы.
|
||
* Запускается одной командой.
|
||
|
||
Список потоков задаётся в одном текстовом файле streams.txt —
|
||
система сама раскидывает их по свободным портам.
|
||
|
||
|
||
================================================================
|
||
2. КАК ЭТО РАБОТАЕТ
|
||
================================================================
|
||
|
||
+---------------------+
|
||
| sdi-bridge.ps1 | <-- оркестратор (запускается вручную)
|
||
+----------+----------+
|
||
|
|
||
| 1. Проверяет ffmpeg (существует, есть --enable-decklink)
|
||
| 2. Читает версию драйвера Blackmagic из реестра
|
||
| 3. Определяет карту и её каналы через ffmpeg
|
||
| 4. Читает streams.txt
|
||
| 5. Гасит старые воркеры (если были)
|
||
| 6. Запускает по одному worker.cmd на поток
|
||
|
|
||
v
|
||
+---------------------+ +-----------------------+
|
||
| worker.cmd (SDI-1)| --> | ffmpeg -> DeckLink(1) |
|
||
+---------------------+ +-----------------------+
|
||
+---------------------+ +-----------------------+
|
||
| worker.cmd (SDI-2)| --> | ffmpeg -> DeckLink(2) |
|
||
+---------------------+ +-----------------------+
|
||
+---------------------+ +-----------------------+
|
||
| worker.cmd (SDI-N)| --> | ffmpeg -> DeckLink(N) |
|
||
+---------------------+ +-----------------------+
|
||
|
||
Каждый worker.cmd — это бесконечный цикл:
|
||
|
||
:loop
|
||
запустить ffmpeg
|
||
если ffmpeg упал -> подождать 3 сек -> снова loop
|
||
|
||
Благодаря этому система сама восстанавливается после
|
||
обрыва сети, зависания камеры, ошибки декодирования и т. п.
|
||
|
||
Имя карты (DeckLink Duo, DeckLink Quad, DeckLink Quad 2 и др.)
|
||
определяется автоматически и передаётся воркеру как параметр —
|
||
жёсткой привязки к конкретной модели нет.
|
||
|
||
|
||
================================================================
|
||
3. СТРУКТУРА ПАПКИ
|
||
================================================================
|
||
|
||
C:\sdi-bridge\
|
||
|
|
||
|-- ffmpeg.exe <-- ваш ffmpeg с поддержкой DeckLink
|
||
|-- sdi-bridge.ps1 <-- оркестратор
|
||
|-- worker.cmd <-- универсальный воркер
|
||
|-- stop-all.ps1 <-- остановка всего
|
||
|-- streams.txt <-- СПИСОК ПОТОКОВ
|
||
|
|
||
|-- STOP.flag <-- временный файл-флаг (создаётся сам)
|
||
|
||
worker.cmd вызывается так:
|
||
|
||
worker.cmd <канал> <URL> "<имя карты>"
|
||
|
||
Пример:
|
||
|
||
worker.cmd 1 rtsp://10.10.5.140:8554/live1 "DeckLink Duo"
|
||
|
||
Оркестратор подставляет имя карты автоматически, вручную
|
||
его указывать не нужно.
|
||
|
||
|
||
================================================================
|
||
4. ТРЕБОВАНИЯ
|
||
================================================================
|
||
|
||
* Windows 10 / 11 (x64).
|
||
* Плата Blackmagic DeckLink (проверено на Duo и Quad 2).
|
||
* Драйвер Blackmagic Desktop Video 12.9.
|
||
* FFmpeg с флагом --enable-decklink.
|
||
* PowerShell 5.1 или новее (есть в Windows по умолчанию).
|
||
|
||
--------------------------------------------------------------
|
||
ПРОВЕРКА FFMPEG
|
||
--------------------------------------------------------------
|
||
|
||
Оркестратор проверяет это автоматически при запуске и
|
||
останавливается с понятным сообщением, если флага нет.
|
||
|
||
Проверить вручную:
|
||
|
||
C:\sdi-bridge\ffmpeg.exe -version | findstr decklink
|
||
|
||
Если в выводе есть --enable-decklink — сборка подходит.
|
||
Подходящие сборки обычно имеют суффикс "nonfree" в имени
|
||
архива (например, из проекта AnimMouse/ffmpeg-autobuild).
|
||
|
||
--------------------------------------------------------------
|
||
ПРОВЕРКА ВЕРСИИ ДРАЙВЕРА
|
||
--------------------------------------------------------------
|
||
|
||
Оркестратор автоматически читает версию драйвера из реестра
|
||
и выводит её в лог рядом с именем карты. Пример строки:
|
||
|
||
Blackmagic driver: 12.9.0.0
|
||
|
||
Если версия не определилась, будет выведено:
|
||
|
||
Blackmagic driver: version not detected (registry key missing)
|
||
|
||
Это не ошибка — скрипт продолжит работу. Точную версию
|
||
драйвера всегда можно посмотреть в Blackmagic Desktop
|
||
Video Setup, вкладка About для любого канала карты.
|
||
|
||
|
||
================================================================
|
||
5. ПЕРВИЧНАЯ НАСТРОЙКА
|
||
================================================================
|
||
|
||
Шаг 1. Создайте папку C:\sdi-bridge\
|
||
Шаг 2. Положите туда ffmpeg.exe (с поддержкой DeckLink)
|
||
Шаг 3. Скопируйте туда sdi-bridge.ps1, worker.cmd,
|
||
stop-all.ps1 и streams.txt
|
||
Шаг 4. Откройте streams.txt и впишите свои RTSP-адреса
|
||
(см. раздел 6)
|
||
Шаг 5. В Blackmagic Desktop Video Setup проверьте, что
|
||
все нужные порты назначены как SDI Output
|
||
(вкладка Connectors -> "SDI 1", "SDI 2" и т. д.)
|
||
Шаг 6. Убедитесь, что Media Express закрыт — он держит
|
||
порты и мешает FFmpeg.
|
||
|
||
|
||
================================================================
|
||
6. ФАЙЛ streams.txt
|
||
================================================================
|
||
|
||
Одна строка = один поток. Пустые строки и строки,
|
||
начинающиеся с #, игнорируются.
|
||
|
||
--------------------------------------------------------------
|
||
# Пример
|
||
rtsp://10.10.5.140:8554/live1
|
||
rtsp://10.10.5.140:8554/live2
|
||
rtsp://10.10.5.140:8554/live3
|
||
rtsp://10.10.5.140:8554/live4
|
||
--------------------------------------------------------------
|
||
|
||
Потоки рассаживаются на каналы сверху вниз: первый URL ->
|
||
SDI-1, второй -> SDI-2, и так далее.
|
||
|
||
--------------------------------------------------------------
|
||
ЯВНОЕ УКАЗАНИЕ КАНАЛА
|
||
--------------------------------------------------------------
|
||
|
||
Формат "номер:URL":
|
||
|
||
--------------------------------------------------------------
|
||
3:rtsp://10.10.5.140:8554/camera-A
|
||
5:rtsp://10.10.5.140:8554/camera-B
|
||
--------------------------------------------------------------
|
||
|
||
Поток с номером 3 пойдёт на SDI-3, с номером 5 — на SDI-5.
|
||
Если канал занят или его нет — строка пропускается
|
||
с предупреждением.
|
||
|
||
Лишние строки (сверх числа каналов) тоже пропускаются
|
||
и перечисляются в конце вывода оркестратора в разделе
|
||
"Skipped".
|
||
|
||
|
||
================================================================
|
||
7. ЗАПУСК И ОСТАНОВКА
|
||
================================================================
|
||
|
||
Система запускается одним PowerShell-скриптом. Он сам
|
||
проверяет окружение, находит плату, читает streams.txt,
|
||
гасит старые воркеры и запускает новые.
|
||
|
||
|
||
----------------------------------------------------------------
|
||
7.1 ЗАПУСК
|
||
----------------------------------------------------------------
|
||
|
||
Откройте PowerShell (Пуск -> начните печатать "PowerShell"
|
||
-> Enter) и выполните:
|
||
|
||
powershell -ExecutionPolicy Bypass -File C:\sdi-bridge\sdi-bridge.ps1
|
||
|
||
Вставить текст в PowerShell можно правой кнопкой мыши
|
||
или через Ctrl+V.
|
||
|
||
Параметр -ExecutionPolicy Bypass нужен, потому что
|
||
по умолчанию Windows блокирует запуск .ps1-файлов. Он
|
||
действует только на время текущего запуска и ничего
|
||
в системе не меняет.
|
||
|
||
Что произойдёт:
|
||
|
||
* В окне PowerShell появится лог проверки окружения,
|
||
обнаружения платы, список каналов и таблица
|
||
запущенных потоков.
|
||
* Откроются окна SDI-1, SDI-2, ... — по одному
|
||
на каждый поток. Их закрывать нельзя — это
|
||
работающие воркеры.
|
||
* Окно PowerShell можно свернуть или закрыть: оно
|
||
свою работу выполнило.
|
||
|
||
Повторный запуск безопасен: старые воркеры будут
|
||
автоматически остановлены перед стартом новых.
|
||
|
||
|
||
----------------------------------------------------------------
|
||
7.2 ОСТАНОВКА
|
||
----------------------------------------------------------------
|
||
|
||
Откройте PowerShell и выполните:
|
||
|
||
powershell -ExecutionPolicy Bypass -File C:\sdi-bridge\stop-all.ps1
|
||
|
||
Либо закройте все окна SDI-N вручную (Ctrl+C или крестик).
|
||
|
||
Не используйте taskkill /F /IM ffmpeg.exe — он не завершит
|
||
воркеры, и они тут же снова поднимут ffmpeg.
|
||
|
||
|
||
----------------------------------------------------------------
|
||
7.3 ШПАРГАЛКА
|
||
----------------------------------------------------------------
|
||
|
||
┌──────────────────────────────────────────────────────┐
|
||
│ ЗАПУСК: │
|
||
│ powershell -ExecutionPolicy Bypass │
|
||
│ -File C:\sdi-bridge\sdi-bridge.ps1 │
|
||
│ │
|
||
│ ОСТАНОВКА: │
|
||
│ powershell -ExecutionPolicy Bypass │
|
||
│ -File C:\sdi-bridge\stop-all.ps1 │
|
||
└──────────────────────────────────────────────────────┘
|
||
|
||
|
||
----------------------------------------------------------------
|
||
7.4 ЯРЛЫК НА РАБОЧЕМ СТОЛЕ
|
||
----------------------------------------------------------------
|
||
|
||
Чтобы не набирать команду каждый раз:
|
||
|
||
1. Правый клик на рабочем столе -> Создать -> Ярлык.
|
||
2. В поле "Расположение объекта" вставьте:
|
||
|
||
powershell.exe -ExecutionPolicy Bypass -File C:\sdi-bridge\sdi-bridge.ps1
|
||
|
||
3. Имя: "SDI Bridge" -> Готово.
|
||
|
||
Двойной клик по ярлыку — и система запущена.
|
||
|
||
|
||
----------------------------------------------------------------
|
||
7.5 АВТОЗАПУСК ПРИ ВКЛЮЧЕНИИ КОМПЬЮТЕРА
|
||
----------------------------------------------------------------
|
||
|
||
Через Планировщик заданий (Task Scheduler):
|
||
|
||
1. Пуск -> "Планировщик заданий".
|
||
2. Справа: "Создать задачу".
|
||
3. Вкладка "Общие":
|
||
- Имя: SDI Bridge
|
||
- Галочка "Выполнять с наивысшими правами".
|
||
4. Вкладка "Триггеры": Создать -> "При запуске
|
||
компьютера".
|
||
5. Вкладка "Действия": Создать -> "Запуск программы":
|
||
- Программа: powershell.exe
|
||
- Аргументы:
|
||
-ExecutionPolicy Bypass -File C:\sdi-bridge\sdi-bridge.ps1
|
||
6. ОК.
|
||
|
||
|
||
================================================================
|
||
8. КАК ПРОВЕРИТЬ, ЧТО ВСЁ РАБОТАЕТ
|
||
================================================================
|
||
|
||
Проверка 1. Лог оркестратора
|
||
|
||
В самом начале вывода должно быть что-то вроде:
|
||
|
||
Checking FFmpeg build...
|
||
FFmpeg build OK (DeckLink enabled).
|
||
Blackmagic driver: 12.9.0.0
|
||
Detecting DeckLink channels...
|
||
Card: DeckLink Duo
|
||
Channels: 1, 2, 3, 4
|
||
|
||
Имя карты определяется автоматически, поэтому здесь
|
||
может быть "DeckLink Duo", "DeckLink Quad",
|
||
"DeckLink Quad 2" или другое.
|
||
|
||
В конце — таблица:
|
||
|
||
SDI Stream Status
|
||
--- ------ ------
|
||
SDI-1 rtsp://10.10.5.140:8554/live1 launched
|
||
SDI-2 rtsp://10.10.5.140:8554/live2 launched
|
||
...
|
||
|
||
Проверка 2. Окна SDI-N
|
||
|
||
В каждом окне должны идти строки вида:
|
||
|
||
[дата время] Starting : DeckLink Duo (1)
|
||
[дата время] Stream : rtsp://10.10.5.140:8554/live1
|
||
...
|
||
frame= 1234 fps= 25 q=-0.0 size=N/A time=00:00:49.36 ...
|
||
|
||
Если frame растёт, а fps держится около 25 — всё хорошо.
|
||
|
||
Проверка 3. Монитор на SDI
|
||
|
||
Подключите монитор к соответствующему выходу карты.
|
||
Должна быть картинка в 1080i50.
|
||
|
||
Проверка 4. Диспетчер задач
|
||
|
||
Число процессов ffmpeg.exe должно быть РАВНО числу
|
||
запущенных потоков. Не больше.
|
||
|
||
|
||
================================================================
|
||
9. ЧАСТЫЕ ПРОБЛЕМЫ И РЕШЕНИЯ
|
||
================================================================
|
||
|
||
------------------------------------------------------------
|
||
"ERROR: ffmpeg.exe not found: ..."
|
||
------------------------------------------------------------
|
||
|
||
Причина: файл ffmpeg.exe отсутствует по указанному в
|
||
Config пути.
|
||
|
||
Решение: проверьте строку в sdi-bridge.ps1
|
||
|
||
$FFmpeg = 'C:\sdi-bridge\ffmpeg.exe'
|
||
|
||
и убедитесь, что файл действительно лежит там:
|
||
|
||
dir C:\sdi-bridge\ffmpeg.exe
|
||
|
||
------------------------------------------------------------
|
||
"ERROR: this FFmpeg build was compiled WITHOUT DeckLink support"
|
||
------------------------------------------------------------
|
||
|
||
Причина: в папке лежит ffmpeg.exe, собранный без поддержки
|
||
DeckLink (например, стандартная сборка с ffmpeg.org
|
||
или "gpl-shared" без опции --enable-decklink).
|
||
|
||
Решение: замените ffmpeg.exe на сборку с --enable-decklink.
|
||
Проверить можно командой:
|
||
|
||
C:\sdi-bridge\ffmpeg.exe -version | findstr decklink
|
||
|
||
Подходящие сборки обычно имеют суффикс "nonfree" в имени
|
||
архива (например, из проекта AnimMouse/ffmpeg-autobuild).
|
||
|
||
------------------------------------------------------------
|
||
"Blackmagic driver: version not detected"
|
||
------------------------------------------------------------
|
||
|
||
Это не ошибка. Скрипт просто не нашёл ключ в реестре.
|
||
Версия драйвера выводится для информации и не влияет на
|
||
работу. Точную версию смотрите в Blackmagic Desktop
|
||
Video Setup, вкладка About.
|
||
|
||
------------------------------------------------------------
|
||
"ERROR: No DeckLink channels detected"
|
||
------------------------------------------------------------
|
||
|
||
Причина: ffmpeg собрана с --enable-decklink, но карта
|
||
не отвечает.
|
||
|
||
Решение:
|
||
1. Проверьте, что драйвер Blackmagic Desktop Video
|
||
установлен и карта видна в Desktop Video Setup.
|
||
2. Перезагрузите компьютер.
|
||
3. Проверьте вручную:
|
||
|
||
C:\sdi-bridge\ffmpeg.exe -sinks decklink
|
||
|
||
------------------------------------------------------------
|
||
ffmpeg запускается, frame растёт, но сигнала на SDI нет
|
||
------------------------------------------------------------
|
||
|
||
Причина: на картах Quad 2 и Duo порты по умолчанию
|
||
работают парами. Нужен режим Half-Duplex.
|
||
|
||
Решение: в worker.cmd уже стоит -duplex_mode half.
|
||
Также проверьте Desktop Video Setup: для каждого порта
|
||
должно быть выбрано просто "SDI N".
|
||
|
||
------------------------------------------------------------
|
||
"Option reconnect not found"
|
||
------------------------------------------------------------
|
||
|
||
Причина: ваша сборка FFmpeg не поддерживает -reconnect.
|
||
|
||
Решение: не используйте -reconnect. Переподключение
|
||
обеспечивает worker.cmd через цикл :loop.
|
||
|
||
------------------------------------------------------------
|
||
"Unsupported number of channels! Only 2, 8 or 16 ..."
|
||
------------------------------------------------------------
|
||
|
||
Причина: в потоке есть аудио, которое FFmpeg пытается
|
||
отдать в DeckLink как моно.
|
||
|
||
Решение: в worker.cmd уже стоят -map 0:v:0 и -an.
|
||
Не убирайте их.
|
||
|
||
------------------------------------------------------------
|
||
На выходе 1080p25 вместо 1080i50
|
||
------------------------------------------------------------
|
||
|
||
Причина: FFmpeg не сохраняет признак interlaced
|
||
по всей цепочке.
|
||
|
||
Решение: в фильтре есть setfield=tff — он принудительно
|
||
помечает кадры как чересстрочные (top field first).
|
||
|
||
------------------------------------------------------------
|
||
"Синтаксическая ошибка в имени файла, имени папки
|
||
или метке тома"
|
||
------------------------------------------------------------
|
||
|
||
Причина: символ ">" в echo-строках worker.cmd. Windows
|
||
воспринимает его как перенаправление вывода.
|
||
|
||
Решение: используйте ":" вместо "->" в echo. В текущей
|
||
версии worker.cmd это уже исправлено.
|
||
|
||
------------------------------------------------------------
|
||
При повторном запуске открываются дубли окон
|
||
------------------------------------------------------------
|
||
|
||
Причина: старые worker.cmd не завершились.
|
||
|
||
Решение: убедитесь, что worker.cmd содержит проверку
|
||
STOP.flag (до и после запуска ffmpeg), а sdi-bridge.ps1
|
||
содержит блок "Cleanup". Перед запуском можно вручную
|
||
выполнить stop-all.ps1.
|
||
|
||
------------------------------------------------------------
|
||
ffmpeg печатает версию и замолкает
|
||
------------------------------------------------------------
|
||
|
||
Причина: ffmpeg завис на открытии RTSP или на открытии
|
||
вывода DeckLink. Часто это связано с тем, что порт
|
||
занят предыдущим ffmpeg, или RTSP-сервер не пускает
|
||
параллельные подключения.
|
||
|
||
Решение:
|
||
1. Запустите stop-all.ps1, подождите 3 секунды,
|
||
запустите оркестратор заново.
|
||
2. Проверьте, что Media Express закрыт.
|
||
3. Запустите воркер вручную, чтобы увидеть полный лог:
|
||
|
||
C:\sdi-bridge\worker.cmd 1 rtsp://10.10.5.140:8554/live1 "DeckLink Duo"
|
||
|
||
------------------------------------------------------------
|
||
Кириллица в окнах отображается "кракозябрами"
|
||
------------------------------------------------------------
|
||
|
||
Причина: cmd.exe по умолчанию работает в OEM-кодировке.
|
||
|
||
Решение: все сообщения воркеров и оркестратора на
|
||
английском. Не добавляйте echo с кириллицей.
|
||
|
||
|
||
================================================================
|
||
10. ПОЛЕЗНЫЕ МЕЛОЧКИ
|
||
================================================================
|
||
|
||
--------------------------------------------------------------
|
||
ВРЕМЕННО ЗАПУСТИТЬ МЕНЬШЕ ПОТОКОВ
|
||
--------------------------------------------------------------
|
||
|
||
Закомментируйте лишние строки в streams.txt символом #.
|
||
|
||
--------------------------------------------------------------
|
||
ПРОСМОТР СТАТУСА
|
||
--------------------------------------------------------------
|
||
|
||
В любой момент в PowerShell:
|
||
|
||
Get-Process ffmpeg -ErrorAction SilentlyContinue |
|
||
Select-Object Id, StartTime, CPU
|
||
|
||
Покажет, сколько воркеров ffmpeg сейчас живёт и как давно
|
||
запущен каждый.
|
||
|
||
--------------------------------------------------------------
|
||
ЛОГИ
|
||
--------------------------------------------------------------
|
||
|
||
Если нужно сохранять историю, добавьте в sdi-bridge.ps1
|
||
в самом начале строку:
|
||
|
||
Start-Transcript -Path "C:\sdi-bridge\logs\run.log" -Append
|
||
|
||
Не забудьте создать папку C:\sdi-bridge\logs\.
|
||
|
||
--------------------------------------------------------------
|
||
ДОБАВЛЕНИЕ НОВОГО ПОТОКА
|
||
--------------------------------------------------------------
|
||
|
||
1. Откройте streams.txt.
|
||
2. Допишите в конец строку с новым RTSP-адресом.
|
||
3. Запустите sdi-bridge.ps1 заново.
|
||
|
||
Ничего больше править не нужно.
|
||
|
||
--------------------------------------------------------------
|
||
НЕСКОЛЬКО КАРТ DECKLINK В ОДНОЙ СИСТЕМЕ
|
||
--------------------------------------------------------------
|
||
|
||
Текущая версия оркестратора берёт имя первой найденной
|
||
карты. Если в системе установлено несколько карт DeckLink,
|
||
потребуется доработка — например, группировка каналов по
|
||
картам и отдельный набор воркеров на каждую.
|
||
|
||
|
||
################################################################
|
||
# #
|
||
# КОНЕЦ ДОКУМЕНТА #
|
||
# #
|
||
################################################################ |