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).
| Protokol | Port | URL | Catatan |
|---|---|---|---|
| RTSP | 8554 | rtsp://host:8554/live/camera_front | Disarankan untuk Visionaire dan NVR. Tidak ada di image legacy -srs6 |
| RTMP | 1935 | rtmp://host:1935/live/camera_front | Untuk pemutar dan encoder klasik. Channel vod/vop perlu ?vhost= |
| HTTP-TS via Liodra | 9080 | http://host:9080/api/v1/play/ts/live/camera_front | Untuk browser (mpegts.js), mendukung ?transcode=true |
| HTTP-TS langsung | 8080 | http://host:8080/live/camera_front.ts | Tanpa 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_frontBila 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/[email protected]/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:
- Klien memanggil
POST /api/v1/registerdengandevice_namedanchannel(keduanya harus cocok^[a-z0-9][a-z0-9_-]*$, channel boleh bertingkat dengan/). Liodra menolak409bila stream tersebut sedang dipublish orang lain. - Liodra menurunkan token (32 karakter hex) dari
RTMP_SECRETdan{channel}/{device_name}, lalu mengembalikanrtmp_urlyang sudah berisi?token=. - 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. - 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 di8554) 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/streamsmerangkum stream yang sedang dipublish beserta codec dan jumlah penonton.GET /api/v1/clientsmenampilkan semua koneksi aktif (publisher maupun player), dengan IP, tipe, bitrate 30 detik terakhir, dandevicebila 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.
| Method | Path | Fungsi |
|---|---|---|
GET | /api/v1/play/ts/{path} | Proxy HTTP-TS (opsional transcode=true) |
GET | /api/v1/streams | Stream yang sedang dipublish |
GET | /api/v1/clients | Koneksi klien aktif |
GET | /api/v1/clients/{id} | Detail satu koneksi |
DELETE | /api/v1/clients/{id} | Putuskan koneksi |
POST | /api/v1/register | Dapatkan URL publish RTMP (+ token) |