Forum: Mikrocontroller und Digitale Elektronik Spieldauer von WAV Files ermitteln


von wavwav (Gast)


Lesenswert?

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)

von Benedikt K. (benedikt)


Lesenswert?

Datei öffnen, Header lesen, fertig. Beschreibung des Headers -> google. 
Oder wolltest du etwas anderes wissen ?

von wavwav (Gast)


Lesenswert?

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.

von Benedikt K. (benedikt)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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 ...

von HildeK (Gast)


Lesenswert?

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
                };

von wavwav (Gast)


Lesenswert?

" 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.

von Fred S. (Gast)


Lesenswert?

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

von Torsten F. (tnetwork)


Lesenswert?

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.

von Benedikt K. (benedikt)


Lesenswert?

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.

von Christian Erker (Gast)


Lesenswert?

>" 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
Noch kein Account? Hier anmelden.