openvibers/openvibe.live Commits

WHIP CLI instructions that work: FFmpeg 8+, baseline H.264 without B-frames (#307)

OP OpenVibers committed 22 days ago · 8d1427ac36 · 2 files, +9 −9

* WHIP CLI instructions that work: FFmpeg 8.0+ (it added the WHIP muxer, not 7), H.264 baseline without B-frames in the page's commands, no VP9 claim; docs/whip links the go-live example

* Retrigger CI (the gitleaks check stayed pending after its run completed)

Changes

ddiff --git a/docs/whip.md b/docs/whip.md
iindex 6e2b020b..57e63a85 100644
---- a/docs/whip.md
++++ b/docs/whip.md
@@@ -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.
ddiff --git a/public/js/broadcast-workspace.js b/public/js/broadcast-workspace.js
iindex 59ca4806..3b2432bf 100644
---- a/public/js/broadcast-workspace.js
++++ b/public/js/broadcast-workspace.js
@@@ -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> &mdash; 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> &mdash; 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>