# SDI-BRIDGE (RTSP -> DECKLINK) ## Автоматическая выдача RTSP-потоков на SDI-выходы платы Blackmagic DeckLink *** ## ОГЛАВЛЕНИЕ 1. Что это 2. Как это работает 3. Структура папки 4. Требования 5. Первичная настройка 5.1. Порядок действий 5.2. Проверка настроек платы (Connector Mapping) 6. Файл streams.txt 7. Запуск и остановка 7.1. Запуск 7.2. Остановка 7.3. Ярлык на рабочем столе 9. Как проверить, что всё работает 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 <канал> "<имя карты>" ``` Пример: ``` 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 (см. раздел 5a) 6. Убедитесь, что Media Express закрыт — он держит порты и мешает FFmpeg. *** ## 5a. ПРОВЕРКА НАСТРОЕК ПЛАТЫ (CONNECTOR MAPPING) *** Даже при работающем FFmpeg сигнал не появится, если порты платы настроены как входы или объединены в пары. 1. Откройте **Blackmagic Desktop Video Setup**. 2. Выберите вашу карту в списке устройств. 3. Нажмите на иконку с шестерёнкой (или кнопку настроек). 4. Перейдите на вкладку **Connectors**. 5. Для каждого используемого порта должно быть выбрано просто **`SDI 1`**, **`SDI 2`** и т. д. — не`SDI 1 & SDI 2` и не `SDI 3 & SDI 4`. 6. Нажмите **Save**. 7. **Перезагрузите компьютер** — без этого драйвер не применит изменения. После перезагрузки в главном окне Desktop Video Setup колонка **VIDEO IN** у ваших портов должна показывать **`No Signal`** (или вообще отсутствовать). Это признак того, что порты больше не работают как входы. Колонка **OUTPUT FORMAT** должна показывать **`1080i50`** — то же самое, что стоит в `-format_code Hi50` в `worker.cmd`. Если там другой формат, поменяйте его в Desktop Video Setup на 1080i50. *** ## 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 ``` Поток camera-A пойдёт на SDI-3, camera-B — на 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 или крестик). ### 7.3 ЯРЛЫК НА РАБОЧЕМ СТОЛЕ Чтобы не набирать команду каждый раз: 1. Правый клик на рабочем столе -> Создать -> Ярлык. 2. В поле "Расположение объекта" вставьте: ``` powershell.exe -ExecutionPolicy Bypass -File C:\sdi-bridge\sdi-bridge.ps1 ``` 3. Имя: "SDI Bridge" -> Готово. Двойной клик по ярлыку — и система запущена. *** ## 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 растёт, но на мониторе нет картинки **Причина:** порт платы настроен как вход, а не выход, или объединён в пару с соседним портом. **Решение:** 1. Откройте Blackmagic Desktop Video Setup. 2. Вкладка Connectors: для каждого порта выберите просто "SDI N" (не "SDI N & SDI M"). 3. Нажмите Save и перезагрузите компьютер. 4. Проверьте, что в главном окне у портов пропала колонка VIDEO IN или она показывает No Signal. 5. Проверьте, что OUTPUT FORMAT = 1080i50. *** ### "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, потребуется доработка — например, группировка каналов по картам и отдельный набор воркеров на каждую.