From 167747019aca7a08f3f04b8d77dd4711de96c283 Mon Sep 17 00:00:00 2001 From: Alexandre <44178713+alexbelgium@users.noreply.github.com> Date: Mon, 27 May 2024 10:37:20 +0200 Subject: [PATCH] Create spectral_analysis.sh --- .../rootfs/helpers/spectral_analysis.sh | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 birdnet-pi/rootfs/helpers/spectral_analysis.sh diff --git a/birdnet-pi/rootfs/helpers/spectral_analysis.sh b/birdnet-pi/rootfs/helpers/spectral_analysis.sh new file mode 100644 index 000000000..74217ef38 --- /dev/null +++ b/birdnet-pi/rootfs/helpers/spectral_analysis.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# Performs the recording from the specified RTSP stream or soundcard +source /etc/birdnet/birdnet.conf + +# Read the logging level from the configuration option +LOGGING_LEVEL="${LogLevel_BirdnetRecordingService}" +# If empty for some reason default to log level of error +[ -z $LOGGING_LEVEL ] && LOGGING_LEVEL='error' +# Additionally if we're at debug or info level then allow printing of script commands and variables +if [ "$LOGGING_LEVEL" == "info" ] || [ "$LOGGING_LEVEL" == "debug" ];then + # Enable printing of commands/variables etc to terminal for debugging + set -x +fi + +[ -z $RECORDING_LENGTH ] && RECORDING_LENGTH=15 +[ -d $RECS_DIR/StreamData ] || mkdir -p $RECS_DIR/StreamData + +if [ ! -z $RTSP_STREAM ];then + # Explode the RSPT steam setting into an array so we can count the number we have + RTSP_STREAMS_EXPLODED_ARRAY=(${RTSP_STREAM//,/ }) + + while true;do + + # Initially start the count off at 1 - our very first stream + RTSP_STREAMS_STARTED_COUNT=1 + FFMPEG_PARAMS="" + + # Loop over the streams + for i in "${RTSP_STREAMS_EXPLODED_ARRAY[@]}" + do + # Map id used to map input to output (first stream being 0), this is 0 based in ffmpeg so decrement our counter (which is more human readable) by 1 + MAP_ID=$((RTSP_STREAMS_STARTED_COUNT-1)) + # Build up the parameters to process the RSTP stream, including mapping for the output + FFMPEG_PARAMS+="-vn -thread_queue_size 512 -i ${i} -map ${MAP_ID}:a:0 -t ${RECORDING_LENGTH} -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/StreamData/spectrum.wav " + # Increment counter + ((RTSP_STREAMS_STARTED_COUNT += 1)) + done + + # Make sure were passing something valid to ffmpeg, ffmpeg will run interactive and control our loop by waiting ${RECORDING_LENGTH} between loops because it will stop once that much has been recorded + if [ -n "$FFMPEG_PARAMS" ];then + ffmpeg -hide_banner -loglevel $LOGGING_LEVEL -nostdin $FFMPEG_PARAMS + fi + + done +else + if pgrep arecord &> /dev/null ;then + echo "Recording" + else + if [ -z ${REC_CARD} ];then + arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\ + --use-strftime ${RECS_DIR}/StreamData/spectrum.wav + else + arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\ + -D "${REC_CARD}" --use-strftime ${RECS_DIR}/StreamData/spectrum.wav + fi + fi +fi + +# Create the spectral analysis +"$PYTHON_VIRTUAL_ENV" "$HOME"/BirdNET-Pi/scripts/spectral_analysis.py