Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion infra/pub.yml.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -97,5 +97,5 @@ write_files:
runcmd:
- systemctl daemon-reload
- systemctl restart docker
- systemctl start moq-bbb moq-clock
- systemctl start hang-bbb moq-clock
- systemctl start watchtower
3 changes: 2 additions & 1 deletion src/components/watch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export default function (props: { name: string }) {
const url = new URL(
`${import.meta.env.PUBLIC_RELAY_SCHEME}://${import.meta.env.PUBLIC_RELAY_HOST}/demo/${props.name}.hang`,
);
const canvas = <canvas style={{ "max-width": "100%", height: "100%", margin: "0 auto", "border-radius": "1rem" }} />;
const canvas = <canvas style={{ "max-width": "100%", height: "auto", margin: "0 auto", "border-radius": "1rem" }} />;

const watch = new Watch({
connection: {
Expand All @@ -32,6 +32,7 @@ export default function (props: { name: string }) {
<Support role="watch" show="partial" />

{canvas}

<WatchControls lib={watch} root={root} />
</div>
);
Expand Down
10 changes: 5 additions & 5 deletions src/pages/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@ a super-charged TCP/UDP replacement that powers [HTTP/3](https://en.wikipedia.or
It's being developed by the [IETF](https://www.ietf.org/) and your _favorite_ big tech companies such as Google, Meta, Cisco, Akamai, etc.

That's right, soon you will never have to deal with WebRTC again.
You can delete SDP from your memory; it can't hurt you now.

<p class="tagline">Try out the demo! [Watch](/watch/bbb) or [Publish](/publish) a broadcast</p>

**NOTE**: This website uses a [fork](/blog/transfork) of the IETF drafts called [moq-lite](https://github.com/kixelated/moq/tree/main/rs/moq) and [hang](https://github.com/kixelated/moq/tree/main/rs/hang).
The principles and rationale behind MoQ are great, but progress is painfully slow as it's an experimental protocol designed by committee.
My goal is to build something now that you can use, even if it's not a *standard*.
The principles behind MoQ are fantastic, but progress has been slow; it's an experimental protocol being developed by committee.
My goal is to build something now that you can use, even if it's not a *standard* yet.


### Features
Expand All @@ -34,9 +33,10 @@ Check out the [blog](/blog) for more information.
They give a good chuckle if I do say so myself.

Once you're ready to dive in, check out the [Github](https://github.com/kixelated/moq) and/or join [Discord](https://discord.gg/FCYF3p99mr).
Contributions are welcome of course, but feel free to just yoink the code make it your own.

And if you're using some flavor of MoQ in the wild, I'd love to hear about it!
Contributions are welcome, of course.
But also feel free to just yoink the code, fork it, and make it your own.
If you're using some flavor of MoQ in the wild, I'd love to hear about it!
My DMs are always open as `@kixelated` on Discord.

![@kixelated](/blog/avatar.png)
8 changes: 4 additions & 4 deletions src/pages/issues.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ title: Issues

# Issues

Yeah so there's a lot of work to do.
Yeah, so there's a lot of work to do.

Because we've broken out of the WebRTC jail, we need to implement a lot of things that are taken for granted.
If you want full control over the media stack so you can do cool shit, then welcome, you're in the right place.
If you want full control over the media stack so you can build cool shit, then welcome, you're in the right place.
But if you just want a Google Meet clone and want to do minimal work, then check out [Pion](https://github.com/pion/webrtc).

This page is a summary of the major issues, updated periodically.
Expand Down Expand Up @@ -43,7 +43,7 @@ Now on to the issues.
| name | description |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Adaptive Bitrate | Currently, the bitrate for a broadcast is fixed at creation time. We need to implement back-pressure so the broadcaster lowers its bitrate during congestion. In addition, we could use simulcast to create multiple tracks allowing the viewer to choose what to receive. |
| Echo Cancelation | People who use speakers are the worst. But for real we need some form of echo cancelation otherwise conferencing is difficult. It seems like you can specify it [when capturing media](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/echoCancellation) but I've yet to test how well it works. |
| Echo Cancellation | People who use speakers are the worst. But seriously, we need some form of echo cancelation otherwise conferencing is difficult. It seems like you can specify it [when capturing media](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/echoCancellation) but I've yet to test how well it works. |
| OBS Plugin | We should develop an [OBS](https://obsproject.com/) plugin to make it easier to publish broadcasts. The gstreamer plugin should also be improved but it mostly works. |
| Viewer Feedback | Currently, viewers don't provide any feedback to the broadcaster(s). This would be very useful for small broadcasts for stuff like negotiating codecs, bitrates, etc. |

Expand All @@ -56,6 +56,6 @@ Now on to the issues.
| Chat | I want to implement a chat protocol over MoQ! |

And of course, there's a million other things.
Hit me up on [Discord](https://discord.gg/FCYF3p99mr) if want to volunteer your time or monies to help make these a reality.
Hit me up on [Discord](https://discord.gg/FCYF3p99mr) if you want to volunteer your time or monies to help make these a reality.

![@kixelated](/blog/avatar.png)
18 changes: 9 additions & 9 deletions src/pages/source.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@ title: Source

Everything is open source and broken into two repositories:

- [kixelated/moq](https://github.com/kixelated/moq-rs): The underlying MoQ library in both Rust and Typescript.
- [kixelated/moq](https://github.com/kixelated/moq): The core MoQ library, with implementations in Rust and Typescript.
- [kixelated/quic.video](https://github.com/kixelated/quic.video): This website. Includes terraform to run multiple relays on GCP.

## Rust
Native code is written in [Rust](https://github.com/kixelated/moq/tree/main/rs) and is split into a few notable crates:

| crate | description |
| ----------------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| [moq-lite](https://docs.rs/moq-lite/latest/moq_lite/) | A generic pub/sub transport. This is a minimal reintepretation of the IETF [MoqTransport draft](https://datatracker.ietf.org/doc/draft-ietf-moq-transport/). |
| [moq-relay](https://github.com/kixelated/moq/tree/main/rs/moq-relay) | A Moq server that connects publishers to subscribers, caching and deduplicating any subscriptions. Note that MoQ does not support P2P; instead it utilizies relays to scale out to many subscribers. |
| [moq-clock](https://github.com/kixelated/moq/tree/main/rs/moq-clock) | It's a clock! Just to demonstate that MoQ can be used for more than media. |
| [moq-lite](https://docs.rs/moq-lite/latest/moq_lite/) | A generic pub/sub transport. This is a minimal reinterpretation of the IETF [MoqTransport draft](https://datatracker.ietf.org/doc/draft-ietf-moq-transport/). |
| [moq-relay](https://github.com/kixelated/moq/tree/main/rs/moq-relay) | A Moq server that connects publishers to subscribers, caching and deduplicating any subscriptions. Note that MoQ does not support P2P; instead it utilizes relays to scale out to many subscribers. |
| [moq-clock](https://github.com/kixelated/moq/tree/main/rs/moq-clock) | It's a clock! Just to demonstrate that MoQ can be used for more than media. |
| [hang](https://docs.rs/hang/latest/hang/) | A media specific library built on top of moq-lite. This provides a JSON "catalog" that describes the media tracks and "container" that literally consists of a timestamp. The actual media decoding/encoding is left to the platform. |
| [hang-cli](https://github.com/kixelated/moq/tree/main/hang-cli) | A client that integrates with ffmpeg to publish media. This uses fMP4 via stdin so it's not the most efficient... |
| [hang-gst](https://github.com/kixelated/moq/tree/main/hang-gst) | A gstreamer plugin for publishing and consuming media. It works but needs a lot of polish. |
| [hang-wasm](https://github.com/kixelated/moq/tree/main/hang-wasm) | An MoQ client utilizing WebAssembly, WebCodecs, and WebTransport for web support. Deprecated in favor of the Typescript implementation; see below for justification. |
| [hang-cli](https://github.com/kixelated/moq/tree/main/hang-cli) | A client that integrates with ffmpeg to publish media. This pipes fMP4 over stdin, so it's not the most efficient... |
| [hang-gst](https://github.com/kixelated/moq/tree/main/hang-gst) | A gstreamer plugin for publishing and consuming media. It works, but needs a lot of polish. |
| [hang-wasm](https://github.com/kixelated/moq/tree/main/hang-wasm) | An MoQ web client utilizing WebAssembly, WebCodecs, and WebTransport. Deprecated in favor of the Typescript implementation; see below for justification. |


There are some additional crates in other repositories that might be of interest:
Expand All @@ -42,10 +42,10 @@ Web code is written in [Typescript](https://github.com/kixelated/moq/tree/main/j
| [@kixelated/moq](https://www.npmjs.com/package/@kixelated/moq) | A moq-lite client that mirrors the Rust API. You can publish and subscribe to generic tracks. Any media stuff is implemented at a higher layer. |
| [@kixelated/hang](https://www.npmjs.com/package/@kixelated/hang) | A media library. This is where the bulk of the cool stuff happens, like capturing/encoding or decoding/rendering media. Includes Web Components to make setup super simple. [See the demos](https://github.com/kixelated/moq/tree/main/js/hang/demo). |

**Note**: These utilize browser-specific APIs and there's no (explicit) support for Node and other server runtimes.
**Note**: These utilize browser-specific APIs and there's no currently no support for Node and other server runtimes.
[Deno](https://deno.com/) is doing some cool stuff with WebTransport so maybe it'll work there someday.

And before you ask, yes, it is possible to use WASM for web support as evidenced by the [hang-wasm](https://github.com/kixelated/moq/tree/main/hang-wasm) crate.
And before you ask, yes, it is possible to use WASM for web support as demonstrated by the [hang-wasm](https://github.com/kixelated/moq/tree/main/hang-wasm) crate.
However, it involves a lot of boilerplate, wrappers, and casting.
The performance is not great because the WASM sandbox doesn't have networking or device access, requiring copying and/or message passing to use Web APIs.

Expand Down