Files
SDI-bridge/README.md

569 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

################################################################
# #
# 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,
потребуется доработка — например, группировка каналов по
картам и отдельный набор воркеров на каждую.
################################################################
# #
# КОНЕЦ ДОКУМЕНТА #
# #
################################################################