Last active
March 2, 2025 22:06
-
-
Save vajonam/b2697ce137781116707392f95891ddf1 to your computer and use it in GitHub Desktop.
frigate_export.sh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
TMP_PATH=/tmp/work | |
# STORAGE_PATH="/net/sahara/Storage/Security/events" | |
# /net/security/frigate/recordings/2023-04-14/*/front/*.mp4 | |
STORAGE_PATH="/net/security/frigate/recordings" | |
OUTPUT_PATH="/net/security/exports" | |
# list or of monitors with output fps. | |
MONITORS="front 30,doorbell 30,pathway 30,backdoor 30,patio 30" | |
FILES_TOKEEP=14 | |
FFM_GLOBAL="-hide_banner -loglevel panic -y" | |
FFM_HW="-hwaccel cuda -hwaccel_output_format cuda -extra_hw_frames 8 -an -skip_frame nokey" | |
FFM_OPTS="-c:v h264_nvenc -cq:v 27" | |
URL=https://frigate.domain.com | |
# FFM_DEBUG="-v debug -y" | |
DOCKER_CMD='docker run --rm --gpus device=0 -v /net:/net:shared -v /tmp/work:/tmp/work --user www-data:www-data linuxserver/ffmpeg' | |
PROBE_CMD='docker run --rm --gpus device=0 -v /net:/net:shared -v /tmp/work:/tmp/work --user www-data:www-data --entrypoint=/usr/local/bin/ffprobe linuxserver/ffmpeg' | |
var=$1 | |
if [ ! -z "$1" ] ; then | |
DATE=${1}; | |
TODAY=`/bin/date -d "${DATE}+1 day" +"%Y%m%d"` | |
YESTERDAY=`date -d "${DATE}" +"%Y%m%d"` | |
else | |
TODAY=`/bin/date -d "today" +"%Y%m%d"` | |
DATE=`date -d "${TODAY}-1 day" +"%Y-%m-%d"` | |
YESTERDAY=`date -d "${TODAY}-1 day" +"%Y%m%d"` | |
fi | |
if [ ! -z ${TMP_PATH} ] ; then | |
mkdir -p ${TMP_PATH} | |
fi | |
start=$(date +%s -d"${YESTERDAY}") | |
end=$(date +%s -d"${TODAY}") | |
IFS="," | |
for k in ${MONITORS} | |
do | |
# Extract framerate and monitor name from tuple | |
IFS=" " | |
set -- $k | |
MONITOR=$1 | |
FRAMERATE=$2 | |
unset IFS | |
# Cleanup old files | |
FILENAME=${DATE}_${MONITOR} | |
echo -n "${MONITOR} on ${DATE} @ ${FRAMERATE}fps " | |
echo -n "probing," | |
if DURATION=`${PROBE_CMD} ${FFM_DEBUG} -show_entries format=duration -v quiet -of csv='p=0' ${URL}/vod/${MONITOR}/start/$start/end/$end/index.m3u8` ; then | |
PTS=`echo "scale=4; 60/${DURATION}" | bc` | |
if (( $(echo "0.04 < ${PTS}" |bc -l) )); then | |
PTS=0.04 | |
SPEEDUP=`echo "scale=1; 1/${PTS}" | bc` | |
else | |
SPEEDUP=`echo "scale=1; ${DURATION}/60" | bc` | |
fi | |
echo -n "encoding ${SPEEDUP}x" | |
$DOCKER_CMD ${FFM_GLOBAL} ${FFM_HW} -i ${URL}/vod/${MONITOR}/start/$start/end/$end/index.m3u8 ${FFM_OPTS} -vf setpts=${PTS}*PTS -r ${FRAMERATE} ${OUTPUT_PATH}/${MONITOR}/${FILENAME}.mp4 | |
touch -d ${DATE} ${OUTPUT_PATH}/${MONITOR}/${FILENAME}.mp4 | |
# ln -s /media/exports/${MONITOR}/${FILENAME}.mp4 ${OUTPUT_PATH}/../frigate/exports/${MONITOR}\ ${DATE}.mp4 | |
else | |
echo -n "no events" | |
fi | |
echo ",done." | |
FILES=`ls -t1 ${OUTPUT_PATH}/${MONITOR}/*.mp4 | tail -n +$(($FILES_TOKEEP+1))` | |
if [ ! -z "$FILES" ] ; then | |
rm $FILES | |
echo "Removed old file $FILES" | |
fi | |
done; | |
# Clean up | |
docker ps -a | awk '{ print $1,$2 }' | grep ffmpeg | awk '{print $1 }' | xargs -I {} docker rm {} > /dev/null 2>&1 | |
rm -f ${TMP_PATH}/* | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment