mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Spieldauer von WAV Files ermitteln


Autor: wavwav (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: wavwav (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich war wohl zu langsam ... deshalb hier der Header eines C-Progs. Ich 
hab allerdings nicht alles erforscht - es blieben ein paar Fragezeichen.
#define DWORD unsigned long
#define WORD  unsigned int
#define BYTE  unsigned char 

struct WaveHdr1_t          
  {
    char cRIFF[4];            // = "RIFF";        4 Byte
    DWORD lP;                 // = 0x00000050;    4 Byte
    char  cWaveFmt[8];        // = "WAVEfmt ";    8 Byte
    DWORD lUnknown1;          // = 0x00000010;    4 Byte
    WORD  wFormatTag;         // = 0x0001;        2 B
    WORD  wChannels;          //                  2 B
    DWORD lSampleRate;        //                  4 B
    DWORD lAvgBytePerSecond;  //                  4 B
    WORD  wBlockSize;         //                  2 B
    WORD  wBitPerChannel;     //                  2 B
    char  cData[4];           // = "data";        4 B   // hier koennte auch was anderes stehen!?!?
    DWORD lCountOfSamples;    //                  4 B   // und dann ist das Format hier falsch!
  };                          // Summe:          44 Byte

struct WaveHdr2_t          // Header Teil2, der gebraucht wird, wenn in Hdr1 in cData != "data" steht
  {
    DWORD lUnknown2;          //                  4 B
    char  cData[4];           // = "data";        4 B   
    DWORD lCountOfSamples;    //                  4 B   
  };

struct Wave16Stereo
  {
    int LeftChannel;
    int RightChannel;
  };

struct Wave8Stereo
  {
    BYTE cLeftChannel;
    BYTE cRightChannel;
  };
  
struct WaveHdr1_t sWaveHdr = {
                "RIFF",
                0x00000050,
                "WAVEfmt ",
                0x00000010,
                0x0001,
                0,0L,0L,0,0,
                "data"
                };            



Autor: wavwav (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Torsten F. (tnetwork)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Erker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.