Files
SDI-bridge/README.md
Алексей Барабанов 916aee3f61 Update README.md
СТилистические правки
2026-10-14 15:28:25 +00:00

495 lines
20 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. Первичная настройка
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 <канал> <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 (см. раздел 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, потребуется доработка — например, группировка каналов по картам и отдельный набор воркеров на каждую.