diff --git a/dist/roverd b/dist/roverd index 6ab15e8d..5d5467d7 100755 Binary files a/dist/roverd and b/dist/roverd differ diff --git a/dist/servoverifier b/dist/servoverifier index 932b321a..9fc53831 100755 Binary files a/dist/servoverifier and b/dist/servoverifier differ diff --git a/pi/bin/video-publisher.sh b/pi/bin/video-publisher.sh index 37387b63..4c83c714 100644 --- a/pi/bin/video-publisher.sh +++ b/pi/bin/video-publisher.sh @@ -20,27 +20,11 @@ VIDEO_FPS="${VIDEO_FPS:-30}" VIDEO_BITRATE="${VIDEO_BITRATE:-3000000}" AUDIO_ENABLE="${AUDIO_ENABLE:-0}" AUDIO_DEVICE="${AUDIO_DEVICE:-plughw:0,0}" -AUDIO_RATE="${AUDIO_RATE:-48000}" -AUDIO_CHANNELS="${AUDIO_CHANNELS:-1}" -AUDIO_BITRATE="${AUDIO_BITRATE:-24000}" -AUDIO_CODEC="${AUDIO_CODEC:-pcm_mulaw}" - -# Normalize device/rate to match the HAT capture; plughw handles any minor conversions. -AUDIO_DEVICE="plughw:0,0" +AUDIO_CODEC="pcm_s16le" +# Keep the audio path simple for the Pi Zero; we hardcode a single PCM profile. +AUDIO_RATE=16000 AUDIO_CHANNELS=1 -# Defaults chosen to keep Pi Zero CPU low. Opus can be enabled by setting AUDIO_CODEC=libopus. -if [[ "${AUDIO_CODEC}" == "libopus" ]]; then - AUDIO_RATE=16000 - AUDIO_BITRATE=16000 -else - # G.711 mu-law (or A-law if AUDIO_CODEC=pcm_alaw): very low CPU, 8 kHz mono, ~64 kbps. - AUDIO_CODEC="pcm_mulaw" - AUDIO_RATE=8000 - AUDIO_BITRATE=64000 -fi - -# Disable audio streaming for now; only video will be published. -AUDIO_ENABLE=0 +AUDIO_DEVICE="plughw:0,0" # Flip the camera 180deg (supported by rpicam-vid/libcamera-vid) FLIP_ARGS=(--rotation 180) @@ -64,9 +48,6 @@ else exit 1 fi -# Flip using the native rotation flag (0/180 supported per rpicam-vid --help). -FLIP_ARGS=(--rotation 180) - run_pipeline() { if [[ "${AUDIO_ENABLE}" -eq 1 ]]; then # Try audio + video; if audio device is missing, fallback to video-only. @@ -101,11 +82,9 @@ run_pipeline() { -i "${AUDIO_DEVICE}" \ -c:v copy \ -c:a "${AUDIO_CODEC}" \ - -b:a "${AUDIO_BITRATE}" \ - $( [[ "${AUDIO_CODEC}" == "libopus" ]] && echo "-compression_level 0 -application voip -frame_duration 60" ) \ - -ac:a "${AUDIO_CHANNELS}" \ -ar:a "${AUDIO_RATE}" \ - -af "$( [[ "${AUDIO_CODEC}" == "libopus" ]] && echo "pan=1c|c0=c0," )volume=20dB" \ + -ac:a "${AUDIO_CHANNELS}" \ + -af "volume=20dB" \ -flush_packets 1 \ -f mpegts \ "${PUBLISH_URL}" diff --git a/pi/install_roverd.sh b/pi/install_roverd.sh index 05f2f07a..4c55cb89 100755 --- a/pi/install_roverd.sh +++ b/pi/install_roverd.sh @@ -204,8 +204,10 @@ VIDEO_WIDTH=1280 VIDEO_HEIGHT=720 VIDEO_FPS=30 VIDEO_BITRATE=2000000 -AUDIO_ENABLE=1 AUDIO_ENABLE=0 +AUDIO_DEVICE=plughw:0,0 +AUDIO_RATE=16000 +AUDIO_CHANNELS=1 ENV chown roverd:roverd /var/lib/roverd/video.env chmod 0640 /var/lib/roverd/video.env diff --git a/pi/roverd/config.go b/pi/roverd/config.go index c6212595..206f98d6 100644 --- a/pi/roverd/config.go +++ b/pi/roverd/config.go @@ -143,7 +143,7 @@ func LoadConfig(path string) (*Config, error) { Audio: AudioConfig{ CaptureEnabled: false, CaptureDevice: "plughw:0,0", - SampleRate: 48000, + SampleRate: 16000, Channels: 1, Bitrate: 24000, TTSEnabled: false, diff --git a/pi/roverd/media_env.go b/pi/roverd/media_env.go index 8aef312e..6a278953 100644 --- a/pi/roverd/media_env.go +++ b/pi/roverd/media_env.go @@ -25,8 +25,20 @@ func UpdatePublisherEnv(media MediaConfig, audio AudioConfig) error { fmt.Fprintf(&buf, "VIDEO_HEIGHT=%d\n", media.VideoHeight) fmt.Fprintf(&buf, "VIDEO_FPS=%d\n", media.VideoFPS) fmt.Fprintf(&buf, "VIDEO_BITRATE=%d\n", media.VideoBitrate) - // Disable mic streaming; audio is handled locally for TTS only. - fmt.Fprintf(&buf, "AUDIO_ENABLE=0\n") + audioDevice := audio.CaptureDevice + if audioDevice == "" { + audioDevice = "plughw:0,0" + } + if audio.SampleRate <= 0 { + audio.SampleRate = 16000 + } + if audio.Channels <= 0 { + audio.Channels = 1 + } + fmt.Fprintf(&buf, "AUDIO_ENABLE=%d\n", boolToInt(audio.CaptureEnabled)) + fmt.Fprintf(&buf, "AUDIO_DEVICE=%s\n", audioDevice) + fmt.Fprintf(&buf, "AUDIO_RATE=%d\n", audio.SampleRate) + fmt.Fprintf(&buf, "AUDIO_CHANNELS=%d\n", audio.Channels) if err := os.WriteFile(publisherEnvPath, buf.Bytes(), 0o640); err != nil { return err } diff --git a/pi/roverd/roverd.sample.yaml b/pi/roverd/roverd.sample.yaml index 427f241d..2fc58426 100644 --- a/pi/roverd/roverd.sample.yaml +++ b/pi/roverd/roverd.sample.yaml @@ -40,7 +40,7 @@ cameraServo: audio: captureEnabled: false captureDevice: plughw:0,0 - sampleRate: 48000 + sampleRate: 16000 channels: 1 bitrate: 24000 ttsEnabled: false