3.1k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
ich würde gern bei einer wav-datei einen bestimmten teil auslesen lassen, zum beispiel die ersten 16 zeichen. wie geht das?

das habe ich bisher zusammengetragen:
var
sBuffer : string;
fsIN : TFileStream;
begin
fsIN := TFileStream.Create('aufnahme.wav',fmOpenRead);
sBuffer := StringOfChar(#00,16);
fsIN.Read(sBuffer[1],length(sBuffer));
end;

wenn das jetzt schon die lösung sein sollte, dann würde ich gern wissen, wo ich dort den string herkriegen, denn Edit1.Text := (sBuffer); gibt mir nichts aus.

8 Antworten

0 Punkte
Beantwortet von
befindet sich 'aufnahme.wav' auch im richtigen ordner? wenn du das in der ide laufen läßt, solltest du den vollständigen dateipfad anwenden

If the file could not be opened in the requested mode, an EFOpenError exception is raised.
0 Punkte
Beantwortet von
'aufnahme.wav' befindet sich im ordner, wo die exe liegt.
wenn ich es durch ExtractFilePath(ParamStr(0))+'aufnahme.wav' ersetze, ist das ergebnis das gleiche.
0 Punkte
Beantwortet von
weitere ideen?
0 Punkte
Beantwortet von mr_x_hacker Mitglied (129 Punkte)
Hi,

guck Dir mal die einzelnen Bytes an, die Du liest... stimmen die mit denen in der WAV-Datei überein?

Gemäß Wikipedia bestehen die ersten 16 Bytes eines WAV-Files aus den Zeichen "RIFF", dann einem unsigned long "filesize", dann "WAVE", usw... hierbei kannst Du aber wohl die "filesize" nicht einfach so als Character eines Strings interpetieren... evtl. solltest Du mal die ersten 4 Byte lesen und gucken, ob das dann geht... danach musst Du dann die "Filesize" anders lesen, um den long zu kriegen... (keine Ahnung wie das in Delphi geht... notfalls kann man ja aber auch aus den 4 Bytes "zu Fuß" den Long berechnen...)

Ciao Sascha
0 Punkte
Beantwortet von
also die ersten 4 zeichen "riff" werden ausgegeben. ich hatte gehofft, alle eingelesenen bytes würden zusammen als text ausgegeben werden. da muss ich also umdenken. (eigentlich will ich ja die einzelnen werte aus der eigentlichen aufnahme lesen.)
aber wie genau geht das, dass ich mich auf verschiedene bereiche beziehe, oder eben doch alles zusammen ausgebe?

notfalls kann man ja aber auch aus den 4 Bytes "zu Fuß" den Long berechnen

wie würde das gehen?
0 Punkte
Beantwortet von
da fällt mir auf, ich müsste dazu ja jedes zeiches extra ausgeben, so dass ich statt "RIFF" "52494646" ausgegeben bekommen kriegen, also wird mein fehler irgendwo hier zu beheben sein:
sBuffer := StringOfChar(#00,16);

aber wie?
0 Punkte
Beantwortet von
naja, damit komm ich jetzt an die hexadezimalen, wie es auch eigentlich in der fragestellung hätte heißen müssen:

var
myFile: TFileStream;
i: cardinal;
sBuffer : string;
begin
myFile:=TFileStream.Create('aufnahme.wav',fmOpenRead);
for i := 1 to 44 do
begin
sBuffer := StringOfChar(#00,1);
myFile.Read(sBuffer[1],1);
edit1.Text:=edit1.Text+inttohex(ord(sBuffer[1]),2);
end;
end;

3 Fragen habe ich jetzt dazu noch:
1. kann man das noch einfacher schreiben?
2. wie legt man fest, wo man mit dem auslesen beginnt?
3. wie schreibe ich das (komplett) in einen string?
0 Punkte
Beantwortet von mr_x_hacker Mitglied (129 Punkte)
Hi,

wie gesagt, ich kann kein Delphi...
Aber allgemein würde ich es so machen:

- Kompletten Header lesen (16 Byte?) --> z.B. in byte-Array
- Erste 4 Bytes -> String x1
- Nächste 4 Bytes -> long filesize
- Nächste 8 Bytes -> String x2 (falls da nicht wieder numerische Werte drin sind!)
- String result = x1 + " " + filesize + " " + x2; (=Stringverkettung)

Den long aus den 4 Bytes erzeugen solltest Du evtl. selbst überlegen wie es geht, wenn Du was gelernt haben willst, das ist nämlich ziemlich basic :)
(ich glaube, b0 + (b1 << 8) + (b2 << 16) + (b3 << 24) sollte es tun... oder so... ^^)

Ciao Sascha
...