Update README.md
This commit is contained in:
parent
c0a174e26a
commit
ac36a40426
39
README.md
39
README.md
|
@ -1,27 +1,27 @@
|
||||||
# warp
|
# Warp
|
||||||
Live media delivery protocol utilizing QUIC streams.
|
Segmented live media delivery protocol utilizing QUIC streams. See the [Warp draft](https://datatracker.ietf.org/doc/draft-lcurley-warp/).
|
||||||
|
|
||||||
## How
|
|
||||||
Warp works by delivering each audio and video segment as a separate QUIC stream. These streams are assigned a priority such that old video will arrive last and can be dropped. This avoids buffering in many cases, offering the viewer a potentially better experience.
|
Warp works by delivering each audio and video segment as a separate QUIC stream. These streams are assigned a priority such that old video will arrive last and can be dropped. This avoids buffering in many cases, offering the viewer a potentially better experience.
|
||||||
|
|
||||||
|
This demo includes a button that sends a custom message to throttle the network. This is not a realistic network simulation; you should evaluate Warp on real networks.
|
||||||
|
|
||||||
## Browser Support
|
## Browser Support
|
||||||
This demo currently only works on Chrome for two reasons:
|
This demo currently only works on Chrome for two reasons:
|
||||||
|
|
||||||
1. WebTransport support.
|
1. WebTransport support.
|
||||||
2. [https://github.com/whatwg/html/issues/6359](Media underflow behavior).
|
2. [Media underflow behavior](https://github.com/whatwg/html/issues/6359).
|
||||||
|
|
||||||
### Specification
|
The ability to skip video abuses the fact that Chrome can play audio without video for up to 3 seconds (hardcoded!) when using MSE. It is possible to use something like WebCodecs instead... but that's still Chrome only at the moment.
|
||||||
See the [https://datatracker.ietf.org/doc/draft-lcurley-warp/](Warp draft). This demo includes a few custom messages.
|
|
||||||
|
|
||||||
## Setup
|
# Setup
|
||||||
### Software
|
## Requirements
|
||||||
* Go
|
* Go
|
||||||
* ffmpeg
|
* ffmpeg
|
||||||
* openssl
|
* openssl
|
||||||
* Chrome Canary
|
* Chrome Canary
|
||||||
|
|
||||||
### Media
|
## Media
|
||||||
This demo simulates a live stream by reading a file from disk and sleeping based on media timestamps. Obviously you should hook this up to a real live stream to do anything useful
|
This demo simulates a live stream by reading a file from disk and sleeping based on media timestamps. Obviously you should hook this up to a real live stream to do anything useful.
|
||||||
|
|
||||||
Download your favorite media file:
|
Download your favorite media file:
|
||||||
```
|
```
|
||||||
|
@ -35,15 +35,12 @@ ffmpeg -i media/combined.mp4 -f dash -use_timeline 0 -r:v 24 -g:v 48 -keyint_min
|
||||||
|
|
||||||
You can increase the `frag_duration` (microseconds) to slightly reduce the file size in exchange for higher latency.
|
You can increase the `frag_duration` (microseconds) to slightly reduce the file size in exchange for higher latency.
|
||||||
|
|
||||||
### TLS
|
## TLS
|
||||||
Unfortunately, QUIC mandates TLS and makes local development difficult.
|
Unfortunately, QUIC mandates TLS and makes local development difficult.
|
||||||
|
|
||||||
#### Existing
|
If you have a valid certificate you can use it instead of self-signing. The go binaries take a `-cert` and `-key` argument. Skip the remaining steps in this section and use your hostname instead of `localhost.warp.demo`.
|
||||||
If you have a valid certificate you can use it instead of self-signing. The go binaries take a `-cert` and `-key` argument.
|
|
||||||
|
|
||||||
Skip the remaining steps in this section and use your hostname instead of `localhost.warp.demo`.
|
### Self-Sign
|
||||||
|
|
||||||
#### Self-Signed
|
|
||||||
Generate a self-signed certificate for local testing:
|
Generate a self-signed certificate for local testing:
|
||||||
```
|
```
|
||||||
./cert/generate
|
./cert/generate
|
||||||
|
@ -51,14 +48,14 @@ Generate a self-signed certificate for local testing:
|
||||||
|
|
||||||
This creates `cert/localhost.warp.demo.crt` and `cert/localhost.warp.demo.key`.
|
This creates `cert/localhost.warp.demo.crt` and `cert/localhost.warp.demo.key`.
|
||||||
|
|
||||||
#### CORS
|
### Origin
|
||||||
To have the browser accept our self-signed certificate, you'll need to add an entry to `/etc/hosts`.
|
To have the browser accept our self-signed certificate, you'll need to add an entry to `/etc/hosts`.
|
||||||
|
|
||||||
```
|
```
|
||||||
echo '127.0.0.1 localhost.warp.demo' | sudo tee -a /etc/hosts
|
echo '127.0.0.1 localhost.warp.demo' | sudo tee -a /etc/hosts
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Chrome
|
### Chrome
|
||||||
Now we need to make Chrome accept these certificates, which normally would involve trusting a root CA but this was not working with WebTransport when I last tried.
|
Now we need to make Chrome accept these certificates, which normally would involve trusting a root CA but this was not working with WebTransport when I last tried.
|
||||||
|
|
||||||
Instead, we need to run a *fresh instance* of Chrome, instructing it to allow our self-signed certificate. This command will not work if Chrome is already running, so it's easier to use Chrome Canary instead. This command also needs to be executed in the project root because it invokes `./cert/fingerprint`.
|
Instead, we need to run a *fresh instance* of Chrome, instructing it to allow our self-signed certificate. This command will not work if Chrome is already running, so it's easier to use Chrome Canary instead. This command also needs to be executed in the project root because it invokes `./cert/fingerprint`.
|
||||||
|
@ -70,7 +67,7 @@ Launch a new instance of Chrome Canary:
|
||||||
|
|
||||||
Note that this will open our web server on `localhost.warp.demo:4444`, which is started in the next section.
|
Note that this will open our web server on `localhost.warp.demo:4444`, which is started in the next section.
|
||||||
|
|
||||||
### Warp Server
|
## Server
|
||||||
The Warp server defaults to listening on UDP 4443. It supports HTTP/3 and WebTransport, pushing media over WebTransport streams once a connection has been established. A more refined implementation would load content based on the WebTransport URL or some other messaging scheme.
|
The Warp server defaults to listening on UDP 4443. It supports HTTP/3 and WebTransport, pushing media over WebTransport streams once a connection has been established. A more refined implementation would load content based on the WebTransport URL or some other messaging scheme.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -78,8 +75,8 @@ cd server
|
||||||
go run ./warp-server
|
go run ./warp-server
|
||||||
```
|
```
|
||||||
|
|
||||||
### Web Server
|
## Web
|
||||||
The web assets need to be hosted with a HTTPS server. If you're using a self-signed certificate, you will need to ignore the security warning in Chrome (Advanced -> proceed to localhost.warp.demo).
|
The web assets need to be hosted with a HTTPS server. If you're using a self-signed certificate, you will need to ignore the security warning in Chrome (Advanced -> proceed to localhost.warp.demo). This can be avoided by adding your certificate to the root CA but I'm too lazy to do that.
|
||||||
|
|
||||||
```
|
```
|
||||||
cd client
|
cd client
|
||||||
|
|
Loading…
Reference in New Issue