← Back to the blog
Guides #rtmp

Stream from OBS with RTMP ingest

Create an RTMP ingress, drop the URL and stream key into OBS, and go live. Includes the optional stream password and a player URL you can share.

2 min read
Leer en español

RTMP is the workhorse

RTMP is the most widely supported way to push a stream from software like OBS or ffmpeg. In StreamHub you create an RTMP ingress, which returns a push URL and a stream key; OBS pushes to it, and the feed becomes a room you can watch and record.

RTMP ingest defaults to transcoding on (multi-layer), which is what the adaptive player and HLS need — so you get scalable playback for free.

Step 1 — create the ingress

curl -s -X POST $BASE/apps/live/ingress -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"inputType":"rtmp","room":"studio"}'

The response gives you everything OBS needs:

{ "data": {
  "rtmp_url": "rtmp://media.example.com:1935/live/abc123",
  "stream_key": "abc123",
  "player_url": "https://media.example.com/play/live/studio",
  "embed_iframe": "<iframe ...></iframe>"
} }

Step 2 — configure OBS

In OBS, open Settings → Stream and choose Custom:

  • Server: rtmp://media.example.com:1935/live
  • Stream Key: abc123

Click Start Streaming. Within a moment the stream appears in the app's live tab, and the player_url is watchable.

The same works with ffmpeg:

ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f flv \
  rtmp://media.example.com:1935/live/abc123

Optional — password-protect the push

LiveKit has no native RTMP password, so StreamHub adds one. With the rtmpPassword feature enabled on the app, the ingress response includes a stream_password, and you authorize the push before it starts:

curl -s -X POST $BASE/apps/live/ingress/IN_xxx/validate \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"password":"s3cr3t"}'

If an RTMP push starts unauthorized, StreamHub terminates it and fires stream_ended with reason unauthorized_rtmp_password.

Watch and share

The player_url and embed_iframe are public — no token needed — so you can drop the iframe straight into a page. For an interactive audience use the WebRTC player; for a large or mobile audience, the same room is available as HLS at /hls/live/studio/index.m3u8.

One ingress equals one stream: the webhook layer dedupes the ingress event with the participant so your streams list stays clean.