wav zu flac konvertieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
curt123
Beiträge: 704
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

wav zu flac konvertieren

Beitrag von curt123 » 17.10.2021 18:02:33

Hallo,

ich möchte in verschiedenen Unterverzeichnissen (z.B. von '/media/backup/musik_f') vorhandene wav-Dateien umwandeln.

Zusätzlich noch vorhandene *.tags (für foobar und externe Tags) anpassen. Vorsorglich möchte ich die wav-Dateien nicht sofort bzw. zugleich löschen. Der folgende Code scheint in einem Testverzeichnis mit wenigen Dateien zu funktionieren:

Code: Alles auswählen

for h in $(find . -type d)
 do 
  cd "$h" 
  for i in *.wav
   do 
    if [ ! -f "${i%.*}.flac" ]
     then ffmpeg -i "$i" -c:a flac "${i%.*}.flac"
    fi
    sed -i -e "s/.wav/.flac/g" "${i%.*}.tags";
   done
  cd /media/backup/musik_f
 done
Nun habe ich einmal die Frage, ob der Parameter -c:a (Zeile 7) etwas wie "codec auto" bedeutet und eigentlich unnötig ist, und Audio-Eigenschaften wie bit etc. sowieso nicht geändert werden.

Und, ob ich doch noch irgendeine Fehlerbehandlung (etwa für leere Verzeichnisse) brauche und ob das so auch mit vielen Dateien bzw. langer Laufzeit klappen sollte.

Danke schonmal.

DeletedUserReAsG

Re: wav zu flac konvertieren

Beitrag von DeletedUserReAsG » 17.10.2021 18:32:57

curt123 hat geschrieben: ↑ zum Beitrag ↑
17.10.2021 18:02:33
Nun habe ich einmal die Frage, ob der Parameter -c:a (Zeile 7) etwas wie "codec auto" bedeutet und eigentlich unnötig ist, und Audio-Eigenschaften wie bit etc. sowieso nicht geändert werden.
-c:a … gibt den Audiocodec an, und ist nicht unnötig – schließlich willst du ja flac haben, oder? Das Gegenstück wäre -c:v … für den Videocodec, wenn du Videos bearbeitest. Diese Informationen finden sich übrigens auch in der durchsuchbaren Bedienungsanleitung, aka Manpage.

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: wav zu flac konvertieren

Beitrag von tobo » 17.10.2021 18:52:37

curt123 hat geschrieben: ↑ zum Beitrag ↑
17.10.2021 18:02:33
Und, ob ich doch noch irgendeine Fehlerbehandlung (etwa für leere Verzeichnisse) brauche [...].
Leeres Verzeichnis, keine Flac-Datei, Leerzeichen usw. - alles was du über das Handling nicht beachtest und wie man es richtig angeht, gibt's hier unter Punkt 1:
https://mywiki.wooledge.org/BashPitfalls

curt123
Beiträge: 704
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

Re: wav zu flac konvertieren

Beitrag von curt123 » 17.10.2021 18:56:58

niemand hat geschrieben: ↑ zum Beitrag ↑
17.10.2021 18:32:57
-c:a … gibt den Audiocodec an, und ist nicht unnötig – schließlich willst du ja flac haben, oder? Das Gegenstück wäre -c:v … für den Videocodec, wenn du Videos bearbeitest. Diese Informationen finden sich übrigens auch in der durchsuchbaren Bedienungsanleitung, aka Manpage.
Ok, danke. Das Programm könnte sich ja womöglich ohne Vorgaben einfach möglichst nah am Input, also z.B. Audio-File, orientieren. Ansonsten konnte ich die Infos nicht, auch nicht per Manpage, wirklich "sauber" finden, sondern das "c:a" im Beispielcode.

curt123
Beiträge: 704
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

Re: wav zu flac konvertieren

Beitrag von curt123 » 17.10.2021 19:29:34

tobo hat geschrieben: ↑ zum Beitrag ↑
17.10.2021 18:52:37
gibt's hier unter Punkt 1:
https://mywiki.wooledge.org/BashPitfalls
Danke, aber ich sehe noch nicht, wo das richtig passen könnte. Die Verzeichnisse in "$h" übernommen reicht nicht? Vielleicht das '.'-Verzeichnis.
Dateinamen mit Leerzeichen klappen wohl auch - aber ich schau mir das am morgen nochmal etwas ausgeschlafener an.

Und die denkbare Meldung wegen womöglich fehlender *.tags im jeweiligen Verzeichnis würde wohl immerhin keinen Abbruch oder sonstigen Fehler verursachen (es wäre mit Verzeichnisangabe evtl. informativ):

Code: Alles auswählen

sed: test2.tags kann nicht gelesen werden: Datei oder Verzeichnis nicht gefunden
Nachtrag: schonmal [ -e "$file" ] || continue

Code: Alles auswählen

for h in $(find . -type d)
 do 
  cd "$h" 
  for i in *.wav
   do 
    [ -e "$i" ] || continue
    if [ ! -f "${i%.*}.flac" ]
     then ffmpeg -i "$i" -c:a flac "${i%.*}.flac"
    fi
    sed -i -e "s/.wav/.flac/g" "${i%.*}.tags"
   done
  cd /media/backup/musik_f
 done

MaGe
Beiträge: 1796
Registriert: 01.06.2014 17:12:16

Re: wav zu flac konvertieren

Beitrag von MaGe » 17.10.2021 20:00:31

curt123 hat geschrieben: Nun habe ich einmal die Frage, ob der Parameter -c:a (Zeile 7) etwas wie "codec auto" bedeutet und eigentlich unnötig ist,
Probiere und finde es doch raus, einmal mit -c:a flac :wink:

Code: Alles auswählen

 ffmpeg -i input-file.wav -c:a flac output-file.flac 
einmal ohne

Code: Alles auswählen

 ffmpeg -i input-file.wav output-file.flac 


gruss MaGe
Wir müssen uns vor der Klimaerwärmung nicht fürchten.
Uns rottet die soziale Kälte viel früher aus.

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: wav zu flac konvertieren

Beitrag von tobo » 17.10.2021 20:48:04

curt123 hat geschrieben: ↑ zum Beitrag ↑
17.10.2021 19:29:34
Nachtrag: schonmal [ -e "$file" ] || continue
Ich weiß ja nicht wie weit du schon gelesen hast, aber ich würde mich erstmal auf deine erste Zeile konzentrieren, welche unter dem ersten Punkt im Link, dort im ersten Quelltextabschnitt behandelt ist und wegen allen möglichen dort aufgeführten Problemen scheitern kann.

curt123
Beiträge: 704
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

Re: wav zu flac konvertieren

Beitrag von curt123 » 17.10.2021 22:00:04

tobo hat geschrieben: ↑ zum Beitrag ↑
17.10.2021 20:48:04
[ich würde mich erstmal auf deine erste Zeile konzentrieren, welche unter dem ersten Punkt im Link, dort im ersten Quelltextabschnitt behandelt ist und wegen allen möglichen dort aufgeführten Problemen scheitern kann.
Doch die Leerzeichen, danke. Das kommt mir zunächst nicht so elegant vor, erfüllt aber evtl. eher die Anforderungen:

Code: Alles auswählen

find . -type d | while read h 
 do 
  cd "$h" 
  for i in *.wav
   do 
    [ -e "$i" ] || continue
    if [ ! -f "${i%.*}.flac" ]
     then ffmpeg -i "$i" "${i%.*}.flac"
    fi
    sed -i -e "s/.wav/.flac/g" "${i%.*}.tags"
   done
  cd /media/backup/musik_f
 done
MaGe hat geschrieben: ↑ zum Beitrag ↑
17.10.2021 20:00:31
einmal ohne

Code: Alles auswählen

 ffmpeg -i input-file.wav output-file.flac 
Danke, das reicht offenbar. Vielleicht noch mit -loglevel etwas einschränken.

wanne
Moderator
Beiträge: 7545
Registriert: 24.05.2010 12:39:42

Re: wav zu flac konvertieren

Beitrag von wanne » 18.10.2021 00:18:53

Von der Idee her fürs nächste mal:
find . -type f -iname "*wav" und dann einfach immer die Ordner mit mkdir -p anlegen ist deutlich einfacher als in der bash mit allen möglichen Sonderzeichen durch den Baum zu iterieren. Aber jetzt tut ja schon die Variante.
Das Programm könnte sich ja womöglich ohne Vorgaben einfach möglichst nah am Input, also z.B. Audio-File, orientieren.
Das Programm orientiert sich am Ausgabeformat, dass sich an der Dateiendung Orientiert. Bei .flac ist das sehr eindeutig und entsprechend kannst du das -c:a flac (Das gehört zusammen!) weg lassen.
rot: Moderator wanne spricht, default: User wanne spricht.

curt123
Beiträge: 704
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

Re: wav zu flac konvertieren

Beitrag von curt123 » 18.10.2021 18:59:03

wanne hat geschrieben: ↑ zum Beitrag ↑
18.10.2021 00:18:53
Das Programm orientiert sich am Ausgabeformat, dass sich an der Dateiendung Orientiert. Bei .flac ist das sehr eindeutig und entsprechend kannst du das -c:a flac (Das gehört zusammen!) weg lassen.
Ok. Aber so ganz puristisch ohne -i geht es offenbar auch nicht.
Von der Idee her fürs nächste mal:
find . -type f -iname "*wav" und dann einfach immer die Ordner mit mkdir -p anlegen ist deutlich einfacher als in der bash mit allen möglichen Sonderzeichen durch den Baum zu iterieren. Aber jetzt tut ja schon die Variante.
Wie würde das dann gehen? mkdir -p (--parents) soll in dem Fall Pfad/Verzeichnisse zu der jeweiligen Datei, da bereits vorhanden, nicht erzeugen, aber dennoch darstellen bzw. ausgeben?

curt123
Beiträge: 704
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

Re: wav zu flac konvertieren

Beitrag von curt123 » 19.10.2021 14:02:33

Nun habe ich den Code bei einer größeren Dateimenge probiert und einige Probleme und ggf. Defizite beobachtet:

- fehlende sinnvolle Fehlerausgabe in eine Textdatei, betrifft vermutlich besonders ffmpeg, evtl. auch fehlende Details in der bash-history.
- fehlende Errorlevel (besonders ffmpeg) o.ä. im Ablauf?
- fehlende Bedingung vor einer Konvertierung, Abfrage der jeweiligen wav-Eigenschaften, besonders vmtl. bit (36 bit?, 36 bit float), womöglich etwas für ffprobe?
- fehlende Erfolgskontrolle wie grober Größenvergleich und/oder exakter Vergleich (evtl. ffprobe) der Laufzeiten von flac und wav.
- Kontrolle nötig vor Änderung der separaten tag-Dateien, das wäre auch vor einer Löschung der abgearbeiteten wav-Dateien nötig.
- fehlende Ausgabe über Fortschritt; evtl. bearbeitete Verzeichnisse hochzählen und/oder in Pfade in Protokoll ausgeben.
- evtl. Probleme durch parallele (oder ähnlich wirkende) Verarbeitung des Codes (bash, Schleifen) oder fehlende Kontrollen, ein Fehler oder Abbruch bedeutet ggf. mehrere fehlerhafte flac-Dateien statt nur einer.

Nachtrag:

Code: Alles auswählen

ffprobe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$file"
klappt schonmal bei wav und flac

Mit stream=bit_rate bekomme ich bei üblichen wav-Dateien 1411200, was wohl 16 entspricht: 44100 * 16 * 2 = 1411200 bps .
Bei höher auflösenden z.B. 307200, entspr. 48000 * 32 * 2

Antworten