andre-xs
Goto Top

Länge von wav-Dateien (in ms) per Batch ermitteln (und speichern)

Hallo Allerseits,
im Rahmen eines Forschungsprojekts haben wir ca. 350 wav-Dateien, die alle zwischen ca. 0.5 und 5 s lang sind. Jetzt bräuchten wir für jede Datei die Länge, idealerweise mit einer Genauigkeit von Millisekunden (es muss nicht ms-genau sein, aber die Sekunden-Angabe vom Windows Explorer reicht nicht. Zehntel oder hundertstel Sekunden reichen auch).

Idealerweise hätten wir ein kleines (externes/internes) Tool welches man in einem kleinen wrapper-script auf der Kommandozeile laufen lassen kann. Es würde vollkommen reichen wenn es dann auf der Kommandozeile eine Ausgabe des Wertes mit Dateinamen gibt, sowas wie:
Datei1.wav 3465
Datei2.wav 586
etc.
Das könnten wir dann in eine Textdatei umleiten und in Excel importieren.

Ich bin leider sehr unbedarft im scripten, habe früher mal ein bissl mit DOS Batch Dateien gemacht face-smile

Viele Grüsse,
Andre

Content-ID: 593259

Url: https://administrator.de/contentid/593259

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

tomolpi
tomolpi 03.08.2020 um 14:31:11 Uhr
Goto Top
Hallo,

muss es Batch sein?

Ansonsten würde ich sowas schnell mit Python zusammenbauen: https://stackoverflow.com/questions/7833807/get-wav-file-length-or-durat ...
CSV Export ist dann nur noch ein Klacks.

Grüße

tomolpi
colinardo
Lösung colinardo 03.08.2020 aktualisiert um 15:20:17 Uhr
Goto Top
Servus.
Schnell mit der Powershell und Bordmitteln direkt in eine CSV exportiert
# Ausgabedatei 
$csv = 'D:\ausgabe.csv'  
# Ordner mit den *.WAV
$ordner = 'D:\Lieder'  
# shell object erstellen
$shell = New-Object -Com Shell.Application
# Dateien auslesen und in CSV exportieren
ls $ordner -File -Filter *.wav | select Fullname,@{n='Dauer(ms)';e={[timespan]::FromTicks($shell.NameSpace((split-path $_.Fullname -Parent)).ParseName((Split-Path $_.Fullname -Leaf)).ExtendedProperty('{64440490-4C8B-11D1-8B70-080036B11A03} 3')).TotalMilliseconds}} | export-csv $csv -Delimiter ";" -NoType -Encoding UTF8  
# csv öffnen
start $csv
Kann man natürlich auch als Batch schreiben wenn man unbedingt will
@echo off & setlocal
set "csv=D:\ausgabe.csv"  
set "ordner=D:\Lieder"  
powershell -EP Bypass -C "$shell = New-Object -Com Shell.Application;ls '%ordner%' -File -Filter *.wav | select Fullname,@{n='Dauer(ms)';e={[timespan]::FromTicks($shell.NameSpace((split-path $_.Fullname -Parent)).ParseName((Split-Path $_.Fullname -Leaf)).ExtendedProperty('{64440490-4C8B-11D1-8B70-080036B11A03} 3')).TotalMilliSeconds}} | export-csv '%csv%' -Delimiter ';' -NoType -Encoding UTF8"  

aber die Sekunden-Angabe vom Windows Explorer reicht nicht.
Reichen dir 100ns Intervalle face-wink?

Grüße Uwe
godlie
godlie 03.08.2020 um 15:08:45 Uhr
Goto Top
Hallo,

das ganze lässt sich mit sox recht leicht realisieren in der win32Zip ist sogar eine Beispiel batch drin.

Du wirst aber eher soxi /D für die Ausgabe in Sekunden benötigen.
andre-xs
andre-xs 03.08.2020 aktualisiert um 15:24:34 Uhr
Goto Top
Vielen Dank, funktioniert perfekt so wie ich es gebraucht habe.

Nur eine (wahrscheinlich blöde Frage): Das funktioniert nur, wenn ich es Zeile für Zeile eingebe. Ich brauch's nicht oft, ist also vollkommen ok so. Aber ich hatte auch probiert es einfach in eine Textdatei zu kopieren und die dann zu starten (ohne Endung und mit Endung ".bat"), aber dann kommt eine Fehlermeldung:
Program 'Durations' failed to run: No application is associated with ...

Ahh, habe jetzt auch das Batch-Script gesehen, damit funktionierts auch als Datei-Aufruf. Danke!
colinardo
colinardo 03.08.2020 aktualisiert um 15:25:30 Uhr
Goto Top
Zitat von @andre-xs:
Nur eine (wahrscheinlich blöde Frage): Das funktioniert nur, wenn ich es Zeile für Zeile eingebe.
Nein läuft problemlos als Script (*.ps1) (Variante1), Variante 2 ist Batch.
Ich brauch's nicht oft, ist also vollkommen ok so. Aber ich hatte auch probiert es einfach in eine Textdatei zu kopieren und die dann zu starten (ohne Endung und mit Endung ".bat"), aber dann kommt eine Fehlermeldung:
Das erste ist Powershell keine *.bat oder *.cmd face-wink
colinardo
colinardo 03.08.2020 aktualisiert um 15:26:45 Uhr
Goto Top
Ahh, habe jetzt auch das Batch-Script gesehen, damit funktionierts auch als Datei-Aufruf. Danke!
Das erste selbstredend auch ist eben nur Powershell (*.ps1) und kein Batch face-smile.
andre-xs
andre-xs 03.08.2020 um 15:26:22 Uhr
Goto Top
Keine Ahnung wie ich ein Powershell Script erstelle, Zeile für Zeile hat's funktioniert und jetzt klappt's auch mit der .bat Datei. Mehr brauch ich nicht face-smile
colinardo
colinardo 03.08.2020 aktualisiert um 15:28:55 Uhr
Goto Top
Zitat von @andre-xs:

Keine Ahnung wie ich ein Powershell Script erstelle,
Hast du wohl die Executionpolicy nicht angepasst face-smile ...
https://www.heise.de/tipps-tricks/Windows-Powershell-Skript-ausfuehren-4 ...

Mehr brauch ich nicht
Na dann viel Spaß.

Grüße Uwe
andre-xs
andre-xs 03.08.2020 aktualisiert um 15:29:10 Uhr
Goto Top
Die Endung ".ps1" kannte ich nicht, damit klappts dann auch (na ja, theoretisch, jetzt kommt dass "running scripts is disabled on this system"). Die Diskussion jetzt ist mehr für meine eigene Neugier, denn es klappt ja jetzt via Batch script face-smile
colinardo
colinardo 03.08.2020 aktualisiert um 15:32:28 Uhr
Goto Top
Zitat von @andre-xs:

Die Endung ".ps1" kannte ich nicht, damit klappts dann auch (na ja, theoretisch, jetzt kommt dass "running scripts is disabled on this system").
s. Link. oben zur Executionpolicy , den Abschnitt Wie kann ich mein selbstgeschriebenes Skript dennoch über die Konsole ausführen?...
Einmalig in einer elevated PS Konsole
Set-ExecutionPolicy RemoteSigned -Force