Інтеграція Waybeam з WFB-ng
Ця інструкція описує, як повністю замінити Majestic на Waybeam у зв'язці з WFB-ng (WiFi Broadcast) для FPV-стрімінгу з мінімальною затримкою. Інструкцію звірено з версією v0.40.1 (липень 2026).
Архітектура системи
Частина 1: Налаштування камери (VTX)
1.1 Передумови
Перед початком переконайтеся, що:
- ✅ OpenIPC прошивка встановлена на камері
- ✅ WFB-ng (
wfb_tx) встановлений та працює - ✅ WiFi-адаптер (RTL8812EU або RTL8812AU) підключений
- ✅ SSH-доступ до камери наявний
Встановлення Waybeam
Якщо Waybeam ще не встановлений, дивіться Встановлення Waybeam на камеру.
1.2 Зупинити Majestic
# Зупинити Majestic
killall majestic 2>/dev/null
# Вимкнути автозапуск (якщо використовується init.d)
chmod -x /etc/init.d/S95majestic 2>/dev/null1.3 Налаштування Waybeam для WFB-ng
Головна відмінність від Majestic — спосіб передачі відео до WFB-ng.
Спосіб 1: Unix-сокет (рекомендований)
Найбільш ефективний метод — передача через абстрактний Unix-сокет. Це зменшує затримку порівняно з UDP, оскільки дані не проходять через мережевий стек ядра.
Відредагуйте /etc/waybeam.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:
{
"outgoing": {
"enabled": true,
"server": "udp://127.0.0.1:5600",
"streamMode": "rtp",
"maxPayloadSize": 1400,
"connectedUdp": true,
"audioPort": 0,
"sidecarPort": 0
}
}Режим apfpv (WiFi без WFB-ng)
У WiFi-режимі apfpv Waybeam стартує з unconnected UDP (connectedUdp: false) і обмежує RTP-payload 1400 байтами — менше фрагментації у WiFi-каналі. Для зв'язки з WFB-ng лишайте connectedUdp: true.
Спосіб 3: Shared Memory (SHM)
Для максимальної продуктивності — через кільцевий буфер у спільній пам'яті:
{
"outgoing": {
"enabled": true,
"server": "shm://venc_ring",
"streamMode": "rtp",
"maxPayloadSize": 1400,
"connectedUdp": true,
"audioPort": 0,
"sidecarPort": 0
}
}SHM та аудіо
shm:// працює тільки в режимі RTP і не може передавати аудіо через основний канал. Якщо вам потрібне аудіо при shm:// — встановіть audioPort > 0 (наприклад, 5601), аудіо піде на окремий UDP-порт.
1.4 Налаштування WFB-ng на камері
Конфігурація WFB-ng повинна відповідати способу передачі, який ви обрали у Waybeam.
Для Unix-сокету — в конфігурації wfb_tx вкажіть той самий абстрактний сокет:
# У конфігурації wfb_tx
# Вхідний потік — з Unix-сокету від waybeam
peer = listen://unix://wfb_txДля UDP на localhost:
# У конфігурації wfb_tx
# Вхідний потік — UDP від waybeam
peer = listen://udp://127.0.0.1:56001.5 Оптимальні параметри відео для WFB-ng
Рекомендовані параметри для стабільного FPV-стрімінгу через WiFi Broadcast:
{
"video0": {
"rcMode": "cbr",
"fps": 60,
"size": "1920x1080",
"bitrate": 8192,
"gopSize": 1.0,
"qpDelta": -4,
"resilience": "racing"
}
}Пояснення параметрів:
| Параметр | Рекомендація | Чому |
|---|---|---|
rcMode: "cbr" | CBR | Стабільний бітрейт — краще для радіоканалу |
fps: 60 | 60 fps | Баланс між плавністю і навантаженням |
bitrate: 8192 | 8 Мбіт/с | Оптимально для 20 МГц каналу WFB |
gopSize: 1.0 | 1 секунда | Швидке відновлення (діє лише коли resilience: "off") |
resilience: "racing" | Intra-refresh | Відновлення смугами без очікування IDR (потребує reboot) |
Для версій до v0.19 — поле frameLost
У старих версіях тут додатково рекомендувалося "frameLost": true — SDK-стратегія, що дозволяла енкодеру пропускати кадри при перевантаженні. У v0.19 її прибрано повністю: поля більше не існує, натомість діє нижня межа бітрейту 1000 kbps. Якщо ключ лишився у вашому конфізі — видаліть його.
Кодек завжди H.265
Waybeam кодує тільки H.265 (HEVC) — поля video0.codec немає. Переконайтеся, що приймач налаштований на H.265.
resilience потребує reboot
Зміна video0.resilience через API повертає {"reboot_required": true} і застосовується лише після перезавантаження камери. У файлі конфігурації він спрацьовує одразу при старті. Деталі — у розділі Веб-панель та HTTP API.
Бітрейт і ширина каналу
Підбирайте бітрейт відповідно до пропускної здатності WFB-ng:
| Ширина каналу | MCS | Макс. бітрейт | Рекомендовано |
|---|---|---|---|
| 20 МГц | MCS 3 | ~20 Мбіт/с | 8–12 Мбіт/с |
| 20 МГц | MCS 1 | ~10 Мбіт/с | 4–6 Мбіт/с |
| 40 МГц | MCS 3 | ~40 Мбіт/с | 16–22 Мбіт/с |
Бюджетуйте +20–30% бітрейту при увімкненому intra-refresh (resilience ≠ off).
1.6 Порядок запуску сервісів
Правильний порядок запуску на камері:
# 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. Запустити waybeam
waybeam &Init-скрипт
Для автоматичного запуску створіть init-скрипт як описано у Встановлення на камеру — Крок 7. Переконайтеся, що порядок номерів скриптів правильний: WiFi → WFB-ng → waybeam.
Частина 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-порт для програвача:
# Запуск WFB-ng приймача
wfb_rx -p 0 -c 127.0.0.1 -u 5600 -k 8 -n 12 wlan0Параметри повинні збігатися з налаштуваннями TX на камері:
| Параметр | TX (камера) | RX (наземка) | Опис |
|---|---|---|---|
-k | 8 | 8 | Data-блоки FEC |
-n | 12 | 12 | Всього блоків FEC |
-p | 0 | 0 | Порт (канал) WFB |
2.3 Перегляд відео
PixelPilot (Android)
- Підключіть наземну станцію до телефону
- Відкрийте PixelPilot
- Встановіть RTP-джерело:
udp://0.0.0.0:5600
ffplay (Linux / Mac)
ffplay -fflags nobuffer -flags low_delay -framedrop \
-analyzeduration 0 -probesize 32 \
-i udp://0.0.0.0:5600QGroundControl
- Відкрийте налаштування → Video
- Встановіть «Video Source»:
UDP h.265 Video Stream - Порт:
5600
GStreamer
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
Waybeam підтримує передачу аудіо паралельно з відео. Підтримувані кодеки: opus, g711a, g711u, pcm.
3.1 Увімкнення аудіо на камері
Оновіть /etc/waybeam.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>. Від'ємний audioPort (наприклад, -1) — режим «лише запис»: звук пише у файл на SD, але в ефір не йде. Параметри audio.* (крім audio.mute) — restart-required; audio.mute змінюється на льоту.
3.2 Прийом аудіо на наземній станції
# Окремий WFB-канал для аудіо
wfb_rx -p 1 -c 127.0.0.1 -u 5601 -k 4 -n 8 wlan0
# Відтворення (G.711a)
ffplay -nodisp -fflags nobuffer -i udp://0.0.0.0:5601Opus через GStreamer
Для Opus (PT 98, 48 кГц) використовуйте rtpjitterbuffer перед rtpopusdepay, інакше позачергові UDP-пакети спричиняють клацання:
gst-launch-1.0 -v \
udpsrc port=5601 caps="application/x-rtp,media=audio,clock-rate=48000,encoding-name=OPUS,payload=98,channels=1" \
! rtpjitterbuffer latency=40 ! rtpopusdepay ! opusdec plc=true \
! audioconvert ! audioresample ! autoaudiosink sync=falseЧастина 4: Адаптивний контроль (просунуте)
4.1 Scene-Change IDR
Для покращення відновлення потоку при різких змінах сцени (зліт, маневри):
# Увімкнути детекцію сцен (тільки 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 кадрами
Star6E only
Scene-change IDR підтримується лише на Star6E. На Maruko ці поля позначені як непідтримувані у /api/v1/capabilities.
4.2 Sidecar для зовнішнього контролера
Якщо ви використовуєте зовнішній контролер якості зв'язку (adaptive link):
curl "http://localhost/api/v1/set?outgoing.sidecarPort=6666"Sidecar надсилає покадрову телеметрію: тайминги encode/send, односторонню затримку, джитер, а при активній детекції сцен — frame_type, complexity, scene_change, idr_inserted, frames_since_idr.
З v0.39 sidecar мультипідписний — до 4 одержувачів одночасно (TTL 5 с на слот), тож adaptive-link контролер і HUD можуть слухати телеметрію паралельно, не «викрадаючи» потік один в одного. За увімкненої секції attitude до кожного кадру додається трейлер ATTITUDE (roll/pitch/yaw для штучного горизонту в HUD) — тільки Star6E; деталі у довіднику API.
Частина 5: Запис на SD-картку
Waybeam підтримує одночасний стрімінг та запис:
# Увімкнути запис через API (Star6E)
curl "http://localhost/api/v1/record/start"
# Перевірити статус
curl "http://localhost/api/v1/record/status"
# Зупинити запис
curl "http://localhost/api/v1/record/stop"Запис на Maruko
HTTP-керування записом працює лише на Star6E. На Maruko запис вмикається тільки через конфіг (record.enabled=true + record.mode=...), а /api/v1/record/start|stop повертає 501 not_implemented.
Gemini-режим — стрімінг на WFB-ng у низькому бітрейті, а запис на SD у високій якості:
{
"record": {
"enabled": true,
"mode": "dual",
"dir": "/mnt/mmcblk0p1",
"format": "ts",
"bitrate": 20000,
"fps": 120,
"gopSize": 2
}
}INFO
Формат MPEG-TS не потребує фіналізації файлу. Навіть у разі раптового знеструмлення запис залишається придатним для читання до останнього записаного пакета. Файли ротуються на межах IDR за часом (maxSeconds) або розміром (maxMB).
З v0.17.1 другий VENC-канал створюється одразу при record.mode: "dual" / "dual-stream" (а не лише при record.enabled: true), і бітрейт запису на SD повністю незалежний від ефірного.
Перевірка інтеграції
Після налаштування виконайте перевірку:
# 1. На камері — перевірити, що waybeam стрімить
curl http://localhost/api/v1/config | grep -A5 outgoing
# 2. На камері — перевірити стан транспорту (заповнення, втрати)
curl http://localhost/api/v1/transport/status
# 3. На наземній станції — перевірити прийом
ffplay -fflags nobuffer -i udp://0.0.0.0:5600
# 4. Запитати IDR-кейфрейм для початку декодування
curl http://192.168.1.10/request/idrПорівняння: Waybeam + WFB-ng vs Majestic + WFB-ng
| Аспект | Waybeam + WFB-ng | Majestic + WFB-ng |
|---|---|---|
| Затримка | Нижча (Unix-сокет / SHM) | UDP через мережевий стек |
| API | Реалтаймова зміна полів | Обмежений набір |
| Стійкість до втрат | Resilience-пресети (intra-refresh + SVC-T) | Базова |
| Запис | Gemini-режим (стрім + запис) | Базовий |
| ISP-тюнінг | 62 параметри + export/import | Обмежений |
| Стабілізація / зум | Kalman-стабілізація (обидва чіпи) + цифровий зум | Немає |
| Веб-панель | Вбудована з повним керуванням | — |
| Сирці | Відкриті (MIT) | Закриті |
Наступні кроки
- Веб-панель та HTTP API — керування через браузер
- Огляд Waybeam — всі можливості
- Встановлення на камеру — початкове встановлення

