snafu1 schrieb:
Feuerrabe-2 schrieb:
Ich stimme dir aber zu, dass deine Frage sich eher um ein spezifisches Problem mit dem Programm dreht und weniger mit allgemeiner Funktionalität der Shell oder typischen Shell-Tools zu tun hat.
Genau. Wenn es die Shell beträfe, hätte ich es dort geschrieben.
linuxer-nds schrieb:
Das lässt sich aufgrund der bisher bekannten Informationen noch nicht sagen.
Es könnte auch ein Skript-Fehler sein, vielleicht enthalten die Variablen $Anfang und $Ende manchmal nicht die richtigen Werte.
Das wäre im Prinzip möglich. Mein Skript gibt aber zur Kontrolle die ermittelten Werte für Quell- und Zieldatei, Anfang und Ende usw. aus, und ich hatte vergessen zu erwähnen, daß das Problem (unter sonst gleichen Bedingungen) auch auftritt, wenn man sox direkt ohne Skript aufruft.
Evtl. mal einen Skript Auszug posten.
Ich schicke sogar mal das ganze Skript. Dann kann man jedenfalls nicht mehr sagen, es fehlt was.
#!/bin/bash
# Schneidet Tondateien gemäß den übergebenen Parametern.
# Benötigt: [4msox[0m, mkdir, mpg123, mv, touch; _kontrollausgabe
# Syntax: Tondatei-schneiden [-t] <Quelldatei> <Anfang> <Ende> [Sox-Optionen]
# Syntax von Anfang und Ende: mm:ss.ms
# Optionen:
# -t Testversion: Es werden zwei kurze Dateien mit den ersten und den letzten 5 Sekunden der zu erzeugenden Datei erzeugt,
# um zu testen, ob die angegebenen Zeiten die gewünschten Schnittmarken darstellen.
# Sox-Optionen:
# -v <Lautstärkefaktor>
# -t <Quelldateityp>
if [[ $3 == "" ]]; then
echo "Syntax: [1mTondatei-schneiden[0m [-t] <Quelldatei> <Anfang> <Ende> [Sox-Optionen]"
echo "Syntax von Anfang und Ende: mm:ss.ms"
else
mkdir -p neu
if [[ ! -d neu ]]; then
echo "[1mVerzeichnis 'neu' konnte nicht angelegt werden![0m"
else
if [[ $1 == "-t" ]]; then
Tf=1
shift 1
else
Tf=0
fi
Quelldatei=$1
Zieldatei=neu/${Quelldatei}
Zieldatei_1=neu/$(echo ${Quelldatei} | sed -e 's/\.[^\.]\+$/-Anfang&/')
Zieldatei_2=neu/$(echo ${Quelldatei} | sed -e 's/\.[^\.]\+$/-Ende&/')
Anfang=$2
Ende=$3
shift 3 # Übergeht die ersten drei Argumente und widmet sich nun dem Argument 4.
Optionen=$@
if [[ $Tf == 1 ]]; then
kurz=5
Anfang_1=$Anfang
Anfang_1_min=$(echo $Anfang | sed -e 's/\([0-9]*\):.*/\1/; s/^0*//')
Anfang_1_s=$(echo $Anfang | sed -e 's/\([0-9]*\):\([0-9]*\).*/\2/; s/^0*//')
if [[ $Anfang =~ \.[0-9]+$ ]]; then
Anfang_1_ms=$(echo $Anfang | sed -e 's/.*\.\([0-9]\+\)/\1/')
else
Anfang_1_ms=0
fi
Ende_1_min=$(($Anfang_1_min+($Anfang_1_s+$kurz)/60))
Ende_1_s=$((($Anfang_1_s+$kurz)%60))
Ende_1="${Ende_1_min}:${Ende_1_s}.${Anfang_1_ms}"
# Fallunterscheidung, falls Ende länger als 1 h:
if [[ $Ende =~ [0-9]+:[0-9]+:[0-9]+ ]]; then
echo "[31m=== Ende länger als 1 h ===[0m"
Ende_2=$Ende
Ende_2_h=$(echo $Ende | sed -e 's/\([0-9]*\):\([0-9]*\):.*/\1/; s/^0*//')
Ende_2_min=$(echo $Ende | sed -e 's/\([0-9]*\):\([0-9]*\):.*/\2/; s/^0*//')
Ende_2_s=$(echo $Ende | sed -e 's/\([0-9]*\):\([0-9]*\):\([0-9]*\).*/\3/; s/^0*//')
if [[ $Ende =~ \.[0-9]+$ ]]; then
Ende_2_ms=$(echo $Ende | sed -e 's/.*\.\([0-9]\+\)/\1/')
else
Ende_2_ms=0
fi
Anfang_2_s=$((($Ende_2_s+60-$kurz)%60))
Anfang_2_min=$(($Ende_2_min-($Anfang_2_s+$kurz)/60))
Anfang_2_h=$(($Anfang_2_min < 0 ? $Ende_2_h - 1 : $Ende_2_h))
# Anfang_2_min neu berechnen für den Fall des Unterlaufs:
Anfang_2_min=$((($Anfang_2_min+60)%60))
Anfang_2="${Anfang_2_h}:${Anfang_2_min}:${Anfang_2_s}.${Ende_2_ms}"
else # Ende kürzer als 1 h
echo "[31m=== Ende kürzer als 1 h ===[0m"
Ende_2=$Ende
Ende_2_min=$(echo $Ende | sed -e 's/\([0-9]*\):.*/\1/; s/^0*//')
Ende_2_s=$(echo $Ende | sed -e 's/\([0-9]*\):\([0-9]*\).*/\2/; s/^0*//')
if [[ $Ende =~ \.[0-9]+$ ]]; then
Ende_2_ms=$(echo $Ende | sed -e 's/.*\.\([0-9]\+\)/\1/')
else
Ende_2_ms=0
fi
Anfang_2_s=$((($Ende_2_s+60-$kurz)%60))
Anfang_2_min=$(($Ende_2_min-($Anfang_2_s+$kurz)/60))
Anfang_2="${Anfang_2_min}:${Anfang_2_s}.${Ende_2_ms}"
fi # Ende kürzer als 1 h
else
rm -v $Zieldatei_1 $Zieldatei_2
fi # Tf=1
for var in Quelldatei Zieldatei Anfang Ende Optionen; do
echo "${var}: [1m${!var}[0m"
done
if [[ $Tf == 1 ]]; then
. _kontrollausgabe
kontrollausgabe Zieldatei_1 Zieldatei_2 kurz Anfang_1_h Anfang_1_min Anfang_1_s Anfang_1_ms Anfang_1 Ende_1_h Ende_1_min Ende_1_s Ende_1_ms Ende_1 Anfang_2_h Anfang_2_min Anfang_2_s Anfang_2_ms Anfang_2 Ende_2_h Ende_2_min Ende_2_s Ende_2_ms Ende_2
echo "=== Zur Fortsetzung bitte Eingabetaste drücken. ==="
read weiter
fi # Tf=1
if [[ $Tf == 1 ]]; then
sox -V3 -S $Optionen $Quelldatei $Zieldatei_1 trim $Anfang_1 =$Ende_1 pad 0:0.5
sox -V3 -S $Optionen $Quelldatei $Zieldatei_2 trim $Anfang_2 =$Ende_2 pad 0:00 0:0.5
weiter=""
until [[ $weiter =~ j|n ]]; do
echo -e "\nEs erklingt nun die Datei\n[1m$Zieldatei_1[0m:"
mpg123 $Zieldatei_1
echo -e "\nEs erklingt nun die Datei\n[1m$Zieldatei_2[0m:"
mpg123 $Zieldatei_2
echo -e "Soll die Datei [1m$Quelldatei[0m mit den angegebenen Zeiten (von $Anfang bis $Ende) geschnitten werden oder wollen Sie die Dateien\n[1m$Zieldatei_1[0m und\n[1m$Zieldatei_2[0m nochmals hören (j/n/h)?\n"
read weiter
done # until ja oder nein
if [[ $weiter == "j" ]]; then
Tondatei-schneiden $Quelldatei $Anfang $Ende $Optionen
fi # Schneiden ausführen
else # Tf=0
# Option pad fügt am Anfang und am Ende je 1 s Stille an.
# sox -V3 -S $Optionen $Quelldatei $Zieldatei trim $Anfang =$Ende
sox -V3 -S $Optionen $Quelldatei $Zieldatei trim $Anfang =$Ende pad 0:01 0:01
touch -r $Quelldatei $Zieldatei
echo "Soll die Datei [1m$Quelldatei[0m in das Verzeichnis erledigt verschoben werden (j/n)?"
read weiter
if [[ -d erl && $weiter == "j" ]]; then
mv -v $Quelldatei erl
fi # Quelldatei verschieben
fi # Testversion ja oder nein
fi # Zielverzeichnis konnte angelegt werden
fi # Mindestens 1 Parameter angegeben
Die Fallunterscheidung für Endposition > 1 h habe ich erst kürzlich eingefügt, weil die Dauer über 1 h tatsächlich nicht richtig erkannt wurde. Wie aus der Ausgabe ersichtlich, klappt das jetzt. Später will ich das auch noch für Anfänge über 1 h ergänzen.
Ansonsten wären weitere Informationen hilfreich:
Bei welchen Audio Formaten gibt es denn Probleme?
Bis jetzt nur bei MP3. Ich habe zwar auch schon andere Formate benutzt und von und in diese umgewandelt, aber das heißt nicht, daß es nicht ein prinzipielles Problem ist, das bei allen Formaten auftritt. Schließlich weiß ich ja nicht, woran es liegt.
Terminal Ausgabe von einem Programmaufruf, der ein fehlerhaftes Ergebnis produziert?
Das Problem ist schon gelegentlich mal aufgetreten. In frühreren Fällen hatte ich es umgangen, indem ich die Datei mit Audacity bearbeitet habe. Gelöst ist es damit freilich noch nicht. Bei Audacity muß man MP3-Dateien immer umständlich und langwierig im- und exportieren, und automatisieren läßt es sich auch nicht.
Das Problem trat zuletzt bei folgendem Aufruf auf:
Tondatei-schneiden -t 20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2.mp3 0:19.2 1:30:44
Ausgabe (eigentlich mit farblichen Hervorhebungen, aber im Sinne der Übersichtlichkeit habe ich die entfernt):
=== Ende länger als 1 h ===
Quelldatei: 20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2.mp3
Zieldatei: neu/20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2.mp3
Anfang: 0:19.2
Ende: 1:30:44
Optionen:
Zieldatei_1: neu/20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2-Anfang.mp3
Zieldatei_2: neu/20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2-Ende.mp3
kurz: 5
Anfang_1_h:
Anfang_1_min:
Anfang_1_s: 19
Anfang_1_ms: 2
Anfang_1: 0:19.2
Ende_1_h:
Ende_1_min: 0
Ende_1_s: 24
Ende_1_ms:
Ende_1: 0:24.2
Anfang_2_h: 1
Anfang_2_min: 30
Anfang_2_s: 39
Anfang_2_ms:
Anfang_2: 1:30:39.0
Ende_2_h: 1
Ende_2_min: 30
Ende_2_s: 44
Ende_2_ms: 0
Ende_2: 1:30:44
=== Zur Fortsetzung bitte Eingabetaste drücken. ===
Es erklingt nun die Datei
neu/20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2-Anfang.mp3:
Es erklingt nun die Datei
neu/20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2-Ende.mp3:
Soll die Datei 20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2.mp3 mit den angegebenen Zeiten (von 0:19.2 bis 1:30:44) geschnitten werden oder wollen Sie die Dateien
neu/20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2-Anfang.mp3 und
neu/20150324-Telemann-SuiOr-B-55B11-La-Bourse-KonBfStBc-C-51C1-Heinichen-ConStObBc-G-Sb-214-Geminiani-Cog-10-F-Cog-12-d-La-follia-Aufzeichnung-HR2-Ende.mp3 nochmals hören (j/n/h)?
Die Testdatei für Anfang mit den ersten 5 Sekunden ist richtig, die Testdatei für Ende liegt dagegen noch mitten in dem Bereich, der zur Zieldatei gehören soll. Es müßten aber die letzten 5 Sekunden der zu erzeugenden Zieldatei sein.
Welche sox Version?
14.3.2
MfG
Auf jeden Fall hast Du schon mal sinnvolle Fragen gestellt, die zeigen, daß Du mir helfen willst. Danke dafür, möge es nutzen.
Gruß
Feuerrabe-2