Skip to content

Інтеграція venc з WFB-ng

Ця інструкція описує, як повністю замінити Majestic на waybeam venc у зв'язці з WFB-ng (WiFi Broadcast) для FPV-стрімінгу з мінімальною затримкою.


Архітектура системи

┌─────────────────── КАМЕРА (VTX) ───────────────────┐
                                                      
  Сенсор → ISP → venc (H.265 encoder)                

                    ├─ RTP через Unix-сокет            

              wfb_tx (WFB-ng TX)                      


              WiFi-адаптер (RTL8812EU / AU)            
└──────────────────────────────────────────────────────┘
                     │  (радіоканал)

┌──────────── НАЗЕМНА СТАНЦІЯ (GS) ────────────────────┐
              WiFi-адаптер (RTL8812EU / AU)            


              wfb_rx (WFB-ng RX)                      

                    ├─ UDP → PixelPilot / QGroundControl

         Програвач відео (порт 5600)                   
└──────────────────────────────────────────────────────┘

Частина 1: Налаштування камери (VTX)

1.1 Передумови

Перед початком переконайтеся, що:

  • ✅ OpenIPC прошивка встановлена на камері
  • ✅ WFB-ng (wfb_tx) встановлений та працює
  • ✅ WiFi-адаптер (RTL8812EU або RTL8812AU) підключений
  • ✅ SSH-доступ до камери наявний

Встановлення venc

Якщо venc ще не встановлений, дивіться Встановлення venc на камеру.

1.2 Зупинити Majestic

bash
# Зупинити Majestic
killall majestic 2>/dev/null

# Вимкнути автозапуск (якщо використовується init.d)
chmod -x /etc/init.d/S95majestic 2>/dev/null

1.3 Налаштування venc для WFB-ng

Головна відмінність від Majestic — спосіб передачі відео до WFB-ng.

Спосіб 1: Unix-сокет (рекомендований)

Найбільш ефективний метод — передача через абстрактний Unix-сокет. Це зменшує затримку порівняно з UDP, оскільки дані не проходять через мережевий стек ядра.

Відредагуйте /etc/venc.json:

json
{
  "outgoing": {
    "enabled": true,
    "server": "unix://wfb_tx",
    "streamMode": "rtp",
    "maxPayloadSize": 1400,
    "connectedUdp": true,
    "audioPort": 0,
    "sidecarPort": 0
  }
}

Назва сокету

Назва wfb_tx у unix://wfb_tx — це ім'я абстрактного Unix-сокету. Воно повинно збігатися з налаштуванням WFB-ng на стороні передавача. Перевірте конфігурацію WFB-ng щоб упевнитися, що wfb_tx слухає цей сокет.

Спосіб 2: UDP на localhost

Якщо WFB-ng очікує RTP-потік через UDP:

json
{
  "outgoing": {
    "enabled": true,
    "server": "udp://127.0.0.1:5600",
    "streamMode": "rtp",
    "maxPayloadSize": 1400,
    "connectedUdp": true,
    "audioPort": 0,
    "sidecarPort": 0
  }
}

Спосіб 3: Shared Memory (SHM)

Для максимальної продуктивності — через кільцевий буфер у спільній пам'яті:

json
{
  "outgoing": {
    "enabled": true,
    "server": "shm://venc_ring",
    "streamMode": "rtp",
    "maxPayloadSize": 1400,
    "connectedUdp": true,
    "audioPort": 0,
    "sidecarPort": 0
  }
}

SHM та аудіо

shm:// працює тільки в режимі RTP.

**Аудіо не підтримується через основний SHM-канал навіть при `audioPort: 0`.**
Якщо вам потрібне аудіо при `shm://` — встановіть `audioPort > 0` (наприклад, `5601`), аудіо піде на окремий UDP-порт.

1.4 Налаштування WFB-ng на камері

Конфігурація WFB-ng повинна відповідати способу передачі, який ви обрали в venc.

Для Unix-сокету — в конфігурації wfb_tx вкажіть той самий абстрактний сокет:

# У конфігурації wfb_tx
# Вхідний потік — з Unix-сокету від venc
peer = listen://unix://wfb_tx

Для UDP на localhost:

# У конфігурації wfb_tx
# Вхідний потік — UDP від venc
peer = listen://udp://127.0.0.1:5600

1.5 Оптимальні параметри відео для WFB-ng

Рекомендовані параметри для стабільного FPV-стрімінгу через WiFi Broadcast:

json
{
  "video0": {
    "codec": "h265",
    "rcMode": "cbr",
    "fps": 60,
    "size": "1920x1080",
    "bitrate": 8192,
    "gopSize": 1.0,
    "qpDelta": -4,
    "frameLost": true,
    "sceneThreshold": 0,
    "sceneHoldoff": 2
  }
}

Пояснення параметрів:

ПараметрРекомендаціяЧому
codec: "h265"H.265Краща якість при тому ж бітрейті; обов'язковий для RTP на Star6E
rcMode: "cbr"CBRСтабільний бітрейт — краще для радіоканалу
fps: 6060 fpsБаланс між плавністю і навантаженням
bitrate: 81928 Мбіт/сОптимально для 20 МГц каналу WFB
gopSize: 1.01 секундаШвидке відновлення після втрати пакетів
frameLost: trueУвімкненоДозволяє пропускати кадри при перевантаженні

Бітрейт і ширина каналу

Підбирайте бітрейт відповідно до пропускної здатності WFB-ng:

| Ширина каналу | MCS | Макс. бітрейт | Рекомендовано |
| :--- | :--- | :--- | :--- |
| 20 МГц | MCS 3 | ~20 Мбіт/с | 8–12 Мбіт/с |
| 20 МГц | MCS 1 | ~10 Мбіт/с | 4–6 Мбіт/с |
| 40 МГц | MCS 3 | ~40 Мбіт/с | 16–22 Мбіт/с |

1.6 Порядок запуску сервісів

Правильний порядок запуску на камері:

bash
# 1. Завантажити WiFi-драйвер
insmod /lib/modules/88XXau.ko 2>/dev/null

# 2. Запустити WFB-ng TX
wfb_tx -u unix://wfb_tx -p 0 -k 8 -n 12 wlan0 &

# 3. Запустити venc
venc &

Init-скрипт

Для автоматичного запуску створіть init-скрипт як описано у Встановлення на камеру — Крок 7. Переконайтеся, що порядок номерів скриптів правильний: WiFi → WFB-ng → venc.


Частина 2: Налаштування наземної станції (GS)

2.1 Вимоги до наземної станції

КомпонентВаріанти
ПлатформаRadxa Zero 3W, Raspberry Pi 4/5, x86 Linux
WiFi-адаптерRTL8812EU (рекомендовано) або RTL8812AU
ПрогравачPixelPilot (Android), QGroundControl, ffplay

2.2 Налаштування WFB-ng RX

На наземній станції WFB-ng приймає потік та виводить його на UDP-порт для програвача:

bash
# Запуск WFB-ng приймача
wfb_rx -p 0 -c 127.0.0.1 -u 5600 -k 8 -n 12 wlan0

Параметри повинні збігатися з налаштуваннями TX на камері:

ПараметрTX (камера)RX (наземка)Опис
-k88Data-блоки FEC
-n1212Всього блоків FEC
-p00Порт (канал) WFB

2.3 Перегляд відео

PixelPilot (Android)

  1. Підключіть наземну станцію до телефону
  2. Відкрийте PixelPilot
  3. Встановіть RTP-джерело: udp://0.0.0.0:5600

ffplay (Linux / Mac)

bash
ffplay -fflags nobuffer -flags low_delay -framedrop \
  -analyzeduration 0 -probesize 32 \
  -i udp://0.0.0.0:5600

QGroundControl

  1. Відкрийте налаштування → Video
  2. Встановіть «Video Source»: UDP h.265 Video Stream
  3. Порт: 5600

GStreamer

bash
gst-launch-1.0 udpsrc port=5600 \
  caps="application/x-rtp,media=video,encoding-name=H265" ! \
  rtph265depay ! h265parse ! avdec_h265 ! autovideosink sync=false

Частина 3: Аудіо через WFB-ng

venc підтримує передачу аудіо паралельно з відео:

3.1 Увімкнення аудіо на камері

Оновіть /etc/venc.json:

json
{
  "audio": {
    "enabled": true,
    "sampleRate": 16000,
    "channels": 1,
    "codec": "g711a",
    "volume": 80,
    "mute": false
  },
  "outgoing": {
    "audioPort": 5601
  }
}

Аудіо та Unix-сокет

При використанні unix:// та audioPort: 0 аудіо передається разом з відео через той самий сокет. При audioPort > 0 аудіо відправляється на окремий UDP-порт 127.0.0.1:<audioPort>.

3.2 Прийом аудіо на наземній станції

bash
# Окремий WFB-канал для аудіо
wfb_rx -p 1 -c 127.0.0.1 -u 5601 -k 4 -n 8 wlan0

# Відтворення
ffplay -nodisp -fflags nobuffer -i udp://0.0.0.0:5601

Частина 4: Адаптивний контроль (просунуте)

4.1 Scene-Change IDR

Для покращення відновлення потоку при різких змінах сцени (зліт, маневри):

bash
# Увімкнути детекцію сцен (тільки Star6E)
curl "http://localhost/api/v1/set?video0.sceneThreshold=150"
curl "http://localhost/api/v1/set?video0.sceneHoldoff=2"
  • sceneThreshold: 150 — тригер при ≈1.5x стрибку розміру кадру
  • sceneHoldoff: 2 — мінімальний інтервал між IDR кадрами

4.2 Sidecar для зовнішнього контролера

Якщо ви використовуєте зовнішній контролер якості зв'язку (adaptive link):

bash
curl "http://localhost/api/v1/set?outgoing.sidecarPort=6666"

Sidecar надсилає покадрову телеметрію: frame_type, complexity, scene_change, idr_inserted, frames_since_idr.


Частина 5: Запис на SD-картку

venc підтримує одночасний стрімінг та запис:

bash
# Увімкнити запис через API
curl "http://localhost/api/v1/record/start"

# Перевірити статус
curl "http://localhost/api/v1/record/status"

# Зупинити запис
curl "http://localhost/api/v1/record/stop"

Gemini-режим — стрімінг на WFB-ng у низькому бітрейті, а запис на SD у високій якості:

json
{
  "record": {
    "enabled": true,
    "mode": "dual",
    "dir": "/mnt/mmcblk0p1",
    "format": "ts",
    "bitrate": 20000,
    "fps": 120,
    "gopSize": 2
  }
}

INFO

Формат MPEG-TS не потребує фіналізації файлу. Навіть при раптовому відключенні живлення запис буде читабельним до останнього записаного пакету.


Перевірка інтеграції

Після налаштування виконайте перевірку:

bash
# 1. На камері — перевірити, що venc стрімить
curl http://localhost/api/v1/config | grep -A5 outgoing

# 2. На камері — перевірити FPS
curl http://localhost/api/v1/version

# 3. На наземній станції — перевірити прийом
# (має показати відео без значних затримок)
ffplay -fflags nobuffer -i udp://0.0.0.0:5600

# 4. Запитати IDR-кейфрейм для початку декодування
curl http://192.168.1.10/request/idr

Порівняння: venc + WFB-ng vs Majestic + WFB-ng

Аспектvenc + WFB-ngMajestic + WFB-ng
ЗатримкаНижча (Unix-сокет / SHM)UDP через мережевий стек
API84 параметри в реальному часіОбмежений набір
ЗаписGemini-режим (стрім + запис)Базовий
ISP-тюнінг60+ параметрів + export/importОбмежений
EISGyroGlide-Lite (Star6E)Немає
Веб-панельВбудована з повним керуванням
СирціВідкриті (MIT)Закриті

Наступні кроки

Проект спільноти. Не є офіційним ресурсом OpenIPC.