From ea701bcf7e9352705e42fc06a2a76f42b933a81e Mon Sep 17 00:00:00 2001 From: kixelated Date: Fri, 3 Nov 2023 13:56:45 +0900 Subject: [PATCH] Also build the moq-pub image in this repo. (#116) --- .dockerignore | 1 + .github/workflows/main.yml | 13 ++++++++- .gitignore | 1 + Dockerfile | 20 +++++++++++--- fly-relay.sh => deploy/fly-relay.sh | 0 deploy/fly.toml | 20 ++++++++++++++ deploy/publish.sh | 41 +++++++++++++++++++++++++++++ fly.toml | 19 ------------- moq-pub/Cargo.toml | 2 +- 9 files changed, 93 insertions(+), 24 deletions(-) rename fly-relay.sh => deploy/fly-relay.sh (100%) create mode 100644 deploy/fly.toml create mode 100755 deploy/publish.sh delete mode 100644 fly.toml diff --git a/.dockerignore b/.dockerignore index a7ed94c..c86b635 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,3 @@ target dev +*.mp4 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0f82e5d..a9ffa19 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,7 +6,8 @@ on: env: REGISTRY: docker.io - IMAGE: ${{ github.repository }} + IMAGE: kixelated/moq-rs + IMAGE-PUB: kixelated/moq-pub SERVICE: api # Restart the API service TODO and relays jobs: @@ -42,6 +43,16 @@ jobs: tags: ${{env.REGISTRY}}/${{env.IMAGE}} platforms: linux/amd64,linux/arm64 + # Same, but include ffmpeg for publishing BBB + - uses: depot/build-push-action@v1 + with: + project: r257ctfqm6 + context: . + push: true + target: moq-pub # instead of the default target + tags: ${{env.REGISTRY}}/${{env.IMAGE-PUB}} + platforms: linux/amd64,linux/arm64 + # Log in to GCP - uses: google-github-actions/auth@v1 with: diff --git a/.gitignore b/.gitignore index e7199cd..1a5002d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store target/ logs/ +*.mp4 diff --git a/Dockerfile b/Dockerfile index c8fbe2a..de4a70f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,14 +12,28 @@ RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/build/target \ cargo build --release && cp /build/target/release/moq-* /usr/local/cargo/bin -# Runtime image -FROM rust:latest +# Special image for moq-pub with ffmpeg and a publish script included. +FROM rust:latest as moq-pub + +# Install required utilities and ffmpeg +RUN apt-get update && \ + apt-get install -y ffmpeg wget + +# Copy the publish script into the image +COPY deploy/publish.sh /usr/local/bin/publish + +# Copy the compiled binary +COPY --from=builder /usr/local/cargo/bin/moq-pub /usr/local/cargo/bin/moq-pub +CMD [ "publish" ] + +# moq-rs image with just the binaries +FROM rust:latest as moq-rs LABEL org.opencontainers.image.source=https://github.com/kixelated/moq-rs LABEL org.opencontainers.image.licenses="MIT OR Apache-2.0" # Fly.io entrypoint -ADD fly-relay.sh . +ADD deploy/fly-relay.sh . # Copy the compiled binaries COPY --from=builder /usr/local/cargo/bin /usr/local/cargo/bin diff --git a/fly-relay.sh b/deploy/fly-relay.sh similarity index 100% rename from fly-relay.sh rename to deploy/fly-relay.sh diff --git a/deploy/fly.toml b/deploy/fly.toml new file mode 100644 index 0000000..18f6558 --- /dev/null +++ b/deploy/fly.toml @@ -0,0 +1,20 @@ +app = "englishm-moq-relay" +kill_signal = "SIGINT" +kill_timeout = 5 + +[env] +PORT = "4443" + +[experimental] +cmd = "./fly-relay.sh" + +[[services]] +internal_port = 4443 +protocol = "udp" + +[services.concurrency] +hard_limit = 25 +soft_limit = 20 + +[[services.ports]] +port = "4443" diff --git a/deploy/publish.sh b/deploy/publish.sh new file mode 100755 index 0000000..b905daa --- /dev/null +++ b/deploy/publish.sh @@ -0,0 +1,41 @@ +#!/bin/bash +set -euo pipefail + +ADDR=${ADDR:-"https://relay.quic.video"} +NAME=${NAME:-"bbb"} +URL=${URL:-"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"} + +# Download the funny bunny +wget -nv "${URL}" -O "${NAME}.mp4" + +# ffmpeg +# -hide_banner: Hide the banner +# -v quiet: and any other output +# -stats: But we still want some stats on stderr +# -stream_loop -1: Loop the broadcast an infinite number of times +# -re: Output in real-time +# -i "${INPUT}": Read from a file on disk +# -vf "drawtext": Render the current time in the corner of the video +# -an: Disable audio for now +# -b:v 3M: Output video at 3Mbps +# -preset ultrafast: Don't use much CPU at the cost of quality +# -tune zerolatency: Optimize for latency at the cost of quality +# -f mp4: Output to mp4 format +# -movflags: Build a fMP4 file with a frame per fragment +# - | moq-pub: Output to stdout and moq-pub to publish + +# Run ffmpeg +ffmpeg \ + -stream_loop -1 \ + -hide_banner \ + -v quiet \ + -re \ + -i "${NAME}.mp4" \ + -vf "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf:text='%{gmtime\: %H\\\\\:%M\\\\\:%S.%3N}':x=(W-tw)-24:y=24:fontsize=48:fontcolor=white:box=1:boxcolor=black@0.5" \ + -an \ + -b:v 3M \ + -preset ultrafast \ + -tune zerolatency \ + -f mp4 \ + -movflags empty_moov+frag_every_frame+separate_moof+omit_tfhd_offset \ + - | moq-pub "${ADDR}/${NAME}" diff --git a/fly.toml b/fly.toml deleted file mode 100644 index 1d42dd6..0000000 --- a/fly.toml +++ /dev/null @@ -1,19 +0,0 @@ -app = "englishm-moq-relay" -kill_signal = "SIGINT" -kill_timeout = 5 - -[env] - PORT = "4443" - -[experimental] - cmd = "./fly-relay.sh" - -[[services]] - internal_port = 4443 - protocol = "udp" - [services.concurrency] - hard_limit = 25 - soft_limit = 20 - - [[services.ports]] - port = "4443" diff --git a/moq-pub/Cargo.toml b/moq-pub/Cargo.toml index d70a93d..ff080ac 100644 --- a/moq-pub/Cargo.toml +++ b/moq-pub/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "moq-pub" description = "Media over QUIC" -authors = ["Mike English"] +authors = ["Mike English", "Luke Curley"] repository = "https://github.com/kixelated/moq-rs" license = "MIT OR Apache-2.0"