diff --git a/testdata/moonfire-nvr/movement_detection_via_api_ffmpeg.sh b/testdata/moonfire-nvr/movement_detection_via_api_ffmpeg.sh index 872bac0..c051208 100644 --- a/testdata/moonfire-nvr/movement_detection_via_api_ffmpeg.sh +++ b/testdata/moonfire-nvr/movement_detection_via_api_ffmpeg.sh @@ -7,22 +7,21 @@ main() { for uuid in $( api /api/ | jq -r .cameras[].uuid ); do - local streams=(main sub) + local stream=main local recordings=($( - api /api/cameras/$uuid/$streams/recordings \ + api /api/cameras/$uuid/$stream/recordings \ | jq -c '.recordings[] | [.startId, .growing, .startTime90k]' \ | grep -v ,true, \ | jq -r .[0] \ | sort -n #-r )) - for recording_idx in $(seq 1 ${#recordings[@]}); do - local recording=${recordings[recording_idx-1]} + for recording in "${recordings[@]}"; do if grep "^$uuid.$recording$" /tmp/movement_detection_via_api_ffmpeg.sh.txt; then continue fi local ts="$(_date -u -d @"$( - api "/api/cameras/$uuid/$streams/view.mp4.txt?s=$recording&ts=true" \ + api "/api/cameras/$uuid/$stream/view.mp4.txt?s=$recording&ts=true" \ | grep -A 1 last_modified: \ | head -n 2 \ | tail -n 1 \ @@ -34,53 +33,43 @@ main() { continue fi - echo uuid=$uuid stream=$streams recording=$recording ts=$ts - api "/api/cameras/$uuid/$streams/view.mp4?s=$recording&ts=true" > /tmp/movement_detection_via_api_ffmpeg.sh.mp4 + echo uuid=$uuid stream=$stream recording=$recording ts=$ts + api "/api/cameras/$uuid/$stream/view.mp4?s=$recording&ts=true" > /tmp/movement_detection_via_api_ffmpeg.sh.mp4 - local has_change=false - local cksum="$(cksum /tmp/movement_detection_via_api_ffmpeg.sh.mp4)" - if grep "^$cksum$" /tmp/movement_detection_via_api_ffmpeg.sh.txt; then - has_change=true - fi + local fps=$(ffprobe -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 2>&1 | grep -o '[0-9]*\.*[0-9]* fps' | head -n 1 | awk '{print $1}') + local inspection="$(ffmpeg -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 -vf 'select=not(mod(n\,'${fps%.*}')),select=gte(scene\,0),metadata=print:file=-' -an -f null - 2> /dev/null | paste - -)" + local scores=($(echo "$inspection" | awk '{print $NF}' | sed 's/.*=//')) - if ! $has_change; then - local fps=$(ffprobe -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 2>&1 | grep -o '[0-9]*\.*[0-9]* fps' | head -n 1 | awk '{print $1}') - local inspection="$(ffmpeg -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 -vf 'select=not(mod(n\,'${fps%.*}')),select=gte(scene\,0),metadata=print:file=-' -an -f null - 2> /dev/null | paste - -)" - local scores=($(echo "$inspection" | awk '{print $NF}' | sed 's/.*=//')) + local flattened_scores=() + for i in $(seq 1 ${#scores[@]}); do + flattened_scores+=($(echo ${scores[@]:i-2:3} | tr ' ' '\n' | sort -n | head -n 2 | tail -n 1)) + done - local flattened_scores=() - for i in $(seq 1 ${#scores[@]}); do - flattened_scores+=($(echo ${scores[@]:i-2:3} | tr ' ' '\n' | sort -n | head -n 2 | tail -n 1)) - done - - local threshold=1 - local last_n=(${flattened_scores[@]:0:7}) - for i in $(seq 1 ${#flattened_scores[@]}); do - last_n[$(( (i-1)%7 ))]=${flattened_scores[$((i-1))]} - max_of_last_n=$(echo "${last_n[@]}" | tr ' ' '\n' | sort | tail -n 1) - if [[ "$max_of_last_n" < "$threshold" ]]; then - threshold="$max_of_last_n" - fi - done - threshold="$(echo "$threshold + 0.01" | bc)" - - local max_flattened_score=$(echo "${flattened_scores[@]:5:${#flattened_scores[@]}-10}" | tr ' ' '\n' | sort -n | tail -n 1) - if [[ "${max_flattened_score#*.}" > "${threshold#*.}" ]]; then - has_change=true + local threshold=1 + local last_n=(${flattened_scores[@]:0:7}) + for i in $(seq 1 ${#flattened_scores[@]}); do + last_n[$(( (i-1)%7 ))]=${flattened_scores[$((i-1))]} + max_of_last_n=$(echo "${last_n[@]}" | tr ' ' '\n' | sort | tail -n 1) + if [[ "$max_of_last_n" < "$threshold" ]]; then + threshold="$max_of_last_n" fi + done + threshold="$(echo "$threshold + 0.01" | bc)" + + local max_flattened_score=$(echo "${flattened_scores[@]:5:${#flattened_scores[@]}-10}" | tr ' ' '\n' | sort -n | tail -n 1) + local has_change=false + if [[ "${max_flattened_score#*.}" > "${threshold#*.}" ]]; then + has_change=true fi if $has_change; then echo "$uuid.$recording" >> /tmp/movement_detection_via_api_ffmpeg.sh.txt - echo "$cksum" >> /tmp/movement_detection_via_api_ffmpeg.sh.txt else echo no movement in "$recording" - for stream in ${streams[@]}; do - api "/api/cameras/$uuid/$stream/view.mp4" \ - -X DELETE \ - -H 'Content-Type: application/json' \ - -d "$(printf '{"runStartId": %s}' "$recording")" - done + api "/api/cameras/$uuid/$stream/view.mp4" \ + -X DELETE \ + -H 'Content-Type: application/json' \ + -d "$(printf '{"runStartId": %s}' "$recording")" fi done break