Nodeflux Central
Live Streaming

Live Streaming

Menonton stream aktif lewat RTSP, RTMP, dan HTTP-TS, menerima publish RTMP dari luar dengan token, serta memantau koneksi klien.

Pengenalan

Setiap device yang active dipublish sebagai stream {channel}/{name}. Liodra lalu menyajikannya ulang ke banyak penonton sekaligus tanpa membebani kamera. Ada dua arah lalu lintas live:

  • Keluar (play): Visionaire, VLC, browser, atau sistem lain menarik stream dari Liodra.
  • Masuk (publish): encoder, aplikasi mobile, atau drone mem-publish RTMP langsung ke Liodra tanpa perlu didaftarkan sebagai device (Liodra hanya menjadi penerima; stream tetap direkam bila berada di channel yang merekam).
ProtokolPortURLCatatan
RTSP8554rtsp://host:8554/live/camera_frontDisarankan untuk Visionaire dan NVR. Tidak ada di image legacy -srs6
RTMP1935rtmp://host:1935/live/camera_frontUntuk pemutar dan encoder klasik. Channel vod/vop perlu ?vhost=
HTTP-TS via Liodra9080http://host:9080/api/v1/play/ts/live/camera_frontUntuk browser (mpegts.js), mendukung ?transcode=true
HTTP-TS langsung8080http://host:8080/live/camera_front.tsTanpa proxy API, tanpa transcode

Liodra menyajikan RTMP, RTSP, dan HTTP-TS saja. HLS, HTTP-FLV, dan WebRTC tidak diaktifkan agar footprint tetap kecil dan HEVC tetap didukung end-to-end.


Cara Menggunakan

Isi stream_address pada Stream Visionaire, atau buka di VLC:

rtsp://<host-liodra>:8554/live/camera_front

Bila RTMP_SECRET diset, sertakan token yang sama dengan hasil registrasi: rtsp://<host>:8554/live/camera_front?token=<token>. Cara mendapatkan token dijelaskan di bagian Otentikasi RTMP.

<video id="player" controls muted autoplay></video>
<script src="https://cdn.jsdelivr.net/npm/mpegts.js@1.7.3/dist/mpegts.js"></script>
<script>
  const player = mpegts.createPlayer({
    type: "mpegts",
    isLive: true,
    url: "http://<host-liodra>:9080/api/v1/play/ts/live/camera_front?transcode=true",
  });
  player.attachMediaElement(document.getElementById("player"));
  player.load();
  player.play();
</script>

transcode=true aman diberikan selalu: untuk stream H.264 Liodra memproksi langsung tanpa proses tambahan; untuk HEVC Liodra menyalakan satu proses transcode per penonton (dibatasi MAX_ONDEMAND_PROCESSES). Ini yang dipakai halaman Streams Lenz untuk pratinjau live.

Minta URL publish (wajib bila RTMP_SECRET diset; tanpa secret tetap berguna untuk memvalidasi nama dan mencegah dua publisher pada stream yang sama):

curl -X POST http://localhost:9080/api/v1/register \
  -H 'Content-Type: application/json' \
  -d '{ "device_name": "drone_01", "channel": "live/drone" }'
{
  "success": true,
  "data": {
    "device_name": "drone_01",
    "channel": "live/drone",
    "rtmp_url": "rtmp://127.0.0.1:1935/live/drone/drone_01?token=3f9a1c..."
  }
}

Ganti host 127.0.0.1 dengan alamat publik Liodra (URL dibangun dari sudut pandang dalam container), lalu publish dengan encoder Anda:

ffmpeg -re -i input.mp4 -c copy -f flv \
  "rtmp://<host-liodra>:1935/live/drone/drone_01?token=3f9a1c..."

Stream langsung tersedia di semua protokol keluaran dan, karena berada di channel yang merekam, direkam oleh DVR ke recordings/live/drone/drone_01/ bila Liodra berjalan dengan --as-nvr.


Fitur Utama

Proxy HTTP-TS dengan transcode on-demand

GET /api/v1/play/ts/{path} adalah pintu masuk yang dipakai Lenz. Tanpa transcode, Liodra hanya meneruskan byte stream (menambahkan .ts dan ?vhost= bila perlu). Dengan transcode=true, Liodra memeriksa codec stream: H.264 tetap diproksi langsung, HEVC di-transcode ke H.264 dengan encoder hardware bila tersedia, atau encoder software bila tidak.

Setiap penonton HEVC memakai satu proses transcode. Batasnya MAX_ONDEMAND_PROCESSES (32); di atasnya Liodra menjawab 503 dengan header Retry-After: 5. Proses yang penontonnya pergi dihentikan otomatis dan bisa dilihat di GET /api/v1/monitor/ondemand.

Otentikasi RTMP

Secara default siapa pun yang bisa mencapai port 1935 dapat publish atau play. Set RTMP_SECRET untuk mewajibkan token:

  1. Klien memanggil POST /api/v1/register dengan device_name dan channel (keduanya harus cocok ^[a-z0-9][a-z0-9_-]*$, channel boleh bertingkat dengan /). Liodra menolak 409 bila stream tersebut sedang dipublish orang lain.
  2. Liodra menurunkan token (32 karakter hex) dari RTMP_SECRET dan {channel}/{device_name}, lalu mengembalikan rtmp_url yang sudah berisi ?token=.
  3. Setiap publish dan play divalidasi terhadap token tersebut; koneksi tanpa token atau dengan token yang salah ditolak dan dicatat di log sebagai RTMP auth denied.
  4. Play dari dalam container sendiri selalu diizinkan agar HTTP-TS, proxy /play/ts, dan DVR tetap berjalan tanpa token. Play dari host lain (termasuk RTSP di 8554) memerlukan ?token=.

Token bersifat deterministik untuk pasangan channel/device_name yang sama dan tidak berubah selama RTMP_SECRET tidak diganti, sehingga cukup didaftarkan sekali per perangkat. Device internal (dibuat lewat /api/v1/devices) otomatis menyertakan token saat publish.

Mengganti RTMP_SECRET membatalkan semua URL publish yang sudah dibagikan. Rencanakan rotasi bersama pemilik encoder.

Daftar stream dan klien

  • GET /api/v1/streams merangkum stream yang sedang dipublish beserta codec dan jumlah penonton.
  • GET /api/v1/clients menampilkan semua koneksi aktif (publisher maupun player), dengan IP, tipe, bitrate 30 detik terakhir, dan device bila koneksi tersebut milik device Liodra.
  • DELETE /api/v1/clients/{id} memutus satu koneksi, misalnya untuk menendang penonton yang tidak sah atau publisher yang menggantung.

Latensi

Penonton HTTP-TS baru menerima buffer 3 detik terlebih dahulu agar pemutar cepat mulai, dengan konsekuensi tertinggal sekitar 3 detik dari live. RTSP dan RTMP mendekati latensi jaringan ditambah GOP kamera.


API Reference

Detail lengkap di API Reference: Live Streaming.

MethodPathFungsi
GET/api/v1/play/ts/{path}Proxy HTTP-TS (opsional transcode=true)
GET/api/v1/streamsStream yang sedang dipublish
GET/api/v1/clientsKoneksi klien aktif
GET/api/v1/clients/{id}Detail satu koneksi
DELETE/api/v1/clients/{id}Putuskan koneksi
POST/api/v1/registerDapatkan URL publish RTMP (+ token)

Tips & Troubleshooting

Selanjutnya

On this page