|
| 1 | +--- |
| 2 | +layout: "@/layouts/global.astro" |
| 3 | +title: "libmoq + OBS = MoQBS" |
| 4 | +author: kixelated |
| 5 | +description: First class support for MoQ in OBS... via a fork. Go forth and integrate libmoq into all of your favorite tools still using C for some reason. |
| 6 | +cover: "/blog/moqbs/moqbs.png" |
| 7 | +date: 2026-02-20 |
| 8 | +--- |
| 9 | + |
| 10 | +# libmoq + OBS = MoQBS |
| 11 | +Oh hey, long time no chat. |
| 12 | + |
| 13 | +As part of the [Montevideo Tech Summer Camp](/blog/monte-video), we worked on an OBS plugin. |
| 14 | +I'm here to announce the culmination of that effort... a *temporary* fork of OBS. |
| 15 | + |
| 16 | +<figure> |
| 17 | +  |
| 18 | + <figcaption>I drew the logo myself. At least you know it's not AI generated.</figcaption> |
| 19 | +</figure> |
| 20 | + |
| 21 | +## How Do Download? |
| 22 | +If you want to build it yourself: |
| 23 | +```bash |
| 24 | +git clone https://github.com/moq-dev/moqbs |
| 25 | +cd moqbs |
| 26 | +cmake --preset=macos |
| 27 | +cmake --build --preset=macos |
| 28 | +# Idk I think that's all you need. |
| 29 | +``` |
| 30 | + |
| 31 | +If you're lazy and want to use pre-built binaries: |
| 32 | +- [Mac (ARM)](https://obs.moq.dev/macos/arm64/32.1.0-rc1-35-g98607152d-9860715/moqbs-macos-arm64.dmg) |
| 33 | +- [Mac (Intel)](https://obs.moq.dev/macos/x86_64/32.1.0-rc1-35-g98607152d-9860715/moqbs-macos-x86_64.dmg) |
| 34 | +- [Linux (x86_64)](https://obs.moq.dev/linux/x86_64/32.1.0-rc1-35-g98607152d-9860715/moqbs-linux-x86_64.deb) |
| 35 | +- [Windows (x64)](https://obs.moq.dev/windows/x64/32.0.4-9860715/moqbs-windows-x64.zip) |
| 36 | + |
| 37 | +Claude built these so no promises. |
| 38 | +I'm not going to set up a proper CI/CD pipeline because we want to delete this fork as soon as possible. |
| 39 | + |
| 40 | +## Why Do Fork? |
| 41 | +The [MoQ OBS plugin](https://github.com/moq-dev/obs) does work with stable OBS... but it's not exposed via the UI. |
| 42 | + |
| 43 | +Seriously, we had to fork OBS just to add a "MoQ" dropdown to the UI. |
| 44 | +Go +1 [this PR](https://github.com/obsproject/obs-studio/pull/12911) so the UI becomes dynamic. |
| 45 | +Then we can delete the abomination that is `MoQBS`. |
| 46 | + |
| 47 | +## How Do Use? |
| 48 | +You can publish to any `moq-relay` server: |
| 49 | +- `https://cdn.moq.dev/anon` |
| 50 | +- `https://draft-14.cloudflare.mediaoverquic.com` |
| 51 | +- `https://localhost:4443/anon` (when using `just dev`) |
| 52 | + |
| 53 | +<figure> |
| 54 | +  |
| 55 | + <figcaption>Open up the OBS settings. Change `test` to a unique broadcast name and remember that this endpoint is **PUBLIC**.</figcaption> |
| 56 | +</figure> |
| 57 | + |
| 58 | +And you can watch from any `moq-relay` server too. |
| 59 | +I literally tested this for the first time ever just to take a screenshot. |
| 60 | +Huge shoutout to [pangaea](https://github.com/davegullo) and [Claude](https://claude.ai/code) for coding this beast. |
| 61 | + |
| 62 | +<figure> |
| 63 | +  |
| 64 | + <figcaption>Wow it actually works. Note that you won't need the `?jwt` token for the `/anon` endpoint. I'm just lazy and used the `bbb` demo.</figcaption> |
| 65 | +</figure> |
| 66 | + |
| 67 | +## What Do Support? |
| 68 | +- Codecs: H.264, H.265, OPUS, AAC, AV1 |
| 69 | +- Transport: [QUIC](https://doc.moq.dev/concept/layer/quic.html), [WebTransport](https://doc.moq.dev/concept/layer/web-transport.html), [WebSocket](https://doc.moq.dev/concept/layer/web-socket.html) |
| 70 | +- Versions: [moq-lite](https://doc.moq.dev/concept/layer/moq-lite.html), [moq-transport](https://doc.moq.dev/concept/standard/moq-transport.html) (14+) |
| 71 | +- Format: [hang](https://doc.moq.dev/concept/layer/hang.html), CMAF (soon™) |
| 72 | + |
| 73 | +## How Do Work? |
| 74 | +If you ever see me writing a C++ implementation of MoQ, shoot. |
| 75 | +It's not the real `@kixelated`. |
| 76 | + |
| 77 | +That's why we created [libmoq](https://docs.rs/libmoq/latest/moq/) instead. |
| 78 | +It's a C binding on top of the Rust library providing both publish and subscribe functionality. |
| 79 | +It basically converts `async` Rust code into a bunch of C callbacks. |
| 80 | + |
| 81 | +You can [download the latest](https://github.com/moq-dev/moq/releases) version if you want to give it a try yourself. |
| 82 | +The gross async networking stuff is handled by Rust+Tokio in a separate thread, dramatically simplifying the API. |
| 83 | +It's a static library so hopefully it just works™. |
| 84 | + |
| 85 | +## What Do Next? |
| 86 | +Go forth and use `libmoq` in all of your favorite tools still using C for some reason. |
| 87 | +The current API is media-specific, but we're going to add support for generic tracks too. |
| 88 | + |
| 89 | +[Software Mansion](https://swmansion.com/) just started on native iOS/Android support for MoQ using libmoq. |
| 90 | +It took them a day to get [playback working on iOS](https://discord.com/channels/1124083992740761730/1124083992740761733/1473997800273608744). |
| 91 | +Go pay them if you're a big corpo using React Native... or wait until it's open source. |
| 92 | + |
| 93 | +There's also an [ffmpeg fork](https://github.com/brianmed/FFmpeg/tree/feature/moq-integration) if forking OBS was not good enough. |
| 94 | +Unfortunately, ffmpeg doesn't have a plugin system so you're stuck with a fork. |
| 95 | + |
| 96 | +If you're bored, vibe code a binding for your favorite language/platform/application and we'll throw it into the `moq-dev` organization. |
| 97 | +Bonus points for VLC. |
| 98 | + |
| 99 | +## Who Do Did? |
| 100 | +Again a huge shoutout to [pangaea](https://github.com/davegullo), [bpmedley](https://github.com/brianmed), [emilsas](https://github.com/emilsas), and everyone from [Qualabs](https://qualabs.com/) for all of their hard work. |
| 101 | +It feels great delegating the hard parts to others. |
| 102 | + |
| 103 | +I could get used to this. |
| 104 | + |
| 105 | +Written by [@kixelated](https://github.com/kixelated). |
| 106 | + |
| 107 | + |
0 commit comments