Ich suche eine Möglichkeit die Spieldauer von WAV Files einfach zu ermitteln. Für ein Projekt mit Sprachmodul habe ich hunderte von kurzen WAV Files, die möglichst in ein 250ms Raster passen müssen. Zur Überprüfung welche Files ich schneller/langsamer sprechen oder kürzen muss, suche ich ein Tool das mir einfach die Spieldauer in ms anzeigt. Momentan kann ich die Länge nur sehen wenn ich jedes einzelne File lade und markiere. Das Tool Audioshell versagt leider bei WAV files seine Dienst was die Länge angeht. Wäre ideal gewesen. Hat jemand eine Idee dazu ? (für die Schaumeier, gegoogelt habe ich schon ausgiebig)
Datei öffnen, Header lesen, fertig. Beschreibung des Headers -> google. Oder wolltest du etwas anderes wissen ?
Da lade ich lieber 200 files , als dass ich bei 200 Files mir den Header anschaue. Ich bin mir nicht sicher ob man überhaupt dort die Spielzeit findet. Das ist nicht praktikabel , es muss eine ander Lösung geben.
wavwav wrote:
> Ich bin mir nicht sicher ob man überhaupt dort die Spielzeit findet.
Darin findet man die Dateigröße, Samples pro Sekunde und Bytes pro
Sample. Damit kann man die Länge berechnen.
Und genau das ist die einzig korrekte Vorgehensweise. Natürlich sollst nicht Du Dir selbst mit 'nem Hex-Editor den Header anschauen, sondern ein Programm das machen lassen, aber genau so gehts.
Im Header ist vermerkt: - die Zahl der Kanäle - die Abtastrate - die Bits per Channel - die Anzahl Samples und noch manches andere. Kleines C-Programm (Pascal, Python ....) mit Wildcard-Aufruf *.wav, den Header lesen, rechnen und ausgeben. Einfacher gehts doch nicht ...
Ich war wohl zu langsam ... deshalb hier der Header eines C-Progs. Ich hab allerdings nicht alles erforscht - es blieben ein paar Fragezeichen.
1 | #define DWORD unsigned long
|
2 | #define WORD unsigned int
|
3 | #define BYTE unsigned char
|
4 | |
5 | struct WaveHdr1_t |
6 | {
|
7 | char cRIFF[4]; // = "RIFF"; 4 Byte |
8 | DWORD lP; // = 0x00000050; 4 Byte |
9 | char cWaveFmt[8]; // = "WAVEfmt "; 8 Byte |
10 | DWORD lUnknown1; // = 0x00000010; 4 Byte |
11 | WORD wFormatTag; // = 0x0001; 2 B |
12 | WORD wChannels; // 2 B |
13 | DWORD lSampleRate; // 4 B |
14 | DWORD lAvgBytePerSecond; // 4 B |
15 | WORD wBlockSize; // 2 B |
16 | WORD wBitPerChannel; // 2 B |
17 | char cData[4]; // = "data"; 4 B // hier koennte auch was anderes stehen!?!? |
18 | DWORD lCountOfSamples; // 4 B // und dann ist das Format hier falsch! |
19 | }; // Summe: 44 Byte |
20 | |
21 | struct WaveHdr2_t // Header Teil2, der gebraucht wird, wenn in Hdr1 in cData != "data" steht |
22 | {
|
23 | DWORD lUnknown2; // 4 B |
24 | char cData[4]; // = "data"; 4 B |
25 | DWORD lCountOfSamples; // 4 B |
26 | };
|
27 | |
28 | struct Wave16Stereo |
29 | {
|
30 | int LeftChannel; |
31 | int RightChannel; |
32 | };
|
33 | |
34 | struct Wave8Stereo |
35 | {
|
36 | BYTE cLeftChannel; |
37 | BYTE cRightChannel; |
38 | };
|
39 | |
40 | struct WaveHdr1_t sWaveHdr = { |
41 | "RIFF", |
42 | 0x00000050, |
43 | "WAVEfmt ", |
44 | 0x00000010, |
45 | 0x0001, |
46 | 0,0L,0L,0,0, |
47 | "data"
|
48 | };
|
" Einfacher gehts doch nicht ..." Für euch vielleicht. Bitte nicht vergessen, dass es auch andere Leute gibt die noch nie in C , Pascal, Phyton ... ein Programm für den PC geschrieben und auch die Tools gar nicht dazu haben. Für mich kommt deshalb nur was fertiges in Frage. Danke trotzdem für die Tipps, wenn mir so auch nichts nutzen. Ich suche weiter.
Hi, > Für mich kommt deshalb nur was fertiges in Frage. Hier ein entsprechender Source Code in Basic; vielleicht kann Dir den ja jemand kompilieren (ich nicht -- benutze nur Assembler und C) und nötigenfalls so anpassen, dass nicht nur d:\tmp.wav gelesen wird. Alternativ zu einer solchen Anpassung könnte man sich eine Batch-Datei schreiben, die die wav-Dateien einzeln in d:\tmp.wav kopiert und dann das Programm laufen lässt: http://www.xtremevbtalk.com/showthread.php?t=230979 Gruß Fred
Wenn alle deine Waves die Gleichen Parameter (Kanäle, Samplerate,etc) haben, dann müsstest du ohne großartiges Header-Asulesen an die Zeiten kommen: Dateigröße= Headergröße + Zeit x Audiodaten der Header ist immer Gleich groß und die Audiodaten je Zeiteinheit ebenfalls. Erstell (mit z.B. Cooledit) einfach mal eine Leere Wavedatei (damit bekommst du die Größe des Headers) und eine Wavedatei mit genau 1sec.(Dateigröße - Headergröße =Größe Audiodaten pro Sekunde). dann machst du ein dir [Dein Verzeicheichnis]\*.wav > MeineWaves.txt Öffnest die Textdatei mit excel, und mit den Ermittelten daten hast du in 5 minuten alle Längen ausgerechnet.
Torsten F. wrote: > Erstell (mit z.B. Cooledit) einfach mal eine Leere Wavedatei (damit > bekommst du die Größe des Headers) und eine Wavedatei mit genau > 1sec.(Dateigröße - Headergröße =Größe Audiodaten pro Sekunde). Der Header ist immer exakt 44 Bytes groß. Es gibt aber noch ein anderes Problem: Am Ende der Wave Datei steht manchmal noch sowas ähnliches wie ein ID3 Tag drin. Da bin ich am Ende auch drauf reingefallen.
>" Einfacher gehts doch nicht ..." >Für euch vielleicht. Bitte nicht vergessen, dass es auch andere Leute >gibt die noch nie in C , Pascal, Phyton ... ein Programm für den PC >geschrieben und auch die Tools gar nicht dazu haben. Ist doch ein gutes Argument damit anzufangen. Solang du keine Klicki-Bunti Oberfläche willst sondern eine Textausgabe reicht ist das keine große Sache. Solltest in ein paar Tagen hinbekommen, selbst als Neuling. Hast du schon grundsätzlich Programmiererfahrung (wo auch immer) handelt es sich eher um wenige Stunden. Wenn die WAV Files immer das selbe Format haben brauchst du übrigens nur die Zahl der Samples lesen und mit einem festen Faktor multiplizieren. Gruß, Christian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.