Umgesetzt wird dies mit pulseaudio-utils, ffmpeg, mp3splt und für die visuelle Ein-Ausgabe zenity sowie libnotify-bin.
Einzige Manko daran ist, dass es nach Wiedergabe-Stopp manchmal bis zu 20 Sekunden dauern kann, bis PulseAudio bemerkt das kein Audiosignal mehr anliegt. Aber diese Stille lässt sich beispielsweise mit mp3splt korrigieren.
Das Script wird bei mir in
/home/sven/.binabgelegt. Das dazugehörige Programm Icon unter
/home/sven/.bin/iconsAngepasst werden muss nur SCRIPT_ICON, voreingestellt greift er auf einem PNG Bild RECORD.png zu
/home/sven/.bin/icons/RECORD.pngUnd SCRIPT_DESTINATION, der die Audiodatei voreingestellt im folgenden Verzeichnis speichert
/home/sven/MusikDer Aufruf geschieht mittels einem für Gnome erstellten Starter im Verzeichnis
/home/sven/local/share/applications/Record.desktopDer wie folgt aussieht
[Desktop Entry] Comment= Terminal=false Name=Ton Aufzeichnen Exec=/home/sven/.bin/record Type=Application Icon=/home/sven/.bin/icons/RECORD.pngDas eigentliche Script schaut dann schlussendlich wie folgt aus:
#!/bin/bash
function require() {
for prog in "$@"; do
[ `which $prog` ] || { notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Binary '$prog' not installed. Exit now..."; exit 1; }
done
}
SCRIPT=$(basename "$0")
SCRIPT_NAME=$(basename "$0" | tr [a-z] [A-Z])
SCRIPT_PATH="$(dirname "$(readlink -e "$0")")"
SCRIPT_ICON="${SCRIPT_PATH}/icons/RECORD.png"
SCRIPT_ICONS="${SCRIPT_PATH}/icons"
SCRIPT_DESTINATION="${HOME}/Musik"
require "ffmpeg" "zenity" "pacmd" "parec" "mp3splt"
i=0; while [[ "`pacmd list-sink-inputs | grep "sink input(s)" | awk '{print $1}'`" == 0 ]] || [[ "`pacmd list-sink-inputs | grep "sink input(s)" | awk '{print $1}'`" -gt 1 ]]; do
if [ $i -eq 0 ]; then
notify-send -i "${SCRIPT_ICON}" -u normal $SCRIPT_NAME "Warte nun 30 Sekunden auf dem zu speichernden Stream"
elif [ $i -eq 300 ]; then
if [[ "`pacmd list-sink-inputs | grep "sink input(s)" | awk '{print $1}'`" == 0 ]]; then
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Es wurde kein Audio Stream zur Soundkarte erkannt"
exit 1
elif [[ "`pacmd list-sink-inputs | grep "sink input(s)" | awk '{print $1}'`" -gt 1 ]]; then
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Zu viele Audio Streams zur Soundkarte erkannt"
exit 1
fi
fi
i=$[$i+1]
sleep 0.1
done
CONTENT="$(pacmd list-sink-inputs)"
APPLICATION="$(echo "$CONTENT" | grep "application\.name" | awk '{print $3}' | sed 's/\"//g')"
INDEXEXIST="$(echo "$CONTENT" | grep "index:" | wc -l 2>&1)"
if [ $INDEXEXIST -gt 0 ]; then
if [ $INDEXEXIST -eq 1 ]; then
notify-send -i "${SCRIPT_ICON}" -u normal $SCRIPT_NAME "Stream wird von <$APPLICATION> aufgenommen."
INDEX="$(pacmd list-sink-inputs | grep "index: " | awk '{print $2}')"
parec --verbose --monitor-stream=$INDEX --file-format=wav /tmp/audio_record_tmp.wav 2>&1
notify-send -i "${SCRIPT_ICON}" -u normal $SCRIPT_NAME "Stream Aufnahme beendet"
if [ -f /tmp/audio_record_tmp.wav ]; then
if [ -d ~/Musik ]; then
while ! echo "$NAME" | grep ".* - .*" > /dev/null; do
NAME=$(zenity --entry --title="$SCRIPT" --ok-label="OK" --cancel-label="Abbruch" --text="Bitte gebe einen Dateinamen (ohne Endung) für die Aufnahme ein.\n\nIdealerweise: Interpret - Titel\n\n" --entry-text="$NAME")
if [ $? = 1 ] || [ -z "$NAME" ]; then
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Aufnahme abgebrochen. Datei wird verworfen..."
rm /tmp/audio_record_tmp.wav
exit 1
else
ARTIST=${NAME% - *}
TITLE=${NAME#* - }
fi
done
zenity --question --title="$SCRIPT" --ok-label="MP3" --cancel-label="WAVE" --text="Soll die Aufnahme direkt in MP3 konvertiert werden?\n\nZiel: ${SCRIPT_DESTINATION}/${NAME}\n\nWenn WAVE ausgewählt wird, wird die Aufnahme als WAV verlustfrei zur Weiterverarbeitung gespeichert."
if [ $? = 1 ]; then
mv /tmp/audio_record_tmp.wav "${SCRIPT_DESTINATION}/${NAME}.wav"
notify-send -i "${SCRIPT_ICON}" -u normal $SCRIPT_NAME "Stream Aufnahme wurde als WAV gespeichert. Fertig"
else
notify-send -i "${SCRIPT_ICON}" -u normal $SCRIPT_NAME "Stream wird zu MP3 konvertiert. Bitte warten..."
ffmpeg -i /tmp/audio_record_tmp.wav -metadata title="$TITLE" -metadata artist="$ARTIST" -ab 256k -ac 2 /tmp/audio_record_tmp.mp3 2>&1
if [ $? = 0 ]; then
rm /tmp/audio_record_tmp.wav
else
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Konvertierung fehlgeschlagen"
[ -f /tmp/audio_record_tmp.wav ] && rm /tmp/audio_record_tmp.wav
[ -f /tmp/audio_record_tmp.mp3 ] && rm /tmp/audio_record_tmp.mp3
exit 1
fi
mp3splt -r -p min=2 /tmp/audio_record_tmp.mp3 > /dev/null 2>&1
if [ $? = 0 ]; then
[ -f /tmp/audio_record_tmp.mp3 ] && rm /tmp/audio_record_tmp.mp3
mv /tmp/audio_record_tmp_trimmed.mp3 "${SCRIPT_DESTINATION}/${NAME}.mp3"
else
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "MP3 Stille entfernen fehlgeschlagen"
[ -f /tmp/audio_record_tmp_trimmed.mp3 ] && rm /tmp/audio_record_tmp_trimmed.mp3
mv /tmp/audio_record_tmp.mp3 "${SCRIPT_DESTINATION}/${NAME}.mp3"
fi
notify-send -i "${SCRIPT_ICON}" -u normal $SCRIPT_NAME "Stream konvertieren abgeschlossen. Fertig"
fi
else
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Ordner MUSIK existiert im Benutzerverzeichnis nicht"
fi
else
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Die temporäre Aufnahme wurde nicht gefunden"
fi
else
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Zu viele Audio Streams zur Soundkarte erkannt"
fi
else
notify-send -i "${SCRIPT_ICON}" -u critical $SCRIPT_NAME "Es wurde kein Audio Stream zur Soundkarte erkannt"
fi
Keine Kommentare:
Kommentar veröffentlichen