diff --git a/README.md b/README.md index ea31cb0f..24cbb97a 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,73 @@ -# Live777 +

+ Live777 +
Live777
+

[![Rust](https://github.com/binbat/live777/actions/workflows/rust.yml/badge.svg)](https://github.com/binbat/live777/actions/workflows/rust.yml) [![GitHub release](https://img.shields.io/github/tag/binbat/live777.svg?label=release)](https://github.com/binbat/live777/releases) -A very simple, high performance, support WHIP/WHEP edge WebRTC SFU (Selective Forwarding Unit) +Live777 is an SFU server for real-time video streaming for the `WHIP`/`WHEP` as first protocol. + +Live777 media server is used with [Gstreamer](https://gstreamer.freedesktop.org/), [FFmpeg](https://ffmpeg.org/), [OBS Studio](https://obsproject.com/), [VLC](https://www.videolan.org/), [WebRTC](https://webrtc.org/) and other clients to provide the ability to receive and distribute streams, and is a typical publishing (pushing) and subscription (playing) server model. + +Live777 supports the conversion of audio and video protocols widely used in the Internet, such as RTP to WHIP or WHEP and other protocols. ![live777-arch](./docs/live777-arch.excalidraw.svg#gh-light-mode-only) ![live777-arch](./docs/live777-arch.dark.svg#gh-dark-mode-only) -## Current +## Features -| protocol | video codecs | audio codecs | -| -------- | ------------ | ------------ | -| `WHIP` | `AV1`, `VP8`, `VP9`, `H264` | `Opus`, `G722` | -| `WHEP` | `AV1`, `VP8`, `VP9`, `H264` | `Opus`, `G722` | +Live777 has the following characteristics: -## Supports `WHIP`/`WHEP` applications +- 📚 **Support `WHIP`/`WHEP`** -![live777-apps](./docs/live777-apps.excalidraw.svg#gh-light-mode-only) -![live777-apps](./docs/live777-apps.dark.svg#gh-dark-mode-only) + The WHIP/WHEP protocol is implemented to improve interoperability with other WebRTC application modules without the need for custom adaptations. -### Live777 Server +- 🗃️ **SFU architecture** -```bash -docker run --name live777-server --rm --network host \ -ghcr.io/binbat/live777-server:latest live777 -``` + Only responsible for forwarding, do not do confluence, transcoding and other resource overhead of the media processing work, the encoding and decoding work are respectively placed on the sender and the receiver. -### Browser Demo Page +- 🌐 **Multiple platform support** -```bash -# open your browser -open http://localhost:3000/ -``` + With rich multi-platform native support. -## Use OBS Studio WHIP +- 🔍 **Multiple audio and video encoding formats support** -- OBS Studio >= 30 + Support a variety of video encoding and audio encoding formats, providing a wider range of compatibility to help enable adaptive streaming. -**OBS WHIP Current only support `H264` video codecs and `Opus` audio codecs** +## Current support encode +| protocol | video codecs | audio codecs | +| -------- | --------------------------- | -------------- | +| `WHIP` | `AV1`, `VP8`, `VP9`, `H264` | `Opus`, `G722` | +| `WHEP` | `AV1`, `VP8`, `VP9`, `H264` | `Opus`, `G722` | -![obs whip](./obs-whip.avif) +## Quickstart + +### Run Live777 using docker: + +```sh +docker run --name live777-server --rm --network host ghcr.io/binbat/live777-server:latest live777 +``` -## Use GStreamer `WHIP`/`WHEP` +### Gstreamer WHIP/WHEP client -This plugins from [gst-plugins-rs](https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/) +- Use docker of [Gstreamer](https://gstreamer.freedesktop.org/download/) to publish: -### Video: AV1 +This `WHIP`/ `WHEP` plugins from [gst-plugins-rs](https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/) -**NOTE: AV1 has a lot of problem** +> *Note: supports multiple encoding formats* -- [ ] browser whip av1 -- [ ] browser whep av1 -- [x] gstreamer whip av1 -- [ ] gstreamer whep av1 -- [ ] gstreamer rtp av1 src -- [x] gstreamer rtp av1 sink -- [ ] ffmpeg rtp av1 src -- [ ] ffmpeg rtp av1 sink +#### Video: AV1 + +**Note: AV1 has a lot of problem** +- 🚧 browser whip av1 +- 🚧 browser whep av1 +- ✅ gstreamer whip av1 +- 🚧 gstreamer whep av1 +- ✅ gstreamer rtp av1 src +- ✅ gstreamer rtp av1 sink +- 🚧 ffmpeg rtp av1 src +- 🚧 ffmpeg rtp av1 sink `WHIP`: @@ -83,46 +93,46 @@ ghcr.io/binbat/live777-client:latest \ gst-launch-1.0 udpsrc port=5004 caps="application/x-rtp, media=(string)video, encoding-name=(string)AV1" ! rtpjitterbuffer ! rtpav1depay ! av1parse ! av1dec ! videoconvert ! aasink ``` -### Video: VP8 +#### Video: VP8 `WHIP`: - + ```bash docker run --name live777-client-whip --rm --network host \ ghcr.io/binbat/live777-client:latest \ -gst-launch-1.0 videotestsrc ! videoconvert ! vp8enc ! rtpvp8pay ! whipsink whip-endpoint="http://localhost:3000/whip/777" +gst-launch-1.0 videotestsrc ! videoconvert ! vp8enc ! rtpvp8pay ! whipsink whip-endpoint="http://localhost:3000/whip/777" ``` - + `WHEP`: - + ```bash docker run --name live777-client-whep --rm --network host \ ghcr.io/binbat/live777-client:latest \ gst-launch-1.0 whepsrc whep-endpoint="http://localhost:3000/whep/777" audio-caps="application/x-rtp,payload=111,encoding-name=OPUS,media=audio,clock-rate=48000" video-caps="application/x-rtp,payload=96,encoding-name=VP8,media=video,clock-rate=90000" ! rtpvp8depay ! vp8dec ! videoconvert ! aasink ``` -### Video: VP9 +#### Video: VP9 `WHIP`: - + ``` bash docker run --name live777-client --rm --network host \ ghcr.io/binbat/live777-client:latest \ gst-launch-1.0 videotestsrc ! videoconvert ! vp9enc ! rtpvp9pay ! whipsink whip-endpoint="http://localhost:3000/whip/777" ``` -`WHEP`: - + `WHEP`: + ```bash docker run --name live777-client-whep --rm --network host \ ghcr.io/binbat/live777-client:latest \ gst-launch-1.0 whepsrc whep-endpoint="http://localhost:3000/whep/777" audio-caps="application/x-rtp,payload=111,encoding-name=OPUS,media=audio,clock-rate=48000" video-caps="application/x-rtp,payload=98,encoding-name=VP9,media=video,clock-rate=90000" ! rtpvp9depay ! vp9dec ! videoconvert ! aasink ``` -### Video: H264 +#### Video: H264 `WHIP`: - + ```bash docker run --name live777-client --rm --network host \ ghcr.io/binbat/live777-client:latest \ @@ -142,10 +152,10 @@ Use `libav` ```bash docker run --name live777-client-whep --rm --network host \ ghcr.io/binbat/live777-client:latest \ -gst-launch-1.0 whepsrc whep-endpoint="http://localhost:3000/whep/777" audio-caps="application/x-rtp,payload=111,encoding-name=OPUS,media=audio,clock-rate=48000" video-caps="application/x-rtp,payload=102,encoding-name=H264,media=video,clock-rate=90000" ! rtph264depay ! avdec_h264 ! videoconvert ! aasink +gst-launch-1.0 whepsrc whep-endpoint="http://localhost:3000/whep/777" audio-caps="application/x-rtp,payload=111,encoding-name=OPUS,media=audio,clock-rate=48000" video-caps="application/x-rtp,payload=102,encoding-name=H264 media=video,clock-rate=90000" ! rtph264depay ! avdec_h264 ! videoconvert ! aasink ``` -### Audio: Opus +#### Audio: Opus `WHIP`: @@ -167,7 +177,7 @@ Maybe you can't play audio, we can audio to video display for ascii gst-launch-1.0 whepsrc whep-endpoint="http://localhost:3000/whep/777" audio-caps="application/x-rtp,payload=111,encoding-name=OPUS,media=audio,clock-rate=48000" video-caps="application/x-rtp,payload=102,encoding-name=H264,media=video,clock-rate=90000" ! rtpopusdepay ! opusdec ! audioconvert ! wavescope ! videoconvert ! aasink ``` -### Audio: G722 +#### Audio: G722 **GStreamer G722 need `avenc_g722` in `gstreamer-libav`** @@ -177,10 +187,26 @@ ghcr.io/binbat/live777-client:latest \ gst-launch-1.0 audiotestsrc ! audioconvert ! avenc_g722 ! rtpg722pay ! whipsink whip-endpoint="http://localhost:3000/whip/777 ``` +### OBS Studio WHIP client + +> Note: +> 1. OBS Studio version [**30 or higher**](https://obsproject.com/forum/threads/obs-studio-30-beta.168984/) +> 2. OBS WHIP Current only support **H264** video codecs and **Opus** audio codecs + +![obs whip](./obs-whip.avif) + +#### Play stream + +- open your browser, enter the URL: [`http://localhost:3000/`](http://localhost:3000/) + ## Tools We have tools for support rtp -> whip/whep convert +![live777-apps](./docs/live777-apps.excalidraw.svg#gh-light-mode-only) +![live777-apps](./docs/live777-apps.dark.svg#gh-dark-mode-only) + + For Example: ```bash @@ -191,7 +217,7 @@ ffmpeg -> whipinto -> live777 -> whepfrom -> ffplay This tool is `rtp2whip` -Build: +Build ```bash cargo build --package=whipinto --release @@ -214,7 +240,9 @@ cargo run --package=whipinto -- -c vp8 -u http://localhost:3000/whip/777 --comma "ffmpeg -re -f lavfi -i testsrc=size=640x480:rate=30 -vcodec libvpx -cpu-used 5 -deadline 1 -g 10 -error-resilient 1 -auto-alt-ref 1 -f rtp 'rtp://127.0.0.1:{port}?pkt_size=1200'" ``` -VLC RTP stream, **NOTE: VLC can't support all video codec** +VLC RTP stream + +**Note: VLC can't support all video codec** ```bash vlc -vvv --sout '#transcode{vcodec=h264}:rtp{dst=127.0.0.1,port=5003}' @@ -224,7 +252,7 @@ vlc -vvv --sout '#transcode{vcodec=h264}:rtp{dst=127.0.0.1,port=500 This tool is `whep2rtp` -Build: +Build ```bash cargo build --package=whepfrom --release @@ -253,7 +281,7 @@ Use ffplay ffplay -protocol_whitelist rtp,file,udp -i stream.sdp ``` -So. You can use this: +So. You can use this ```bash cargo run --package=whepfrom -- -c vp8 -u http://localhost:3000/whep/777 -t 127.0.0.1:5004 --command 'ffplay -protocol_whitelist rtp,file,udp -i stream.sdp' @@ -264,7 +292,6 @@ Use VLC player ```bash vlc stream.sdp ``` - ## Sponsors

diff --git a/docs/logo.svg b/docs/logo.svg new file mode 100644 index 00000000..0a35fb33 --- /dev/null +++ b/docs/logo.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +