From 5c586a2aa39cec99035084019593e4ad382aed61 Mon Sep 17 00:00:00 2001 From: Cesar Mendivil Date: Sun, 15 Mar 2026 17:04:54 -0700 Subject: [PATCH] feat: add WHIP-RTSP support for multi-platform streaming - Introduced WHIP-RTSP as a new source option in Source.js. - Enhanced Restreamer to handle RTSP relay configuration and address parsing. - Updated WebRTCRoom to allow selection between direct and RTSP relay modes. - Implemented WHIPPublications component for managing multiple WHIP destinations. - Added internal RTSP relay configuration in Settings.js. - Improved handling of WHEP and WHIP streams, including error logging and state management. --- .env.local | 3 +- WHIP_UI_INTEGRATION_PROMPT.md | 413 +++++++++++++- src/misc/controls/Source.js | 7 + src/utils/restreamer.js | 58 +- src/views/Edit/Sources/WebRTCRoom.js | 28 +- src/views/Edit/Wizard/Sources/InternalWHIP.js | 34 +- src/views/Main/Publication.js | 6 +- src/views/Main/WHIPPublications.js | 522 ++++++++++++++++++ src/views/Publication/Add.js | 6 + src/views/Settings.js | 38 +- 10 files changed, 1085 insertions(+), 30 deletions(-) create mode 100644 src/views/Main/WHIPPublications.js diff --git a/.env.local b/.env.local index 73b69a0..df88547 100644 --- a/.env.local +++ b/.env.local @@ -1,8 +1,9 @@ REACT_APP_CORE_URL=http://192.168.1.15:8080 REACT_APP_WHIP_BASE_URL=http://192.168.1.15:8555 -REACT_APP_YTDLP_URL=http://100.73.244.28:8080 +REACT_APP_YTDLP_URL=http://192.168.1.20:8282 REACT_APP_FB_SERVER_URL=http://localhost:3002 REACT_APP_LIVEKIT_API_KEY=APIBTqTGxf9htMK REACT_APP_LIVEKIT_API_SECRET=0dOHWPffwneaPg7OYpe4PeAes21zLJfeYJB9cKzSTtXW REACT_APP_LIVEKIT_WS_URL=wss://livekit-server.nextream.sytes.net REACT_APP_WHIP_SERVER_URL=https://djmaster.nextream.sytes.net +C \ No newline at end of file diff --git a/WHIP_UI_INTEGRATION_PROMPT.md b/WHIP_UI_INTEGRATION_PROMPT.md index a071b81..8976d53 100644 --- a/WHIP_UI_INTEGRATION_PROMPT.md +++ b/WHIP_UI_INTEGRATION_PROMPT.md @@ -600,6 +600,17 @@ Agregar un botón **"Ver en vivo"** / **"Preview"** en la tarjeta de cada stream async function startWHEPPreview(streamKey, whepBaseUrl) { const pc = new RTCPeerConnection({ iceServers: [] }) + // Set up the MediaStream BEFORE creating the offer so that ontrack fires + // correctly regardless of how fast ICE negotiation completes. + // Using a MediaStream instead of e.streams[0] avoids the common bug where + // e.streams is empty (no a=msid in SDP) and srcObject never gets set. + const mediaStream = new MediaStream() + videoElement.srcObject = mediaStream + + pc.ontrack = (e) => { + mediaStream.addTrack(e.track) + } + pc.addTransceiver('video', { direction: 'recvonly' }) pc.addTransceiver('audio', { direction: 'recvonly' }) @@ -627,11 +638,8 @@ async function startWHEPPreview(streamKey, whepBaseUrl) { await pc.setRemoteDescription({ type: 'answer', sdp: answerSDP }) // Mostrar video en el elemento