diff --git a/plans/onvif-reolink.md b/plans/onvif-reolink.md index 73f4e6c8..83a394cc 100644 --- a/plans/onvif-reolink.md +++ b/plans/onvif-reolink.md @@ -141,4 +141,5 @@ Input/control implementation: - use a PTZ-specific client command pipeline that maps existing input intent into PTZ commands - server must enforce that only the active PTZ operator can send movement/zoom/control commands - client-side input interception is only for UX; server-side operator checks are the real authority -- all movement controls should send stop commands on key/button release, blur, disconnect, controller close, or turn loss \ No newline at end of file +- all movement controls should send stop commands on key/button release, blur, disconnect, controller close, or turn loss + diff --git a/server/mediamtx/rover-snapshot-writer.sh b/server/mediamtx/rover-snapshot-writer.sh index a6b2dc96..7dbe6d7f 100644 --- a/server/mediamtx/rover-snapshot-writer.sh +++ b/server/mediamtx/rover-snapshot-writer.sh @@ -16,10 +16,24 @@ esac mkdir -p "$SNAP_DIR" +FILTER="fps=1" +QUALITY="6" + +case "$PATH_NAME" in + ptz-camera) + # PTZ snapshots are shown to non-operators specifically to avoid sending the + # full live video stream. The PTZ publisher is full-resolution 16:9 video, + # so resize the JPEGs at the snapshot writer boundary before Node ever reads + # and fans them out over Socket.IO. + FILTER="fps=1,scale=480:-2" + QUALITY="10" + ;; +esac + exec ffmpeg -hide_banner -loglevel warning -nostdin -y \ -i "srt://127.0.0.1:9000?streamid=read:${PATH_NAME}" \ -an \ - -vf fps=1 \ - -q:v 6 \ + -vf "$FILTER" \ + -q:v "$QUALITY" \ -update 1 \ "${SNAP_DIR}/${PATH_NAME}.jpg"