Compare commits
19 Commits
f0bd9a3f58
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 18f503c3e0 | |||
| ac0f0a6fbb | |||
| bfbb10ed52 | |||
| 88519bc4ab | |||
| d910a3d93f | |||
| 197b2890e8 | |||
| 48c84601c5 | |||
| a39c5ffb46 | |||
| 769bb239e0 | |||
| cc9de03d26 | |||
| 753f6e1782 | |||
| 89844ef368 | |||
| 13e6615435 | |||
| b6f985a323 | |||
| 69b70c83d7 | |||
| 3d4b98a866 | |||
| 22fe3daf99 | |||
| 19e6bb8250 | |||
| 18ff13e376 |
51
README.md
51
README.md
@@ -14,7 +14,7 @@
|
|||||||
* Einrichtung ALSA
|
* Einrichtung ALSA
|
||||||
* über welches Device kann das Mikro angesprochen werden? (hier: plughw:1,0)
|
* über welches Device kann das Mikro angesprochen werden? (hier: plughw:1,0)
|
||||||
|
|
||||||
#### Entfernter Server (server)
|
#### Voraussetzungen entfernter Server (server)
|
||||||
|
|
||||||
* sshd
|
* sshd
|
||||||
* apt-get install rsync
|
* apt-get install rsync
|
||||||
@@ -36,28 +36,57 @@ Auf dem Raspi folgendes ausführen:
|
|||||||
```
|
```
|
||||||
git clone https://git.hs42.de/hs/sumsel.git
|
git clone https://git.hs42.de/hs/sumsel.git
|
||||||
cd /sumsel
|
cd /sumsel
|
||||||
|
chmod a+x sumsel.sh
|
||||||
cp sumsel.conf.dist sumsel.conf
|
cp sumsel.conf.dist sumsel.conf
|
||||||
```
|
```
|
||||||
Anschliessend Variablen in ./sumsel.conf setzen.
|
Anschliessend Variablen in ./sumsel.conf setzen:
|
||||||
|
| Variable | Optional/Required | Bedeutung | Default |
|
||||||
|
| ------------------------ | ----------------- | ----------------------------------------------- | ----------------------------------------- |
|
||||||
|
| REC_DEVICE | required | Adresse der USB Soundkarte | plughw:1,0 |
|
||||||
|
| REMOTE_DIR | required | Zielordner auf dem entfernten Server | <remote_user>@<remote_host>:<remote_path> |
|
||||||
|
| REF_FILE_TIME | optional | Laenge einer WAV Datei in Sekunden | 360 |
|
||||||
|
| REC_DIR | optional | Ordner, ind dem die WAV Dateien abgelegt werden | ./recordings |
|
||||||
|
| REC_PREFIX | optional | Prefix Dateiname WAV Dateien | sums |
|
||||||
|
| UPL_DIR | optional | Ordner in dem die MP3 Dateien abgelegt werden | ./upqueue |
|
||||||
|
| UPL_SUFFIX | optional | Ordner in dem die MP3 Dateien abgelegt werden | sumsi |
|
||||||
|
|
||||||
|
## Skripte
|
||||||
|
|
||||||
|
| Kommando | Aktion |
|
||||||
|
| ------------ | ------------------------ |
|
||||||
|
| sumsel.sh -s | Simulieren |
|
||||||
|
| sumsel.sh -r | Aufnehmen |
|
||||||
|
| sumsel.sh -c | Konvertieren + Hochladen |
|
||||||
|
|
||||||
## Betrieb
|
## Betrieb
|
||||||
|
|
||||||
### Endloses Aufnehmen
|
Im Dauerbetrieb laufen zwei Jobs:
|
||||||
|
|
||||||
|
| Jobtyp | Bezeichnung | Kommando | Betriebsart |
|
||||||
|
| ------- |------------------------- | ------------------------------- | -------------- |
|
||||||
|
| record | Aufnahme der WAV Dateien | ./sumsel.sh -r -C ./sumsel.conf | endlos |
|
||||||
|
| convert | Konvertierung + Upload | ./sumsel.sh -c -C ./sumsel.conf | alle 5 Minuten |
|
||||||
|
|
||||||
|
Die Jobs können über cron gestartet werden. Das Skript setzt einen Lock und sorgt dafür, dass von
|
||||||
|
jeden Jobtyp nur eine Instanz laufen kann. Stellt das Script fest, dass bereits eine Instanz läuft,
|
||||||
|
wird die aktuelle Instanz mit der Meldung "LOCK error" beendet.
|
||||||
|
|
||||||
```
|
```
|
||||||
pi@raspi:~> ./record.sh
|
hs@raspi4:~/dev/stage/sumsel $ ./sumsel.sh -c -C ./sumsel.conf
|
||||||
|
LOCK error
|
||||||
```
|
```
|
||||||
|
|
||||||
### Endloses Simulieren
|
Beispiel für crontab:
|
||||||
|
|
||||||
```
|
```
|
||||||
pi@raspi:~> ./simulate.sh
|
*/5 * * * * <path>/sumsel.sh -r -C <path>/sumsel.conf >> <path>/sumsel_r.log
|
||||||
|
1,10,11,21,31,41,51 * * * * <path>/sumsel.sh -c -C <path>/sumsel.conf >> <path>/sumsel_c.log
|
||||||
```
|
```
|
||||||
|
|
||||||
### Konvertieren und rsync Upload
|
|
||||||
|
|
||||||
Einplanung über crond
|
|
||||||
|
|
||||||
```
|
### GIT commands
|
||||||
pi@raspi:~> ./convert.sh
|
* git status
|
||||||
```
|
* git add ...
|
||||||
|
* git commit -m "..."
|
||||||
|
* git push origin master
|
||||||
|
|||||||
26
convert.sh
26
convert.sh
@@ -1,26 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ./sumsel.conf
|
|
||||||
. ./sumsel_functions.incl
|
|
||||||
|
|
||||||
if set_lockfile;
|
|
||||||
then
|
|
||||||
#Alle WAV Files ausser das letzte File.
|
|
||||||
#Das letzte File wird gerade recorded und wird beim naechsten Durchlauf verarbeitet
|
|
||||||
FILES=$(ls -tr ${REC_DIR} |head -n -1)
|
|
||||||
|
|
||||||
for F in ${FILES}
|
|
||||||
do
|
|
||||||
#echo ${F}
|
|
||||||
#Ermittle ctime des WAV Files
|
|
||||||
CTIME=$(date -r "${REC_DIR}/${F}" +"%Y%m%d%H%M%S")
|
|
||||||
ffmpeg -i "${REC_DIR}/${F}" -acodec mp3 "${UPL_DIR}/${CTIME}_${UPL_SUFFIX}.mp3"
|
|
||||||
rm "${REC_DIR}/${F}"
|
|
||||||
done
|
|
||||||
|
|
||||||
rsync -avzh --remove-source-files ${UPL_DIR} ${REMOTE_DIR}
|
|
||||||
del_lockfile
|
|
||||||
else
|
|
||||||
echo "LOCK error"
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ./sumsel.conf
|
|
||||||
. ./sumsel_functions.incl
|
|
||||||
|
|
||||||
arecord --format=cd --device=${REC_DEVICE} --max-file-time ${REC_FILE_TIME} ${REC_DIR}/${REC_PREFIX}.wav
|
|
||||||
|
|
||||||
15
simulate.sh
15
simulate.sh
@@ -1,15 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ./sumsel.conf
|
|
||||||
. ./sumsel_functions.incl
|
|
||||||
|
|
||||||
COUNTER=0
|
|
||||||
|
|
||||||
echo "Press [CTRL+C] to stop.."
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
sleep 1
|
|
||||||
COUNTER=$[$COUNTER +1]
|
|
||||||
dst_fn="${REC_DIR}/${REC_PREFIX}-${COUNTER}.wav"
|
|
||||||
cp ${SIM_EXAMPLE_FILE} ${dst_fn}
|
|
||||||
done
|
|
||||||
@@ -1,27 +1,24 @@
|
|||||||
LOCK_DIR=/var/lock
|
|
||||||
|
|
||||||
SIM_EXAMPLE_FILE=./res/test.wav
|
|
||||||
|
|
||||||
REC_DEVICE=plughw:1,0
|
REC_DEVICE=plughw:1,0
|
||||||
|
|
||||||
#Laenge der WAV Dateien in Sekunden
|
#Laenge der WAV Dateien in Sekunden
|
||||||
REC_FILE_TIME=360
|
#REC_FILE_TIME=360
|
||||||
|
|
||||||
#Ordner, ind dem die WAV Dateien abgelegt werden
|
#Ordner, ind dem die WAV Dateien abgelegt werden
|
||||||
#wenn der Ordner nicht existiert, wird er angelegt
|
#wenn der Ordner nicht existiert, wird er angelegt
|
||||||
REC_DIR=./recordings
|
#REC_DIR=./recordings
|
||||||
|
|
||||||
#Dateiname der WAV Dateien
|
#Dateiname der WAV Dateien
|
||||||
# sums-01.wav, sums-02.wav, ...
|
# sums-01.wav, sums-02.wav, ...
|
||||||
REC_PREFIX=sums
|
#REC_PREFIX=sums
|
||||||
|
|
||||||
#Ordner in dem die MP3 Dateien abgelegt werden
|
#Ordner in dem die MP3 Dateien abgelegt werden
|
||||||
#wenn der Ordner nicht existiert, wird er angelegt
|
#wenn der Ordner nicht existiert, wird er angelegt
|
||||||
UPL_DIR=./upqueue
|
#UPL_DIR=./upqueue
|
||||||
|
|
||||||
#Dateiname der MP3 Dateien
|
#Dateiname der MP3 Dateien
|
||||||
# 20210130101112-sumsi.mp3, 20210130101120-sumsi.mp3, ...
|
# 20210130101112-sumsi.mp3, 20210130101120-sumsi.mp3, ...
|
||||||
UPL_SUFFIX=sumsi
|
#UPL_SUFFIX=sumsi
|
||||||
|
|
||||||
#Rsync Zielordner
|
#Rsync Zielordner
|
||||||
REMOTE_DIR=<remote_user>@<remote_host>:<remote_path>
|
REMOTE_DIR=<remote_user>@<remote_host>:<remote_path>
|
||||||
|
|||||||
202
sumsel.sh
Executable file
202
sumsel.sh
Executable file
@@ -0,0 +1,202 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
VERSION="0.3"
|
||||||
|
|
||||||
|
LOCK_DIR=/var/lock
|
||||||
|
|
||||||
|
SIM_EXAMPLE_FILE=./res/test.wav
|
||||||
|
|
||||||
|
#Laenge der WAV Dateien in Sekunden
|
||||||
|
REC_FILE_TIME=360
|
||||||
|
|
||||||
|
#Ordner, ind dem die WAV Dateien abgelegt werden
|
||||||
|
#wenn der Ordner nicht existiert, wird er angelegt
|
||||||
|
REC_DIR=./recordings
|
||||||
|
|
||||||
|
#Dateiname der WAV Dateien
|
||||||
|
# sums-01.wav, sums-02.wav, ...
|
||||||
|
REC_PREFIX=sums
|
||||||
|
|
||||||
|
#Ordner in dem die MP3 Dateien abgelegt werden
|
||||||
|
#wenn der Ordner nicht existiert, wird er angelegt
|
||||||
|
UPL_DIR=./upqueue
|
||||||
|
|
||||||
|
#Dateiname der MP3 Dateien
|
||||||
|
# 20210130101112-sumsi.mp3, 20210130101120-sumsi.mp3, ...
|
||||||
|
UPL_SUFFIX=sumsi
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [-h] (-s|-r|-t) [-C <configfile>]" 1>&2;
|
||||||
|
echo -e '\t-h Usage' 1>&2;
|
||||||
|
echo -e '\t-v Version' 1>&2;
|
||||||
|
echo -e '' 1>&2;
|
||||||
|
echo -e '\t-s Simulation' 1>&2;
|
||||||
|
echo -e '\t-r Aufnahme' 1>&2;
|
||||||
|
echo -e '\t-c Konvertierung' 1>&2;
|
||||||
|
echo -e '' 1>&2;
|
||||||
|
echo -e '\t-C <configfile> Konfiguration laden' 1>&2;
|
||||||
|
echo "" 1>&2;
|
||||||
|
echo "Doku: https://git.hs42.de/hs/sumsel" 1>&2;
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mode=''
|
||||||
|
lock_mode=''
|
||||||
|
|
||||||
|
while getopts ":hsrcC:v" options;
|
||||||
|
do
|
||||||
|
case "${options}" in
|
||||||
|
v)
|
||||||
|
echo "$0 version ${VERSION}" 1>&2;
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
"s" | "r" | "c") #simulate
|
||||||
|
mode=${options}
|
||||||
|
;;
|
||||||
|
C)
|
||||||
|
config=${OPTARG}
|
||||||
|
if [ -f ${config} ]; then
|
||||||
|
. ${config}
|
||||||
|
else
|
||||||
|
echo "config file not found: ${config}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "unknown option"
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
set_lockfile() {
|
||||||
|
local basename=$(basename "$0")
|
||||||
|
if [ ! -z ${1+x} ]; then
|
||||||
|
basename="${basename}_$1"
|
||||||
|
fi
|
||||||
|
local lock_file="${LOCK_DIR}/${basename}"
|
||||||
|
local random_file=$(mktemp --tmpdir=${LOCK_DIR})
|
||||||
|
echo $$ > ${random_file}
|
||||||
|
mv -n ${random_file} ${lock_file}
|
||||||
|
|
||||||
|
if [ -e ${random_file} ]; then
|
||||||
|
false
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
del_lockfile() {
|
||||||
|
local basename=$(basename "$0")
|
||||||
|
if [ ! -z ${1+x} ]; then
|
||||||
|
basename="${basename}_$1"
|
||||||
|
fi
|
||||||
|
local lock_file="${LOCK_DIR}/${basename}"
|
||||||
|
|
||||||
|
rm ${lock_file}
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
del_lockfile ${lock_mode}
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
check_var_exists() {
|
||||||
|
local var_name=$1
|
||||||
|
|
||||||
|
if [[ ! -v ${var_name} ]]; then
|
||||||
|
echo "${var_name} not set"
|
||||||
|
cleanup
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrl_c() {
|
||||||
|
echo "** Trapped CTRL-C" 1>&2;
|
||||||
|
cleanup
|
||||||
|
}
|
||||||
|
|
||||||
|
simulate() {
|
||||||
|
check_var_exists "REC_DIR"
|
||||||
|
check_var_exists "REC_PREFIX"
|
||||||
|
check_var_exists "SIM_EXAMPLE_FILE"
|
||||||
|
|
||||||
|
local counter=0
|
||||||
|
local dst_fn=""
|
||||||
|
|
||||||
|
mkdir -p ${REC_DIR}
|
||||||
|
echo "Press [CTRL+C] to stop.." 1>&2;
|
||||||
|
trap ctrl_c INT
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
sleep ${REC_FILE_TIME}
|
||||||
|
counter=$[$counter +1]
|
||||||
|
dst_fn="${REC_DIR}/${REC_PREFIX}-${counter}.wav"
|
||||||
|
cp ${SIM_EXAMPLE_FILE} ${dst_fn}
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
record() {
|
||||||
|
check_var_exists "REC_DEVICE"
|
||||||
|
check_var_exists "REC_FILE_TIME"
|
||||||
|
check_var_exists "REC_PREFIX"
|
||||||
|
check_var_exists "REC_DIR"
|
||||||
|
|
||||||
|
mkdir -p ${REC_DIR}
|
||||||
|
trap ctrl_c INT
|
||||||
|
arecord --format=cd --device=${REC_DEVICE} --buffer-size=192000 --max-file-time=${REC_FILE_TIME} --use-strftime ${REC_DIR}/${REC_PREFIX}%Y%m%d%H%M%v.wav
|
||||||
|
}
|
||||||
|
|
||||||
|
convert() {
|
||||||
|
check_var_exists "REC_DIR"
|
||||||
|
check_var_exists "UPL_DIR"
|
||||||
|
check_var_exists "UPL_SUFFIX"
|
||||||
|
check_var_exists "REMOTE_DIR"
|
||||||
|
|
||||||
|
mkdir -p ${REC_DIR}
|
||||||
|
mkdir -p ${UPL_DIR}
|
||||||
|
|
||||||
|
#Alle WAV Files ausser das letzte File.
|
||||||
|
#Das letzte File wird gerade recorded und wird beim naechsten Durchlauf verarbeitet
|
||||||
|
local FILES=$(ls -tr ${REC_DIR} |head -n -1)
|
||||||
|
|
||||||
|
for F in ${FILES}
|
||||||
|
do
|
||||||
|
#Ermittle ctime des WAV Files
|
||||||
|
local CTIME=$(date -r "${REC_DIR}/${F}" +"%Y%m%d%H%M%S")
|
||||||
|
ffmpeg -i "${REC_DIR}/${F}" -acodec mp3 "${UPL_DIR}/${CTIME}_${UPL_SUFFIX}.mp3"
|
||||||
|
rm "${REC_DIR}/${F}"
|
||||||
|
done
|
||||||
|
|
||||||
|
rsync -avzh --remove-source-files ${UPL_DIR} ${REMOTE_DIR}
|
||||||
|
}
|
||||||
|
|
||||||
|
case ${mode} in
|
||||||
|
s) #Simulation
|
||||||
|
lock_mode=record
|
||||||
|
func=simulate
|
||||||
|
;;
|
||||||
|
r) #Aufnahme
|
||||||
|
lock_mode=record
|
||||||
|
func=record
|
||||||
|
;;
|
||||||
|
c) #Konvertierung
|
||||||
|
lock_mode=convert
|
||||||
|
func=convert
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "mode not set" 1>&2;
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if set_lockfile ${lock_mode}; then
|
||||||
|
${func}
|
||||||
|
del_lockfile ${lock_mode}
|
||||||
|
else
|
||||||
|
echo "LOCK error" 1>&2;
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
|
|
||||||
function set_lockfile {
|
|
||||||
local BASENAME=$(basename "$0")
|
|
||||||
local LOCK_FILE="${LOCK_DIR}/${BASENAME}"
|
|
||||||
local RANDOM_FILE=$(mktemp --tmpdir=${LOCK_DIR})
|
|
||||||
echo $$ > ${RANDOM_FILE}
|
|
||||||
mv -n ${RANDOM_FILE} ${LOCK_FILE}
|
|
||||||
|
|
||||||
if [ -e ${RANDOM_FILE} ] ; then
|
|
||||||
OTHER_PID=$(cat ${LOCK_FILE})
|
|
||||||
false
|
|
||||||
else
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function del_lockfile {
|
|
||||||
local BASENAME=$(basename "$0")
|
|
||||||
local LOCK_FILE="${LOCK_DIR}/${BASENAME}"
|
|
||||||
|
|
||||||
rm ${LOCK_FILE}
|
|
||||||
}
|
|
||||||
|
|
||||||
mkdir -p ${REC_DIR}
|
|
||||||
mkdir -p ${UPL_DIR}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user