openvibers/openvibe.live Commits
WHIP CLI instructions that work: FFmpeg 8+, baseline H.264 without B-frames (#307)
Changes
@@@ -1,6 +1,6 @@# WHIP Ingest API--OpenVibe.Live accepts live video over **WHIP** (WebRTC-HTTP Ingestion Protocol, [RFC 9725](https://www.rfc-editor.org/rfc/rfc9725)). Anything that can produce a WebRTC offer can go live with a single HTTP request — OBS 30+, FFmpeg 7+, GStreamer, hardware encoders, **and a plain web page**.++OpenVibe.Live accepts live video over **WHIP** (WebRTC-HTTP Ingestion Protocol, [RFC 9725](https://www.rfc-editor.org/rfc/rfc9725)). Anything that can produce a WebRTC offer can go live with a single HTTP request — OBS 30+, FFmpeg 8+, GStreamer, hardware encoders, **and a plain web page**.> **Can a frontend-only site stream to WHIP?** Yes. The endpoint is open to every origin (CORS `*`) and authenticates with your stream key, so a static page with no backend can publish straight from the browser using only `RTCPeerConnection` + `fetch()`. Jump to [Publishing from a browser](#publishing-from-a-browser), or try the hosted single-file demo at **<https://openvibe.live/whip-publisher.html>** (view-source to copy it).@@@ -161,7 +161,7 @@ Things worth knowing:## Other clients- **OBS Studio (30+):** *Settings → Stream → Service: WHIP*, Server = the WHIP URL, Bearer Token = your stream key.--- **FFmpeg (7.0+):** `ffmpeg -re -i input.mp4 -c:v libx264 -profile:v baseline -level 3.1 -pix_fmt yuv420p -c:a libopus -f whip "https://whip.openvibe.live/whip/<streamKey>"`++- **FFmpeg (8.0+, which added the WHIP muxer; `ffmpeg -muxers | grep whip` lists it):** `ffmpeg -re -i input.mp4 -c:v libx264 -profile:v baseline -level 3.1 -pix_fmt yuv420p -bf 0 -c:a libopus -ar 48000 -f whip "https://whip.openvibe.live/whip/<streamKey>"`. From a script, with the slot set up by a Live API token: [OpenVibe.Examples `go-live`](https://github.com/OpenVibers/OpenVibe.Examples/tree/main/examples/go-live).- **GStreamer:** `... ! whipsink whip-endpoint="https://whip.openvibe.live/whip/<streamKey>"` (needs `gst-plugins-rs`).The Broadcast page shows ready-to-paste commands for each with your key filled in. See [Broadcasting Guide](broadcasting.md) for the other ingest methods.@@@ -1558,7 +1558,7 @@ rpicam-vid -t 0 --width 1280 --height 720 --framerate 30 \\<!-- ═══ WebRTC (WHIP) Tab ═══ --><div class="bc-ws-cli-panel" data-clipanel="whip">-- <p class="bc-ws-cli-desc"><strong>Low latency + high quality</strong> — WHIP (WebRTC HTTP Ingest Protocol) supports H.264/VP8/VP9 + Opus audio. Sub-second latency with modern codecs. Requires FFmpeg 7+ or GStreamer with WHIP support.</p>++ <p class="bc-ws-cli-desc"><strong>Low latency + high quality</strong> — WHIP (WebRTC HTTP Ingest Protocol) takes H.264 (Constrained Baseline, no B-frames) or VP8 video with Opus audio, at sub-second latency. Requires FFmpeg 8.0+ (it added the WHIP muxer: <code>ffmpeg -muxers | grep whip</code>) or GStreamer with WHIP support.</p><div class="bc-ws-method-info-row" style="margin-bottom:4px"><span class="bc-ws-method-info-label">WHIP URL</span>@@@ -1572,22 +1572,22 @@ rpicam-vid -t 0 --width 1280 --height 720 --framerate 30 \\<span class="bc-ws-method-info-note">Use the stream key above</span></div>-- <h5><i class="fa-solid fa-video"></i> Camera + Audio (FFmpeg 7+)</h5>++ <h5><i class="fa-solid fa-video"></i> Camera + Audio (FFmpeg 8+)</h5><pre class="bc-ws-cli-code">ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default \\-- -c:v libx264 -preset veryfast -tune zerolatency -b:v 2500k \\++ -c:v libx264 -profile:v baseline -pix_fmt yuv420p -bf 0 -g 60 -preset veryfast -tune zerolatency -b:v 2500k \\-c:a libopus -b:a 128k -ar 48000 \\-f whip "${esc(whipUrl)}"</pre>-- <h5><i class="fa-solid fa-display"></i> Screen Capture (FFmpeg 7+)</h5>++ <h5><i class="fa-solid fa-display"></i> Screen Capture (FFmpeg 8+)</h5><pre class="bc-ws-cli-code">ffmpeg -f x11grab -s 1920x1080 -r 30 -i :0.0 \\-f pulse -i default \\-- -c:v libx264 -preset veryfast -tune zerolatency -b:v 3000k \\++ -c:v libx264 -profile:v baseline -pix_fmt yuv420p -bf 0 -g 60 -preset veryfast -tune zerolatency -b:v 3000k \\-c:a libopus -b:a 128k -ar 48000 \\-f whip "${esc(whipUrl)}"</pre>-- <h5><i class="fa-solid fa-film"></i> MP4 / File Loop (FFmpeg 7+)</h5>++ <h5><i class="fa-solid fa-film"></i> MP4 / File Loop (FFmpeg 8+)</h5><pre class="bc-ws-cli-code">ffmpeg -re -stream_loop -1 -i video.mp4 \\-- -c:v libx264 -preset veryfast -tune zerolatency -b:v 2500k \\++ -c:v libx264 -profile:v baseline -pix_fmt yuv420p -bf 0 -g 60 -preset veryfast -tune zerolatency -b:v 2500k \\-c:a libopus -b:a 128k -ar 48000 \\-f whip "${esc(whipUrl)}"</pre>
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
# WHIP Ingest API
# WHIP Ingest API
-OpenVibe.Live accepts live video over **WHIP** (WebRTC-HTTP Ingestion Protocol, [RFC 9725](https://www.rfc-editor.org/rfc/rfc9725)). Anything that can produce a WebRTC offer can go live with a single HTTP request — OBS 30+, FFmpeg 7+, GStreamer, hardware encoders, **and a plain web page**.
+OpenVibe.Live accepts live video over **WHIP** (WebRTC-HTTP Ingestion Protocol, [RFC 9725](https://www.rfc-editor.org/rfc/rfc9725)). Anything that can produce a WebRTC offer can go live with a single HTTP request — OBS 30+, FFmpeg 8+, GStreamer, hardware encoders, **and a plain web page**.
> **Can a frontend-only site stream to WHIP?** Yes. The endpoint is open to every origin (CORS `*`) and authenticates with your stream key, so a static page with no backend can publish straight from the browser using only `RTCPeerConnection` + `fetch()`. Jump to [Publishing from a browser](#publishing-from-a-browser), or try the hosted single-file demo at **<https://openvibe.live/whip-publisher.html>** (view-source to copy it).
> **Can a frontend-only site stream to WHIP?** Yes. The endpoint is open to every origin (CORS `*`) and authenticates with your stream key, so a static page with no backend can publish straight from the browser using only `RTCPeerConnection` + `fetch()`. Jump to [Publishing from a browser](#publishing-from-a-browser), or try the hosted single-file demo at **<https://openvibe.live/whip-publisher.html>** (view-source to copy it).
@@ -161,7 +161,7 @@ Things worth knowing:
@@ -161,7 +161,7 @@ Things worth knowing:
## Other clients
## Other clients
- **OBS Studio (30+):** *Settings → Stream → Service: WHIP*, Server = the WHIP URL, Bearer Token = your stream key.
- **OBS Studio (30+):** *Settings → Stream → Service: WHIP*, Server = the WHIP URL, Bearer Token = your stream key.
-- **FFmpeg (7.0+):** `ffmpeg -re -i input.mp4 -c:v libx264 -profile:v baseline -level 3.1 -pix_fmt yuv420p -c:a libopus -f whip "https://whip.openvibe.live/whip/<streamKey>"`
+- **FFmpeg (8.0+, which added the WHIP muxer; `ffmpeg -muxers | grep whip` lists it):** `ffmpeg -re -i input.mp4 -c:v libx264 -profile:v baseline -level 3.1 -pix_fmt yuv420p -bf 0 -c:a libopus -ar 48000 -f whip "https://whip.openvibe.live/whip/<streamKey>"`. From a script, with the slot set up by a Live API token: [OpenVibe.Examples `go-live`](https://github.com/OpenVibers/OpenVibe.Examples/tree/main/examples/go-live).
- **GStreamer:** `... ! whipsink whip-endpoint="https://whip.openvibe.live/whip/<streamKey>"` (needs `gst-plugins-rs`).
- **GStreamer:** `... ! whipsink whip-endpoint="https://whip.openvibe.live/whip/<streamKey>"` (needs `gst-plugins-rs`).
The Broadcast page shows ready-to-paste commands for each with your key filled in. See [Broadcasting Guide](broadcasting.md) for the other ingest methods.
The Broadcast page shows ready-to-paste commands for each with your key filled in. See [Broadcasting Guide](broadcasting.md) for the other ingest methods.
@@ -1558,7 +1558,7 @@ rpicam-vid -t 0 --width 1280 --height 720 --framerate 30 \\
@@ -1558,7 +1558,7 @@ rpicam-vid -t 0 --width 1280 --height 720 --framerate 30 \\
<!-- ═══ WebRTC (WHIP) Tab ═══ -->
<!-- ═══ WebRTC (WHIP) Tab ═══ -->
<div class="bc-ws-cli-panel" data-clipanel="whip">
<div class="bc-ws-cli-panel" data-clipanel="whip">
- <p class="bc-ws-cli-desc"><strong>Low latency + high quality</strong> — WHIP (WebRTC HTTP Ingest Protocol) supports H.264/VP8/VP9 + Opus audio. Sub-second latency with modern codecs. Requires FFmpeg 7+ or GStreamer with WHIP support.</p>
+ <p class="bc-ws-cli-desc"><strong>Low latency + high quality</strong> — WHIP (WebRTC HTTP Ingest Protocol) takes H.264 (Constrained Baseline, no B-frames) or VP8 video with Opus audio, at sub-second latency. Requires FFmpeg 8.0+ (it added the WHIP muxer: <code>ffmpeg -muxers | grep whip</code>) or GStreamer with WHIP support.</p>
<div class="bc-ws-method-info-row" style="margin-bottom:4px">
<div class="bc-ws-method-info-row" style="margin-bottom:4px">
<span class="bc-ws-method-info-label">WHIP URL</span>
<span class="bc-ws-method-info-label">WHIP URL</span>
@@ -1572,22 +1572,22 @@ rpicam-vid -t 0 --width 1280 --height 720 --framerate 30 \\
@@ -1572,22 +1572,22 @@ rpicam-vid -t 0 --width 1280 --height 720 --framerate 30 \\
<span class="bc-ws-method-info-note">Use the stream key above</span>
<span class="bc-ws-method-info-note">Use the stream key above</span>
</div>
</div>
- <h5><i class="fa-solid fa-video"></i> Camera + Audio (FFmpeg 7+)</h5>
+ <h5><i class="fa-solid fa-video"></i> Camera + Audio (FFmpeg 8+)</h5>
<pre class="bc-ws-cli-code">ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default \\
<pre class="bc-ws-cli-code">ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default \\
- -c:v libx264 -preset veryfast -tune zerolatency -b:v 2500k \\
+ -c:v libx264 -profile:v baseline -pix_fmt yuv420p -bf 0 -g 60 -preset veryfast -tune zerolatency -b:v 2500k \\
-c:a libopus -b:a 128k -ar 48000 \\
-c:a libopus -b:a 128k -ar 48000 \\
-f whip "${esc(whipUrl)}"</pre>
-f whip "${esc(whipUrl)}"</pre>
- <h5><i class="fa-solid fa-display"></i> Screen Capture (FFmpeg 7+)</h5>
+ <h5><i class="fa-solid fa-display"></i> Screen Capture (FFmpeg 8+)</h5>
<pre class="bc-ws-cli-code">ffmpeg -f x11grab -s 1920x1080 -r 30 -i :0.0 \\
<pre class="bc-ws-cli-code">ffmpeg -f x11grab -s 1920x1080 -r 30 -i :0.0 \\
-f pulse -i default \\
-f pulse -i default \\
- -c:v libx264 -preset veryfast -tune zerolatency -b:v 3000k \\
+ -c:v libx264 -profile:v baseline -pix_fmt yuv420p -bf 0 -g 60 -preset veryfast -tune zerolatency -b:v 3000k \\
-c:a libopus -b:a 128k -ar 48000 \\
-c:a libopus -b:a 128k -ar 48000 \\
-f whip "${esc(whipUrl)}"</pre>
-f whip "${esc(whipUrl)}"</pre>
- <h5><i class="fa-solid fa-film"></i> MP4 / File Loop (FFmpeg 7+)</h5>
+ <h5><i class="fa-solid fa-film"></i> MP4 / File Loop (FFmpeg 8+)</h5>
<pre class="bc-ws-cli-code">ffmpeg -re -stream_loop -1 -i video.mp4 \\
<pre class="bc-ws-cli-code">ffmpeg -re -stream_loop -1 -i video.mp4 \\
- -c:v libx264 -preset veryfast -tune zerolatency -b:v 2500k \\
+ -c:v libx264 -profile:v baseline -pix_fmt yuv420p -bf 0 -g 60 -preset veryfast -tune zerolatency -b:v 2500k \\
-c:a libopus -b:a 128k -ar 48000 \\
-c:a libopus -b:a 128k -ar 48000 \\
-f whip "${esc(whipUrl)}"</pre>
-f whip "${esc(whipUrl)}"</pre>