diff --git a/README.md b/README.md index d2f264cb..87d98316 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ cd ~/MultiRoombaRover sudo ./pi/install_roverd.sh ``` -Then point each rover's `/etc/roverd.yaml` at `ws://:8080/rover`, set `name` to the rover’s ID, and (optionally) override `media.publishUrl` if your control server isn’t `192.168.0.86`. The WHIP publisher service (`whip-publisher.service`) captures the Pi camera with `rpicam-vid`/`libcamera-vid`, pipes the raw H264 into the bundled `ffmpeg-whip`, and publishes straight into the server’s mediaMTX instance at `http://:8889/whip/`. Install `libcamera-apps` on each Pi; the installer will download the patched ffmpeg build automatically. Use the “Restart Camera” button if you enable media management so roverd can bounce the publisher service remotely. +Then point each rover's `/etc/roverd.yaml` at `ws://:8080/rover`, set `name` to the rover’s ID, and (optionally) override `media.publishUrl` if your control server isn’t `192.168.0.86`. The WHIP publisher service (`whip-publisher.service`) captures the Pi camera with `rpicam-vid`/`libcamera-vid`, pipes the raw H264 into the repo-built `ffmpeg-whip`, and publishes straight into the server’s mediaMTX instance at `http://:8889/whip/`. Install `libcamera-apps` on each Pi; the installer will build the WHIP-enabled ffmpeg binary (takes several minutes on a Pi Zero 2 W). Use the “Restart Camera” button if you enable media management so roverd can bounce the publisher service remotely. Heads-up: the BRC pulser now uses libgpiod; make sure the `roverd` service account is in the `gpio` group (or otherwise allowed to access `/dev/gpiochip*`) and set `brc.gpioChip` if your hardware exposes a different chip name. ## Fedora server deployment diff --git a/docs/pi-deployment.md b/docs/pi-deployment.md index dc898960..23b49ceb 100644 --- a/docs/pi-deployment.md +++ b/docs/pi-deployment.md @@ -95,7 +95,7 @@ rpicam-vid (or libcamera-vid) --inline --timeout 0 --width=WIDTH --height=HEIGHT -f h264 -i pipe:0 -c:v copy -an -f whip $WHIP_URL ``` -The installer downloads `ffmpeg-whip` (a WHIP-enabled FFmpeg build) and drops it at `/usr/local/bin/ffmpeg-whip`, along with its private libraries under `/usr/local/lib/ffmpeg-whip`. roverd writes `/var/lib/roverd/whip.env` on startup (and whenever you restart the service) so the publisher inherits the correct `WHIP_URL`, resolution, FPS, and bitrate. Tweak those knobs under `media.videoWidth`, `media.videoHeight`, `media.videoFps`, and `media.videoBitrate` in `/etc/roverd.yaml` if you need different camera settings. +The installer builds `ffmpeg-whip` (a WHIP-enabled FFmpeg) from source, installs it under `/usr/local/lib/ffmpeg-whip`, and drops a wrapper at `/usr/local/bin/ffmpeg-whip`. roverd writes `/var/lib/roverd/whip.env` on startup (and whenever you restart the service) so the publisher inherits the correct `WHIP_URL`, resolution, FPS, and bitrate. Tweak those knobs under `media.videoWidth`, `media.videoHeight`, `media.videoFps`, and `media.videoBitrate` in `/etc/roverd.yaml` if you need different camera settings. Building FFmpeg on a Pi Zero 2 W can take 15–30 minutes—let the installer finish before rebooting. Use `sudo systemctl status whip-publisher` to watch the pipeline logs; the unit auto-restarts whenever the network drops or FFmpeg exits. ## Server + UI diff --git a/new_video_pipeline.md b/new_video_pipeline.md new file mode 100644 index 00000000..6ba54444 --- /dev/null +++ b/new_video_pipeline.md @@ -0,0 +1,11 @@ +# video flow: +1. Raspberry pi zero 2 W + - raspberry pi camera + - hardware h264 encoder built into the pi +2. mediaMTX on the server + - the server will forward video from the pi to users + - video streams must be able to be locked + - to do this, always require JWT auth for all rover streams + - just decide who to give access tokens too +3. User web player + - \ No newline at end of file diff --git a/pi/install_roverd.sh b/pi/install_roverd.sh index d35c44e3..379d13a3 100755 --- a/pi/install_roverd.sh +++ b/pi/install_roverd.sh @@ -6,8 +6,7 @@ set -euo pipefail BINARY_SRC="dist/roverd" CONFIG_SRC="pi/roverd/roverd.sample.yaml" -FFMPEG_WHIP_VERSION="0.0.0" -FFMPEG_WHIP_BASE_URL="https://github.com/steel-dev/ffmpeg-whip/releases/download/v${FFMPEG_WHIP_VERSION}" +FFMPEG_SRC_REF="master" FFMPEG_WHIP_DIR="/usr/local/lib/ffmpeg-whip" FFMPEG_WHIP_BIN="/usr/local/bin/ffmpeg-whip" @@ -66,11 +65,6 @@ if [[ ! -f "$CONFIG_SRC" ]]; then exit 1 fi -if ! command -v curl >/dev/null 2>&1; then - echo "curl is required by this installer" >&2 - exit 1 -fi - ensure_user() { local user="$1" local groups="${2:-}" @@ -93,30 +87,44 @@ if ! command -v rpicam-vid >/dev/null 2>&1 && ! command -v libcamera-vid >/dev/n log "WARNING: neither rpicam-vid nor libcamera-vid found in PATH; install libcamera-apps." fi +ensure_ffmpeg_build_deps() { + log "Installing FFmpeg build dependencies (this may take a while)..." + apt-get update + apt-get install -y --no-install-recommends \ + git curl ca-certificates build-essential pkg-config yasm nasm \ + libssl-dev libx264-dev libopus-dev \ + libx11-dev libxext-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libxcb-shape0-dev +} + install_ffmpeg_whip() { - local arch asset tmp - arch="$(uname -m)" - case "$arch" in - aarch64) - asset="ffmpeg-whip-linux-arm64.tar.gz" - ;; - x86_64|amd64) - asset="ffmpeg-whip-linux-amd64.tar.gz" - ;; - *) - log "WARNING: ffmpeg-whip binary not available for architecture ${arch}; ensure a WHIP-capable ffmpeg is installed manually." - return - esac + if [[ -x "$FFMPEG_WHIP_BIN" && -f "$FFMPEG_WHIP_DIR/bin/ffmpeg" && -d "$FFMPEG_WHIP_DIR/lib" ]]; then + log "ffmpeg-whip already present; skipping build" + return + } + ensure_ffmpeg_build_deps + log "Building ffmpeg with WHIP muxer (this can take several minutes)..." + rm -rf "$FFMPEG_WHIP_DIR" + mkdir -p "$FFMPEG_WHIP_DIR" tmp="$(mktemp -d)" - log "Downloading ffmpeg-whip ${FFMPEG_WHIP_VERSION} (${asset})" - if ! curl -fsSL "${FFMPEG_WHIP_BASE_URL}/${asset}" -o "${tmp}/${asset}"; then - rm -rf "$tmp" - echo "Failed to download ffmpeg-whip from ${FFMPEG_WHIP_BASE_URL}/${asset}" >&2 - exit 1 - fi - rm -rf "${FFMPEG_WHIP_DIR}" - mkdir -p "${FFMPEG_WHIP_DIR}" - tar -xzf "${tmp}/${asset}" -C "${FFMPEG_WHIP_DIR}" + git clone --depth 1 --branch "$FFMPEG_SRC_REF" https://git.ffmpeg.org/ffmpeg.git "$tmp/ffmpeg" + pushd "$tmp/ffmpeg" >/dev/null + ./configure \ + --prefix="$FFMPEG_WHIP_DIR" \ + --disable-debug --disable-doc --disable-ffplay --disable-ffprobe \ + --enable-shared --disable-static \ + --enable-openssl \ + --enable-protocol=http,https,tcp,udp,dtls,file,pipe \ + --enable-muxer=whip \ + --enable-gpl --enable-version3 \ + --enable-libx264 --enable-libopus \ + --enable-encoder=libx264,libopus \ + --enable-parser=h264 \ + --enable-bsf=h264_mp4toannexb \ + --enable-filter=scale,fps,format,aresample \ + --enable-indev=x11grab,xcbgrab + make -j"$(nproc)" + make install + popd >/dev/null rm -rf "$tmp" cat > "${FFMPEG_WHIP_BIN}" <<'EOF' #!/usr/bin/env bash @@ -124,7 +132,7 @@ export LD_LIBRARY_PATH=/usr/local/lib/ffmpeg-whip/lib:${LD_LIBRARY_PATH} exec /usr/local/lib/ffmpeg-whip/bin/ffmpeg "$@" EOF chmod 0755 "${FFMPEG_WHIP_BIN}" - log "Installed ${FFMPEG_WHIP_BIN}" + log "Installed ffmpeg-whip ($(${FFMPEG_WHIP_BIN} -version | head -n1))" } ensure_user roverd "dialout,gpio,video,render"