Skip to content

Commit

Permalink
chore: Renamed to Superstreamer (#76)
Browse files Browse the repository at this point in the history
* Changed mixwave to superstreamer in packages

* Updated readme

* Renamed dashboard to app

* Added docs
  • Loading branch information
matvp91 authored Oct 21, 2024
1 parent 9fa1926 commit 31e80e5
Show file tree
Hide file tree
Showing 149 changed files with 1,164 additions and 1,870 deletions.
11 changes: 5 additions & 6 deletions .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
"commit": false,
"fixed": [
[
"@mixwave/api",
"@mixwave/artisan",
"@mixwave/artisan-producer",
"@mixwave/dashboard",
"@mixwave/shared",
"@mixwave/stitcher"
"@superstreamer/api",
"@superstreamer/artisan",
"@superstreamer/dashboard",
"@superstreamer/shared",
"@superstreamer/stitcher"
]
],
"linked": [],
Expand Down
89 changes: 15 additions & 74 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,40 @@
<div align="center">
<img src="./public/logo-full.png" width="420" />
<img src="./public/logo-mascotte.png" width="140" />

<h3>Mixwave</h3>
<h4>From video processing to playback in a matter of minutes</h4>
<h3>Superstreamer</h3>
<h4>From video processing to playback in a matter of minutes.</h4>

<p align="center">
<img src="https://img.shields.io/github/license/matvp91/mixwave">
<img src="https://img.shields.io/github/last-commit/matvp91/mixwave">
<img src="https://img.shields.io/github/stars/matvp91/mixwave" alt="stars">
<img src="https://img.shields.io/github/license/matvp91/superstreamer">
<img src="https://img.shields.io/github/last-commit/matvp91/superstreamer">
<img src="https://img.shields.io/github/stars/matvp91/superstreamer" alt="stars">
<img src="https://img.shields.io/badge/PR's-welcome-0437F2" alt="pr">
<a href="https://discord.gg/4hXgz9EsF4">
<img src="https://img.shields.io/discord/1290252589522223166?v=1" alt="discord">
</a>
</p>

<p align="center">
<a href="https://matvp91.github.io/mixwave">Documentation</a> ·
<a href="https://matvp91.github.io/mixwave/getting-started.html">Getting Started</a>
<a href="https://matvp91.github.io/superstreamer">Documentation</a> ·
<a href="https://matvp91.github.io/superstreamer/getting-started.html">Getting Started</a>
</p>

[<img src="./public/button-buy-me-a-coffee.png" width="150" alt="Buy me a coffee button"/>](https://www.buymeacoffee.com/matvp91)
[<img src="./public/button-join-discord.png" width="136" alt="Join Discord button"/>](https://discord.gg/4hXgz9EsF4)

</div>

Mixwave is a self hostable platform that aims to simplify the complexities of video delivery. Transcode and package your media for online streaming with simple API calls and sane defaults, or craft dynamic HLS playlists on the fly with bumpers, ads and filters.
Superstreamer is a self hostable platform that aims to simplify the complexities of video delivery. Transcode and package your media for online streaming with simple API calls and sane defaults, or craft dynamic HLS playlists on the fly with bumpers, ads and filters.

- Transcode your video file into separate quality tracks (eg; 1080p, 720p, 480p).
- Write `HLS CMAF` playlists directly to S3, ready to be played by [HLS.js](https://github.com/video-dev/hls.js).
- Scales `ffmpeg` jobs horizontally.
- Manually insert [HLS interstitials](https://developer.apple.com/streaming/GettingStartedWithHLSInterstitials.pdf), like the Netflix bumper.
- Parses an [Ad Playlist](https://www.iab.com/guidelines/vmap/) (VMAP), transcodes and packages the ad media files and inserts them as interstitials, on the fly.
- Player included, with a UI written in React.
- Write `HLS CMAF` playlists directly to S3, ready for playback!
- Want to insert a bumper like Netflix? Stitch it as an HLS interstitial on the fly.
- Insert linear ads as interstitials by providing a simple VMAP.
- Use our facade to interact with HLS.js, a heavily simplified wrapper that makes sense for player builders.
- Awesome React components to start building your own player.

Give us a ⭐ if you like our work. Much appreciated!

## Motivation

Video is quite fragmented, particularly in the way video content is delivered and protected across different platforms and devices. Think [MPEG-DASH vs. HLS](https://www.gumlet.com/learn/hls-vs-dash/), [CTR vs. CBCS](https://websites.fraunhofer.de/video-dev/is-this-the-end-of-cenc-an-overview-of-drm-codec-support-in-2021/), [SSAI vs. CSAI](https://clearcode.cc/blog/client-side-server-side-ad-insertion/). Besides, there's also a lot of cool things happening behind closed doors, like SGAI. We aim to avoid fragmentation by picking the right tools for the job. If you don't have to do the same thing multiple times, aiming for perfection is a lot easier. We believe `HLS CMAF` is the right way forward, and when playlist manipulation is required, we tend to lean towards `HLS Interstitials`. There's obviously going to be roadblocks ahead, think of devices not supporting multiple video elements or partially serving encrypted fragments opposed to plain ads. We'll tackle these once we get there.

There's a lot of video tooling out there, think of ffmpeg, bento4, shaka-packager, but not in a unified manner. Mixwave implements the excellent work done by others, and tries to make it approachable in the form of an API with a strong focus on scalability and ease of use. The latter is quiet challenging, you'd only have to look at how complex ffmpeg gets when you get into the details.

Video from source to consumer is a hard task to get right, [howvideo.works](https://howvideo.works/) is a great resource to get you started.

## Getting Started

```shell
Expand All @@ -53,55 +45,4 @@ cp config.env.example config.env
docker compose up -d
```

## Run locally

We try to make it as easy for you to run Mixwave locally. Install [Bun](https://bun.sh/) (v1.1.30 or above), and [pnpm](https://pnpm.io/installation). Next up, make sure you have the `config.env` file configured properly as well. We recommend [Redis Stack](https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/) in your dev env. Run the following commands at the root of the project:

```shell
pnpm install-bin # Helper to install ffmpeg, packager
pnpm install # Install npm dependencies
pnpm dev # Run dev env
```

Go to `http://localhost:52000` and you're good to go!

There's more info in the [Getting Started](https://matvp91.github.io/mixwave/getting-started.html) section in the docs.

## Player

We built a `facade` that simplifies working with [HLS.js](https://github.com/video-dev/hls.js) and React player components.

- **Demo**: We created a sample on [StackBlitz - Mixwave Player Demo](https://stackblitz.com/edit/mixwave-player-demo) if you're interested in the implementation details.
- **Documentation**: There's a separate [README](https://github.com/matvp91/mixwave/tree/main/packages/player) dedicated to the player module.

```sh
# We currently rely on HLS.js 1.6.0 beta as it contains interstitials support.
npm i [email protected]
npm i @mixwave/player
```

https://github.com/user-attachments/assets/b839a0dd-4c5f-443a-b53e-f21742be0875

## Demos

### Transcode & Package

Let's take the popular BigBuckBunny MP4 video and package it in two different resolutions: 480p and 720p. Once that's done, we'll use the `packageAfter` flag to immediately package the files. In the end, we'll have an HLS playlist ready and stored on our S3.

https://github.com/user-attachments/assets/5fb52e94-c729-4d5b-8f27-a93c161d07e2

### Prepend a bumper dynamically

You know what's even more exciting than just playing videos? Manipulating them in real-time! We'll quickly transcode and package the iconic Netflix bumper, then prepend it to the beginning of our BigBuckBunny video.

https://github.com/user-attachments/assets/b799d7d4-9f53-40ae-bd9b-51589d31fef3

### Insert linear ads

To wrap things up, we'll have the stitcher fetch a few Google IMA video ads and insert them into our playlist. If you need more control, feel free to customize the ad request however you'd like, as long as the final output is a [VMAP](https://www.iab.com/guidelines/vmap/). Each ad break defined in the VMAP will then be mapped to interstitials.

https://github.com/user-attachments/assets/10fa274d-1761-4d10-9c39-065f241f84aa

## 🤝 Contribute

New contributors are welcome! See `CONTRIBUTING.md` for contributing to the project.
Dive into the [Documentation](https://matvp91.github.io/superstreamer) and do not hesitate to ask questions on [Discord](https://discord.gg/4hXgz9EsF4).
4 changes: 2 additions & 2 deletions docker/build.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash

declare -a arr=("api" "artisan" "dashboard" "stitcher")
declare -a arr=("api" "artisan" "app" "stitcher")

dir=$(pwd)

Expand All @@ -9,5 +9,5 @@ do
cd $dir/packages/$package
echo "👷 Building $package"
pnpm run build
docker build . --no-cache --platform linux/amd64,linux/arm64 --tag=mixwave/$package:latest
docker build . --no-cache --platform linux/amd64,linux/arm64 --tag=superstreamerapp/$package:latest
done
4 changes: 2 additions & 2 deletions docker/deploy.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#!/bin/bash

declare -a arr=("api" "artisan" "dashboard" "stitcher")
declare -a arr=("api" "artisan" "app" "stitcher")

for package in "${arr[@]}"
do
docker push mixwave/$package:latest
docker push superstreamerapp/$package:latest
echo "✅ Published $package"
done
36 changes: 18 additions & 18 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,54 +1,54 @@
version: "3"

volumes:
mixwave_redis_data:
superstreamer_redis_data:

services:
mixwave-dashboard:
image: "mixwave/dashboard:latest"
superstreamer-app:
image: "superstreamerapp/app:latest"
ports:
- 52000:52000
env_file: config.env

mixwave-api:
image: "mixwave/api:latest"
superstreamer-api:
image: "superstreamerapp/api:latest"
restart: always
ports:
- 52001:52001
depends_on:
- mixwave-redis
- superstreamer-redis
env_file: config.env
environment:
- REDIS_HOST=mixwave-redis
- REDIS_HOST=superstreamer-redis
- REDIS_PORT=6379

mixwave-stitcher:
image: "mixwave/stitcher:latest"
superstreamer-stitcher:
image: "superstreamerapp/stitcher:latest"
restart: always
ports:
- 52002:52002
depends_on:
- mixwave-redis
- superstreamer-redis
env_file: config.env
environment:
- REDIS_HOST=mixwave-redis
- REDIS_HOST=superstreamer-redis
- REDIS_PORT=6379

mixwave-artisan:
image: "mixwave/artisan:latest"
superstreamer-artisan:
image: "superstreamerapp/artisan:latest"
restart: always
depends_on:
- mixwave-redis
- superstreamer-redis
env_file: config.env
environment:
- REDIS_HOST=mixwave-redis
- REDIS_HOST=superstreamer-redis
- REDIS_PORT=6379

mixwave-redis:
superstreamer-redis:
image: redis/redis-stack-server:7.2.0-v6
ports:
- 6379:6379
- 127.0.0.1:6379:6379
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
volumes:
- mixwave_redis_data:/data
- superstreamer_redis_data:/data
62 changes: 37 additions & 25 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from "vitepress";

export default defineConfig({
base: "/mixwave/",
title: "Mixwave",
base: "/superstreamer/",
title: "Superstreamer",
description:
"All-in-one toolkit handles everything from video source to player.",
"An open, scalable, online streaming setup. All-in-one toolkit from ingest to adaptive video playback.",
lang: "en-US",
head: [
[
Expand All @@ -22,57 +22,69 @@ export default defineConfig({
provider: "local",
},
sidebar: [
{ text: "Introduction", link: "introduction" },
{ text: "Getting Started", link: "getting-started" },
{
text: "Features",
text: "Introduction",
items: [
{
text: "Transcode",
link: "features/transcode",
text: "What is Superstreamer?",
link: "/guide/what-is-superstreamer"
},
{
text: "Package",
link: "features/package",
text: "Getting Started",
link: "/guide/getting-started"
},
{
text: "Stitcher",
link: "features/stitcher",
text: "Packages",
link: "/guide/packages"
},
],
{
text: "Learning",
link: "/guide/learning"
}
]
},
{
text: "Frontend",
text: "Features",
items: [
{
text: "Video processing",
link: "/guide/video-processing",
},
{
text: "Playlist manipulation",
link: "/guide/playlist-manipulation",
},
{
text: "Player",
link: "frontend/player",
link: "/guide/player",
},
{
text: "Dashboard",
link: "frontend/dashboard",
},
],
link: "/guide/dashboard"
}
]
},
{
text: "Miscellaneous",
items: [
{ text: "Contribute", link: "misc/contribute" },
{ text: "Tips", link: "misc/tips" },
{ text: "Credits", link: "misc/credits" },
{
text: "Contribute",
link: "/guide/contribute"
},
{
text: "Credits",
link: "/guide/credits"
},
],
},
],
socialLinks: [
{ icon: "github", link: "https://github.com/matvp91/mixwave" },
{ icon: "github", link: "https://github.com/matvp91/superstreamer" },
],
footer: {
message: "Released under the MPL-2.0 License.",
copyright: "Copyright © 2024-present Matthias Van Parijs",
},
outline: {
level: [1, 3],
},
},
vite: {
clearScreen: false,
Expand Down
Loading

0 comments on commit 31e80e5

Please sign in to comment.