AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

WAV File Info?

Ein Thema von PeterPanino · begonnen am 17. Sep 2022 · letzter Beitrag vom 17. Sep 2022
Antwort Antwort
Seite 1 von 2  1 2   
PeterPanino

Registriert seit: 4. Sep 2004
1.442 Beiträge
 
Delphi 10.4 Sydney
 
#1

WAV File Info?

  Alt 17. Sep 2022, 00:39
Hallo, kennt jemand eine Unit, mit der man grundlegende Informationen aus einer .WAV Datei extrahieren kann:

- Dauer (Spieldauer)
- Channels (Mono/Stereo)
- Sample-Rate
- Bits per Sample

Zur Präzisierung: Ich möchte die Datei nicht abspielen, sondern nur die obigen Informationen der .WAV Datei erhalten.

Ich habe jetzt eine Zeit lang recherchiert und experimentiert. Die Vielfalt bei .WAV Dateien scheint in der Praxis doch größer zu sein, als ich anfangs dachte. Aber vielleicht hat ja jemand einen Code, der funktioniert.
Geändert von PeterPanino, damit der Platz auf dem Bildschirm nicht so leer aussieht.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: WAV File Info?

  Alt 17. Sep 2022, 01:37
Suche mal nach AudioWerkzeugeBibliothek von Gausi.
Da gibt es die WavFiles.pas dort dürfte eigentlich alles übergeben werden.

Delphi-Quellcode:
    Twavfile = class(TBaseAudioFile)
        private
            procedure fResetData;
        protected
            function fGetFileSize : Int64; override;
            function fGetDuration : Integer; override;
            function fGetBitrate : Integer; override;
            function fGetSamplerate : Integer; override;
            function fGetChannels : Integer; override;
            function fGetValid : Boolean; override;

            procedure fSetTitle (aValue: UnicodeString); override;
            procedure fSetArtist (aValue: UnicodeString); override;
            procedure fSetAlbum (aValue: UnicodeString); override;
            procedure fSetYear (aValue: UnicodeString); override;
            procedure fSetTrack (aValue: UnicodeString); override;
            procedure fSetGenre (aValue: UnicodeString); override;

            function fGetTitle : UnicodeString; override;
            function fGetArtist : UnicodeString; override;
            function fGetAlbum : UnicodeString; override;
            function fGetYear : UnicodeString; override;
            function fGetTrack : UnicodeString; override;
            function fGetGenre : UnicodeString; override;

        public
            { Public declarations }
            constructor Create;
            function ReadFromFile(aFilename: UnicodeString): TAudioError; override;
            function WriteToFile(aFilename: UnicodeString): TAudioError; override;
            function RemoveFromFile(aFilename: UnicodeString): TAudioError; override;
        end;

Geändert von venice2 (17. Sep 2022 um 04:25 Uhr)
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.442 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: WAV File Info?

  Alt 17. Sep 2022, 01:58
Vielen Dank, aber ich kann deinen Code nicht nachvollziehen, da die Klasse Twavfile unvollstänig ist. Hast du einen Link zur vollständigen Klasse?
Geändert von PeterPanino, damit der Platz auf dem Bildschirm nicht so leer aussieht.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

AW: WAV File Info?

  Alt 17. Sep 2022, 02:03
Vielen Dank, aber ich kann deinen Code nicht nachvollziehen, da die Klasse Twavfile unvollstänig ist. Hast du einen Link zur vollständigen Klasse?
Dachte eigentlich hätte dir entsprechende Infos gegeben..
Zitat:
Suche mal nach AudioWerkzeugeBibliothek von Gausi.
Aber gut hier!
https://www.delphipraxis.net/1456247-post5.html
Falls du den Link nicht findest.. dann hier
https://github.com/DanielGausi/AudioWerkzeugeBibliothek
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.442 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: WAV File Info?

  Alt 17. Sep 2022, 02:04
Ich habe hier die Unit W32Waves gefunden (die schon etwas älter zu sein scheint):

https://www.swissdelphicenter.com/en...ode.php?id=692

Ich habe daraus die angehängte Demo gemacht. Diese crasht aber in der Zeile 90 mit einer Access Violation:

FillChar(Info^, SizeOf(TWaveInformation), #0); { Initialize first } Kann man einfach für einen Record (TWaveInformation) eine Reihe von Null-Bytes in den Speicher schreiben, ohne vorher einen entsprechenden Speicher zu reservieren? Oder wieso gibt es hier sonst eine Access Violation?

Test.zip
Geändert von PeterPanino, damit der Platz auf dem Bildschirm nicht so leer aussieht.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: WAV File Info?

  Alt 17. Sep 2022, 02:04
Ich habe hier die Unit W32Waves gefunden (die schon etwas älter zu sein scheint):

https://www.swissdelphicenter.com/en...ode.php?id=692

Ich habe daraus die angehängte Demo gemacht. Diese crasht aber in der Zeile 90 mit einer Access Violation:

FillChar(Info^, SizeOf(TWaveInformation), #0); { Initialize first } Kann man einfach für einen Record (TWaveInformation) eine Reihe von Null-Bytes in den Speicher schreiben, ohne vorher einen entsprechenden Speicher zu reservieren? Oder wieso gibt es hier sonst eine Access Violation?

Anhang 55386
Nochmal!
https://github.com/DanielGausi/AudioWerkzeugeBibliothek
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.442 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: WAV File Info?

  Alt 17. Sep 2022, 02:45
[/quote]

Du brauchst nicht NOCHMAL den Link einzufügen. Ich habe es schon längst von github heruntergeladen und ausprobiert:

Die Länge liest er offenbar ein, auch wenn bei WAV Dateien, die unter einer Sekunde Dauer haben, diese auf 0 (!) abgerundet wird.

Und Die Samplerate hat mit der akustischen Schwingungs-Frequenz-Einheit HZ nichts zu tun. Aber die anderen Werte liest er offenbar korrekt ein.

PS: Trotzdem wäre ich neugierig, wieso bei FillChar eine Access Violation erfolgt.
Geändert von PeterPanino, damit der Platz auf dem Bildschirm nicht so leer aussieht.

Geändert von PeterPanino (17. Sep 2022 um 02:51 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#8

AW: WAV File Info?

  Alt 17. Sep 2022, 03:52
Zitat:
PS: Trotzdem wäre ich neugierig, wieso bei FillChar eine Access Violation erfolgt.
Sorry man sollte schon wissen was man tut.

1. Variable ist falsch
Delphi-Quellcode:
var
  WavInfo: W32Waves.PWaveInformation;
WavInfo ist definitiv nicht initialisiert.
Daher..
Delphi-Quellcode:
var
  WavInfo: W32Waves.TWaveInformation;
2. Aufruf ändern
if W32Waves.GetWaveInformationFromFile(PChar(Trim(Edit.Text)), WavInfo) then
zu
if W32Waves.GetWaveInformationFromFile(PChar(Trim(Edit.Text)), @WavInfo) then

3. Diese Funktion ändern
function GetWaveInformationFromFile(const aFileName: AnsiString; Info: pWaveInformation): Winapi.Windows.Bool;
zu
function GetWaveInformationFromFile(const aFileName: PWideChar; Info: pWaveInformation): Winapi.Windows.Bool;
abschließend
hdmmio := Winapi.MMSystem.mmioOpen(PChar(aFileName), nil, Winapi.MMSystem.MMIO_READ);;
zu
hdmmio := Winapi.MMSystem.mmioOpen(aFileName, nil, Winapi.MMSystem.MMIO_READ);
Zitat:
Oder wieso gibt es hier sonst eine Access Violation?
Weil WavInfo vorher nicht initialisiert wurde.

Fazit:
Ja auch Debuggen ist mit unter eine Kunst!

Geändert von venice2 (17. Sep 2022 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
844 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: WAV File Info?

  Alt 17. Sep 2022, 08:17
Die Länge liest er offenbar ein, auch wenn bei WAV Dateien, die unter einer Sekunde Dauer haben, diese auf 0 (!) abgerundet wird.

Und Die Samplerate hat mit der akustischen Schwingungs-Frequenz-Einheit HZ nichts zu tun. Aber die anderen Werte liest er offenbar korrekt ein.
Die Länge wird in dieser Unit (bzw. für alle Formate dort) in Sekunden ausgegeben. Wenn du genauere Angaben brauchst, musst du die Zeile
fDuration := dataSize DIV BytesPerSec ersetzen durch fDuration := Round(1000 * dataSize / BytesPerSec) . Dann hast du die Länge in Millisekunden. Wenn dich das Round dort auch noch stört, musst du den Typ ändern auf einen Float-Typen.

In welcher Einheit wird denn die Samplerate sonst gemessen, bzw. was ist das dann anderes als die Anzahl der Samples pro Sekunde (oder SamplesPerSec)? Da ist mein Code mit dem von SwissDelphiCenter ja auch identisch, nur lesen die einen Datenblock als Record ein, und ich mache das dort einzeln. Wobei ich diesen Teil damals vermutlich eh aus den alten ATLs (AudioToolsLibrary) übernommen habe. Die waren ganz gut, nur sollte man damit keine ID3Tags schreiben. Das Konzept nahm nämlich massiven Datenverlust in Kauf - aber das ist ja ein anderes Thema ...
The angels have the phone box.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.442 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: WAV File Info?

  Alt 17. Sep 2022, 11:23
Zitat:
Ja auch Debuggen ist mit unter eine Kunst!
Danke für das Debuggen desCodes. Ich ziehe meinen Hut vor dem Debug-Künstler.

Danke an @Gausi für die AudioWerkzeugeBibliothek (v2.0) mit der ID3Tags-Fähigkeit. Respekt!
Geändert von PeterPanino, damit der Platz auf dem Bildschirm nicht so leer aussieht.

Geändert von PeterPanino (17. Sep 2022 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz