![]() |
WAV File Info?
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. |
AW: WAV File Info?
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; |
AW: WAV File Info?
Vielen Dank, aber ich kann deinen Code nicht nachvollziehen, da die Klasse Twavfile unvollstänig ist. Hast du einen Link zur vollständigen Klasse?
|
AW: WAV File Info?
Zitat:
Zitat:
![]() Falls du den Link nicht findest.. dann hier ![]() |
AW: WAV File Info?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe hier die Unit W32Waves gefunden (die schon etwas älter zu sein scheint):
![]() Ich habe daraus die angehängte Demo gemacht. Diese crasht aber in der Zeile 90 mit einer Access Violation:
Delphi-Quellcode:
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?
FillChar(Info^, SizeOf(TWaveInformation), #0); { Initialize first }
Anhang 55386 |
AW: WAV File Info?
Zitat:
![]() |
AW: WAV File Info?
Zitat:
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. |
AW: WAV File Info?
Zitat:
1. Variable ist falsch
Delphi-Quellcode:
WavInfo ist definitiv nicht initialisiert.
var
WavInfo: W32Waves.PWaveInformation; Daher..
Delphi-Quellcode:
2. Aufruf ändern
var
WavInfo: W32Waves.TWaveInformation;
Delphi-Quellcode:
if W32Waves.GetWaveInformationFromFile(PChar(Trim(Edit.Text)), WavInfo) then
zu
Delphi-Quellcode:
if W32Waves.GetWaveInformationFromFile(PChar(Trim(Edit.Text)), @WavInfo) then
3. Diese Funktion ändern
Delphi-Quellcode:
function GetWaveInformationFromFile(const aFileName: AnsiString; Info: pWaveInformation): Winapi.Windows.Bool;
zu
Delphi-Quellcode:
function GetWaveInformationFromFile(const aFileName: PWideChar; Info: pWaveInformation): Winapi.Windows.Bool;
abschließend
Delphi-Quellcode:
hdmmio := Winapi.MMSystem.mmioOpen(PChar(aFileName), nil, Winapi.MMSystem.MMIO_READ);;
zu
Delphi-Quellcode:
hdmmio := Winapi.MMSystem.mmioOpen(aFileName, nil, Winapi.MMSystem.MMIO_READ);
Zitat:
Fazit: Ja auch Debuggen ist mit unter eine Kunst! |
AW: WAV File Info?
Zitat:
Delphi-Quellcode:
ersetzen durch
fDuration := dataSize DIV BytesPerSec
Delphi-Quellcode:
. 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.
fDuration := Round(1000 * dataSize / BytesPerSec)
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 ... |
AW: WAV File Info?
Zitat:
Danke an @Gausi für die AudioWerkzeugeBibliothek (v2.0) mit der ID3Tags-Fähigkeit. Respekt! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz