From d00b2cf16026e27512ed852651e9491111ccb3d2 Mon Sep 17 00:00:00 2001 From: legop3 Date: Sat, 29 Nov 2025 20:53:43 -0500 Subject: [PATCH] good old video publisher (hopefully) --- pi/bin/video-publisher.sh | 88 +++------------------------------------ 1 file changed, 6 insertions(+), 82 deletions(-) diff --git a/pi/bin/video-publisher.sh b/pi/bin/video-publisher.sh index 86668863..689dc803 100644 --- a/pi/bin/video-publisher.sh +++ b/pi/bin/video-publisher.sh @@ -11,34 +11,13 @@ if [[ ! -f "$ENV_FILE" ]]; then fi # shellcheck disable=SC1090 -# Strip any CRLFs to avoid sourcing a PUBLISH_URL with a stray carriage return in the name. -source <(tr -d '\r' < "$ENV_FILE") -PUBLISH_URL="${PUBLISH_URL:-}" -if [[ -z "${PUBLISH_URL}" ]]; then - # Fallback parser in case sourcing missed due to weird whitespace/BOM - PUBLISH_URL="$(grep -E '^PUBLISH_URL=' "$ENV_FILE" | head -n1 | cut -d= -f2- | tr -d '\r')" -fi -if [[ -z "${PUBLISH_URL}" ]]; then - echo "PUBLISH_URL not set in ${ENV_FILE}; contents:" >&2 - sed -n '1,200p' "$ENV_FILE" >&2 - exit 1 -fi +source "$ENV_FILE" +: "${PUBLISH_URL:?PUBLISH_URL not set in ${ENV_FILE}}" VIDEO_WIDTH="${VIDEO_WIDTH:-1920}" VIDEO_HEIGHT="${VIDEO_HEIGHT:-1080}" VIDEO_FPS="${VIDEO_FPS:-30}" -VIDEO_BITRATE="${VIDEO_BITRATE:-2000000}" -AUDIO_ENABLE="${AUDIO_ENABLE:-0}" -AUDIO_DEVICE="${AUDIO_DEVICE:-hw:0,0}" -AUDIO_CODEC="libopus" -# Capture raw PCM and transcode to low-bitrate Opus for TS/mediamtx/WHEP compatibility. -AUDIO_RATE="${AUDIO_RATE:-48000}" -AUDIO_CHANNELS="${AUDIO_CHANNELS:-2}" -# Output params (tuned for low CPU/bandwidth). -AUDIO_OUT_RATE="${AUDIO_OUT_RATE:-16000}" -AUDIO_OUT_CHANNELS="${AUDIO_OUT_CHANNELS:-1}" -AUDIO_BITRATE="${AUDIO_BITRATE:-24000}" -AUDIO_FORMAT="${AUDIO_FORMAT:-S32_LE}" +VIDEO_BITRATE="${VIDEO_BITRATE:-3000000}" # Flip the camera 180deg (supported by rpicam-vid/libcamera-vid) FLIP_ARGS=(--rotation 180) @@ -63,38 +42,7 @@ else fi run_pipeline() { - if [[ "${AUDIO_ENABLE}" -ne 1 ]]; then - "${LIBCAMERA_BIN_PATH}" \ - --inline \ - --timeout 0 \ - --width "${VIDEO_WIDTH}" \ - --height "${VIDEO_HEIGHT}" \ - "${FLIP_ARGS[@]}" \ - --framerate "${VIDEO_FPS}" \ - --bitrate "${VIDEO_BITRATE}" \ - --codec h264 \ - --profile baseline \ - --denoise cdn_off \ - --nopreview \ - --awb custom \ - --awbgains 1.5,1.8 \ - --output - \ - | "${FFMPEG_BIN_PATH}" \ - -hide_banner \ - -loglevel warning \ - -fflags nobuffer \ - -thread_queue_size 512 \ - -f h264 \ - -i pipe:0 \ - -c:v copy \ - -an \ - -flush_packets 1 \ - -f mpegts \ - "${PUBLISH_URL}" - return - fi - - if ! "${LIBCAMERA_BIN_PATH}" \ + "${LIBCAMERA_BIN_PATH}" \ --inline \ --timeout 0 \ --width "${VIDEO_WIDTH}" \ @@ -112,39 +60,15 @@ run_pipeline() { | "${FFMPEG_BIN_PATH}" \ -hide_banner \ -loglevel warning \ - -fflags nobuffer+genpts \ - -flags low_delay \ - -max_interleave_delta 0 \ + -fflags nobuffer \ -use_wallclock_as_timestamps 1 \ - -rtbufsize 0 \ - -thread_queue_size 512 \ -f h264 \ -i pipe:0 \ - -thread_queue_size 16384 \ - -f s32le \ - -ar "${AUDIO_RATE}" \ - -ac "${AUDIO_CHANNELS}" \ - -i <(arecord -D "${AUDIO_DEVICE}" -f "${AUDIO_FORMAT}" -c "${AUDIO_CHANNELS}" -r "${AUDIO_RATE}" -B 65536 -F 2048 -q -t raw) \ - -af "aresample=16000,pan=mono|c0=0.5*FL+0.5*FR" \ - -map 0:v:0 -map 1:a:0 \ -c:v copy \ - -c:a "${AUDIO_CODEC}" \ - -b:a "${AUDIO_BITRATE}" \ - -ar:a "${AUDIO_OUT_RATE}" \ - -ac:a "${AUDIO_OUT_CHANNELS}" \ - -application lowdelay \ - -frame_duration 20 \ - -compression_level 0 \ - -muxpreload 0 \ - -muxdelay 0 \ - -vsync passthrough \ + -an \ -flush_packets 1 \ -f mpegts \ "${PUBLISH_URL}" - then - echo "Audio pipeline failed; falling back to video-only this run" >&2 - AUDIO_ENABLE=0 - fi } while true; do