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