From f1ebae64586d23a6a8578489f394c0222ca1403d Mon Sep 17 00:00:00 2001
From: Patrick McGuire <60325264+mcguirepr89@users.noreply.github.com>
Date: Mon, 25 Apr 2022 08:33:32 -0400
Subject: [PATCH 01/12] rtsp adjustments
---
scripts/birdnet_recording.sh | 39 ++++++++++++++++++------------------
1 file changed, 19 insertions(+), 20 deletions(-)
diff --git a/scripts/birdnet_recording.sh b/scripts/birdnet_recording.sh
index 0798511..68405c5 100755
--- a/scripts/birdnet_recording.sh
+++ b/scripts/birdnet_recording.sh
@@ -2,29 +2,28 @@
set -x
source /etc/birdnet/birdnet.conf
-if [ "${TIMESTAMP_FORMAT}" == "12" ];then
- STAMP="%I:%M:%S%P"
-else
- STAMP="%H:%M:%S"
-fi
+STAMP="%H:%M:%S"
[ -z $RECORDING_LENGTH ] && RECORDING_LENGTH=15
-if ! pulseaudio --check;then pulseaudio --start;fi
-
-if pgrep arecord &> /dev/null ;then
- echo "Recording"
-else
- until grep 5050 <(netstat -tulpn 2>&1);do
- sleep 1
+if [ ! -z $RTSP_STREAM ];then
+ while true;do
+ ffmpeg -i $RTSP_STREAM -t 15 -vn -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/$(date "+%F")-birdnet-$STAMP.wav
done
- if [ -z ${REC_CARD} ];then
-
- arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
- --use-strftime ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+else
+ if ! pulseaudio --check;then pulseaudio --start;fi
+ if pgrep arecord &> /dev/null ;then
+ echo "Recording"
else
- arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
- -D "${REC_CARD}" --use-strftime \
- ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
- fi
+ until grep 5050 <(netstat -tulpn 2>&1);do
+ sleep 1
+ done
+ if [ -z ${REC_CARD} ];then
+ arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
+ --use-strftime ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+ else
+ arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
+ -D "${REC_CARD}" --use-strftime \
+ ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+ fi
fi
From bc9edb8eb1980754189cc20287aadc4d00b0664d Mon Sep 17 00:00:00 2001
From: Patrick McGuire <60325264+mcguirepr89@users.noreply.github.com>
Date: Mon, 25 Apr 2022 08:54:46 -0400
Subject: [PATCH 02/12] adding RTSP_STREAM variable
---
birdnet.conf-defaults | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/birdnet.conf-defaults b/birdnet.conf-defaults
index 5863aab..f21fcad 100644
--- a/birdnet.conf-defaults
+++ b/birdnet.conf-defaults
@@ -48,6 +48,13 @@ ICE_PWD=birdnetpi
BIRDNETPI_URL=
+#---------------------------- RTSP Stream URL -------------------------------#
+
+## If RTSP_STREAM is set, the system will use the RTSP stream as its audio
+## source instead of recording its own audio. If this variable is kept empty,
+## BirdNET-Pi will default to recording its own audio.
+
+RTSP_STREAM=
#------------------- Mobile Notifications via Pushed.co ---------------------#
#____________The two variables below enable mobile notifications_______________#
From 0cc8c3491a6c6c903685e4bb9349b0c94f813b2e Mon Sep 17 00:00:00 2001
From: Patrick McGuire <60325264+mcguirepr89@users.noreply.github.com>
Date: Mon, 25 Apr 2022 08:55:34 -0400
Subject: [PATCH 03/12] Update install_config.sh
---
scripts/install_config.sh | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/scripts/install_config.sh b/scripts/install_config.sh
index cbd29f1..8906ec5 100755
--- a/scripts/install_config.sh
+++ b/scripts/install_config.sh
@@ -61,6 +61,13 @@ ICE_PWD=birdnetpi
BIRDNETPI_URL=
+#---------------------------- RTSP Stream URL -------------------------------#
+
+## If RTSP_STREAM is set, the system will use the RTSP stream as its audio
+## source instead of recording its own audio. If this variable is kept empty,
+## BirdNET-Pi will default to recording its own audio.
+
+RTSP_STREAM=
#------------------- Mobile Notifications via Pushed.co ---------------------#
#____________The two variables below enable mobile notifications_______________#
From 737042b24b3e2d9f76975ce58708711776584bfe Mon Sep 17 00:00:00 2001
From: Patrick McGuire <60325264+mcguirepr89@users.noreply.github.com>
Date: Mon, 25 Apr 2022 08:57:34 -0400
Subject: [PATCH 04/12] Update update_birdnet.sh
adding the new variable to the update script to make sure it is added to older systems
---
scripts/update_birdnet.sh | 3 +++
1 file changed, 3 insertions(+)
diff --git a/scripts/update_birdnet.sh b/scripts/update_birdnet.sh
index a48e7d6..dd6e84a 100755
--- a/scripts/update_birdnet.sh
+++ b/scripts/update_birdnet.sh
@@ -18,3 +18,6 @@ fi
if ! grep PRIVACY_MODE /etc/birdnet/birdnet.conf;then
sudo -u${USER} echo "PRIVACY_MODE=off" >> /etc/birdnet/birdnet.conf
fi
+if ! grep RTSP_STREAM /etc/birdnet/birdnet.conf;then
+ sudo -u${USER} echo "RTSP_STREAM=" >> /etc/birdnet/birdnet.conf
+fi
From ce782c4b8350ba9c2925331e19820b48dc14e808 Mon Sep 17 00:00:00 2001
From: Patrick McGuire <60325264+mcguirepr89@users.noreply.github.com>
Date: Mon, 25 Apr 2022 09:11:25 -0400
Subject: [PATCH 05/12] Update advanced.php
---
scripts/advanced.php | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/scripts/advanced.php b/scripts/advanced.php
index a4da847..4a60f71 100644
--- a/scripts/advanced.php
+++ b/scripts/advanced.php
@@ -64,6 +64,19 @@ if(isset($_GET['submit'])) {
}
}
+ if(isset($_GET["rtsp_stream"])) {
+ $rtsp_stream = $_GET["rtsp_stream"];
+ if(strcmp($rtsp_stream,$config['RTSP_STREAM']) !== 0) {
+ $contents = preg_replace("/RTSP_STREAM=.*/", "RTSP_STREAM=$rtsp_stream", $contents);
+ $contents2 = preg_replace("/RTSP_STREAM=.*/", "RTSP_STREAM=$rtsp_stream", $contents2);
+ $fh = fopen('/etc/birdnet/birdnet.conf', "w");
+ $fh2 = fopen("./scripts/thisrun.txt", "w");
+ fwrite($fh, $contents);
+ fwrite($fh2, $contents2);
+ exec('sudo systemctl restart birdnet_recording.service');
+ }
+ }
+
if(isset($_GET["overlap"])) {
$overlap = $_GET["overlap"];
if(strcmp($overlap,$config['OVERLAP']) !== 0) {
@@ -201,6 +214,9 @@ if (file_exists('./scripts/thisrun.txt')) {
Set Channels to the number of channels supported by your sound card. 32 max.
+
+
+ If you place an RTSP stream URL here, BirdNET-Pi will use that as its audio source.
Set Recording Length in seconds between 6 and 60. Multiples of 3 are recommended, as BirdNET analyzes in 3-second chunks.
From 6f8e676f4e4b87846c0d0b17ed7085c8ac42f96b Mon Sep 17 00:00:00 2001
From: mcguirepr89
Date: Mon, 25 Apr 2022 09:29:43 -0400
Subject: [PATCH 06/12] missing fi
---
scripts/birdnet_recording.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/birdnet_recording.sh b/scripts/birdnet_recording.sh
index 68405c5..0798a5a 100755
--- a/scripts/birdnet_recording.sh
+++ b/scripts/birdnet_recording.sh
@@ -26,4 +26,5 @@ else
-D "${REC_CARD}" --use-strftime \
${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
fi
+ fi
fi
From 5b6d36ba0e970063722ea697f5c3ac35e675dca9 Mon Sep 17 00:00:00 2001
From: mcguirepr89
Date: Mon, 25 Apr 2022 09:31:40 -0400
Subject: [PATCH 07/12] remove STAMP just use `date`
---
scripts/birdnet_recording.sh | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/scripts/birdnet_recording.sh b/scripts/birdnet_recording.sh
index 0798a5a..e2ea480 100755
--- a/scripts/birdnet_recording.sh
+++ b/scripts/birdnet_recording.sh
@@ -2,13 +2,11 @@
set -x
source /etc/birdnet/birdnet.conf
-STAMP="%H:%M:%S"
-
[ -z $RECORDING_LENGTH ] && RECORDING_LENGTH=15
if [ ! -z $RTSP_STREAM ];then
while true;do
- ffmpeg -i $RTSP_STREAM -t 15 -vn -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/$(date "+%F")-birdnet-$STAMP.wav
+ ffmpeg -i $RTSP_STREAM -t 15 -vn -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/$(date "+%F")-birdnet-$(date "+%H:%M:%S").wav
done
else
if ! pulseaudio --check;then pulseaudio --start;fi
@@ -20,11 +18,11 @@ else
done
if [ -z ${REC_CARD} ];then
arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
- --use-strftime ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+ --use-strftime ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-$(date "+%F").wav
else
arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
-D "${REC_CARD}" --use-strftime \
- ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+ ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-$(date "+%F").wav
fi
fi
fi
From 70d08ccf14c63cc4d254b989516728fc8910bd86 Mon Sep 17 00:00:00 2001
From: mcguirepr89
Date: Mon, 25 Apr 2022 09:39:21 -0400
Subject: [PATCH 08/12] adjustments to read from rtsp
---
scripts/extract_new_birdsounds.sh | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/scripts/extract_new_birdsounds.sh b/scripts/extract_new_birdsounds.sh
index cee339a..482c37b 100755
--- a/scripts/extract_new_birdsounds.sh
+++ b/scripts/extract_new_birdsounds.sh
@@ -13,9 +13,9 @@ source /etc/birdnet/birdnet.conf
# Set Variables
TMPFILE=$(mktemp)
-ANALYZED=${RECS_DIR}/*/*Analyzed
-# SCAN_DIRS are all directories marked "Analyzed"
-SCAN_DIRS=($(find ${ANALYZED} -type d 2>/dev/null | sort ))
+#ANALYZED=${RECS_DIR}/*/*Analyzed
+#SCAN_DIRS are all directories marked "Analyzed"
+SCAN_DIRS=($(find $HOME -type d -name '*Analyzed' 2>/dev/null | sort ))
for h in "${SCAN_DIRS[@]}";do
# The TMPFILE is created from each .csv file BirdNET creates
@@ -38,13 +38,14 @@ for h in "${SCAN_DIRS[@]}";do
for i in $(find ${h} -name '*csv' 2>/dev/null | sort );do
# Iterates over each '.csv' file found in each "Analyzed" directory
# to create the TMPFILE
- echo "${i}" | cut -d'/' -f7 >> ${TMPFILE}
+ echo "$(basename ${i})" >> ${TMPFILE}
sort -k1n -t\; "${i}" | awk '!/Start/{print}' >> ${TMPFILE}
done
# The extraction reads each line of the TMPFILE and sets the variables ffmpeg
# will use.
while read -r line;do
+ echo "Line = $line"
DATE="$(echo "${line}" \
| awk -F- '/birdnet/{print $1"-"$2"-"$3}')"
if [ ! -z ${DATE} ];then
From 7c687e5eb26f09ab0c0a1c3a10baa6f99087c6b2 Mon Sep 17 00:00:00 2001
From: mcguirepr89
Date: Mon, 25 Apr 2022 10:19:01 -0400
Subject: [PATCH 09/12] I dont' know how I messed up the first versions so
badly, but this one is working
---
scripts/birdnet_recording.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/birdnet_recording.sh b/scripts/birdnet_recording.sh
index e2ea480..1f1cd8d 100755
--- a/scripts/birdnet_recording.sh
+++ b/scripts/birdnet_recording.sh
@@ -18,11 +18,11 @@ else
done
if [ -z ${REC_CARD} ];then
arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
- --use-strftime ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-$(date "+%F").wav
+ --use-strftime ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-%H:%M:%S.wav
else
arecord -f S16_LE -c${CHANNELS} -r48000 -t wav --max-file-time ${RECORDING_LENGTH}\
-D "${REC_CARD}" --use-strftime \
- ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-$(date "+%F").wav
+ ${RECS_DIR}/%B-%Y/%d-%A/%F-birdnet-%H:%M:%S.wav
fi
fi
fi
From ff9f3552712c4fbb0066789eebd7555116a7bb3e Mon Sep 17 00:00:00 2001
From: ehpersonal38 <103586016+ehpersonal38@users.noreply.github.com>
Date: Mon, 25 Apr 2022 10:24:23 -0400
Subject: [PATCH 10/12] Update livestream.sh
---
scripts/livestream.sh | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/scripts/livestream.sh b/scripts/livestream.sh
index bdebba7..d081d53 100755
--- a/scripts/livestream.sh
+++ b/scripts/livestream.sh
@@ -4,8 +4,12 @@ source /etc/birdnet/birdnet.conf
if [ -z ${REC_CARD} ];then
echo "Stream not supported"
-else
- ffmpeg -loglevel 52 -ac ${CHANNELS} -f alsa -i ${REC_CARD} -acodec libmp3lame \
+elif [[ ! -z ${RTSP_STREAM} ]];then
+ ffmpeg -loglevel 52 -ac ${CHANNELS} -i ${RTSP_STREAM} -acodec libmp3lame \
-b:a 320k -ac ${CHANNELS} -content_type 'audio/mpeg' \
-f mp3 icecast://source:${ICE_PWD}@localhost:8000/stream -re
-fi
+else
+ ffmpeg -loglevel 52 -ac ${CHANNELS} -f alsa -i ${REC_CARD} -acodec libmp3lame \
+ -b:a 320k -ac ${CHANNELS} -content_type 'audio/mpeg' \
+ -f mp3 icecast://source:${ICE_PWD}@localhost:8000/stream -re
+fi
\ No newline at end of file
From 256b405c214be6ee7fdeeb6097018a5eb7b041bf Mon Sep 17 00:00:00 2001
From: ehpersonal38 <103586016+ehpersonal38@users.noreply.github.com>
Date: Mon, 25 Apr 2022 16:51:04 -0400
Subject: [PATCH 11/12] Allowing multiple RTSP stream urls
(untested)
---
scripts/advanced.php | 18 +++++++++---------
scripts/birdnet_recording.sh | 4 +++-
2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/scripts/advanced.php b/scripts/advanced.php
index 4a60f71..204dd0a 100644
--- a/scripts/advanced.php
+++ b/scripts/advanced.php
@@ -65,7 +65,7 @@ if(isset($_GET['submit'])) {
}
if(isset($_GET["rtsp_stream"])) {
- $rtsp_stream = $_GET["rtsp_stream"];
+ $rtsp_stream = str_replace("\r\n", ",", $_GET["rtsp_stream"]);
if(strcmp($rtsp_stream,$config['RTSP_STREAM']) !== 0) {
$contents = preg_replace("/RTSP_STREAM=.*/", "RTSP_STREAM=$rtsp_stream", $contents);
$contents2 = preg_replace("/RTSP_STREAM=.*/", "RTSP_STREAM=$rtsp_stream", $contents2);
@@ -76,7 +76,7 @@ if(isset($_GET['submit'])) {
exec('sudo systemctl restart birdnet_recording.service');
}
}
-
+
if(isset($_GET["overlap"])) {
$overlap = $_GET["overlap"];
if(strcmp($overlap,$config['OVERLAP']) !== 0) {
@@ -121,14 +121,14 @@ if(isset($_GET['submit'])) {
$contents2 = preg_replace("/PRIVACY_MODE=.*/", "PRIVACY_MODE=$privacy_mode", $contents2);
if(strcmp($privacy_mode,"on") == 0) {
exec('sudo sed -i \'s/\/usr\/local\/bin\/server.py/\/usr\/local\/bin\/privacy_server.py/g\' ../../BirdNET-Pi/templates/birdnet_server.service');
- exec('sudo systemctl daemon-reload');
- exec('restart_services.sh');
- header('Location: /log');
+ exec('sudo systemctl daemon-reload');
+ exec('restart_services.sh');
+ header('Location: /log');
} elseif(strcmp($privacy_mode,"off") == 0) {
exec('sudo sed -i \'s/\/usr\/local\/bin\/privacy_server.py/\/usr\/local\/bin\/server.py/g\' ../../BirdNET-Pi/templates/birdnet_server.service');
- exec('sudo systemctl daemon-reload');
- exec('restart_services.sh');
- header('Location: /log');
+ exec('sudo systemctl daemon-reload');
+ exec('restart_services.sh');
+ header('Location: /log');
}
}
}
@@ -215,7 +215,7 @@ if (file_exists('./scripts/thisrun.txt')) {
Set Channels to the number of channels supported by your sound card. 32 max.
-
+
If you place an RTSP stream URL here, BirdNET-Pi will use that as its audio source.
diff --git a/scripts/birdnet_recording.sh b/scripts/birdnet_recording.sh
index 1f1cd8d..ccd1024 100755
--- a/scripts/birdnet_recording.sh
+++ b/scripts/birdnet_recording.sh
@@ -6,7 +6,9 @@ source /etc/birdnet/birdnet.conf
if [ ! -z $RTSP_STREAM ];then
while true;do
- ffmpeg -i $RTSP_STREAM -t 15 -vn -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/$(date "+%F")-birdnet-$(date "+%H:%M:%S").wav
+ for i in ${RTSP_STREAM//,/ };do
+ ffmpeg -i ${i} -t 15 -vn -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/$(date "+%F")-birdnet-$(date "+%H:%M:%S").wav /dev/null 2>&1 & sleep 1;
+ done
done
else
if ! pulseaudio --check;then pulseaudio --start;fi
From 8864bdf280f41ccbc353516f56d6d8d34c43386f Mon Sep 17 00:00:00 2001
From: ehpersonal38 <103586016+ehpersonal38@users.noreply.github.com>
Date: Mon, 25 Apr 2022 16:53:30 -0400
Subject: [PATCH 12/12] Update advanced.php
---
scripts/advanced.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/advanced.php b/scripts/advanced.php
index 204dd0a..b73bfbe 100644
--- a/scripts/advanced.php
+++ b/scripts/advanced.php
@@ -216,7 +216,7 @@ if (file_exists('./scripts/thisrun.txt')) {
Set Channels to the number of channels supported by your sound card. 32 max.
- If you place an RTSP stream URL here, BirdNET-Pi will use that as its audio source.
+ If you place an RTSP stream URL here, BirdNET-Pi will use that as its audio source. If you have multiple streams, each URL should be on its own line.
Set Recording Length in seconds between 6 and 60. Multiples of 3 are recommended, as BirdNET analyzes in 3-second chunks.