Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Daten aus Sounddatei auslesen (https://www.delphipraxis.net/85511-daten-aus-sounddatei-auslesen.html)

blablab 31. Jan 2007 19:46


Daten aus Sounddatei auslesen
 
Hallo,

ich würde gerne die Daten aus einer Sounddatei auslesen. Am besten wäre es, wenn ich die Daten aus einer mp3-Datei lesen könnte, aber hauptsache ist erstmal, dass ich die Daten aus irgendeinem Format auslesen kann.
Letztendlich muss doch in so einer Datei drin stehn, was für Signale an den Lautsprecher gehen. Da muss doch irgendwie drin stehen, wie viel Volt zu welcher Zeit an den Lautsprecher angeschlossen werden.
Und genau das würde ich gerne auslesen.
(Bei einer Stereo-Datei ist die Hauptsache, dass ich einen Kanal auslesen kann.)

Im Prinzip muss es so doch so funktionieren wie das der Nero-WaveEditor macht. Der zeigt ja am Schluss auch ein Bild an, das aus einer Linie besteht und dazu muss er ja auch irgendwie die Daten aus ner Sounddatei auslesen.
Die Frage ist nur wie man das macht...

Kann mir da jemand weiterhelfen???

Danke schonmal!
Simon

omata 31. Jan 2007 19:50

Re: Daten aus Sounddatei auslesen
 
Willst du das alles selber machen? Alternative wäre z.B. die bass.dll zu benutzen.

Gruss
Thorsten

blablab 31. Jan 2007 19:55

Re: Daten aus Sounddatei auslesen
 
nein, ich suche ja gerade nach sowas wie der bass.dll!
(ich bin gerade auch auf die gestoßen und hab die dll runtergeladen)

Nur kann mir da jemand erklären wie das damit geht?
gibts da sowas wie n soundStream oder so???

omata 31. Jan 2007 19:57

Re: Daten aus Sounddatei auslesen
 
Schau dir mal die Beispiele an...

blablab 31. Jan 2007 20:01

Re: Daten aus Sounddatei auslesen
 
ich hab keine Besipiele...
ich hab nur die Bass.dll und Bass.pas gefunden :)
hast du mir da die offizielle homepage oder so??? :stupid:

omata 31. Jan 2007 20:03

Re: Daten aus Sounddatei auslesen
 
Hast du mal hier geschaut?

blablab 31. Jan 2007 20:06

Re: Daten aus Sounddatei auslesen
 
Danke!
und herzlichen Glückwunsch zum 1000 Beitrag :-D

Dann werd ich mich mal n bisschen dahintersetzen...

blablab 1. Feb 2007 19:39

Re: Daten aus Sounddatei auslesen
 
ehrlich gesagt blick ich es immer noch nicht.
ich hab mir da mal die beispiele angeschaut und auch eines gefunden, welches eine sounddatei als linie zeichnet. das problem ist nur, dass dieses Beispiel nicht alle daten aus der sounddatei ausliest, sondern natürlich nur für jeden Pixel, der zu zeichnen ist. Ich würde aber gerne alle Daten aus der Datei auslesen.

Und das Problem ist, ich komm da nicht weiter. Ich finde keine Hilfe zur Bass.dll und weiß au net wie ich mir da selbst weiterhelfen soll. Allein vom Programmtext komm ich net wirklich weiter, weil ich kaum was versteh...

Kann mir jemand helfen und sagen wie ich das mach?
Oder weiß jemand, wo ich eine Hilfe zu der Bass.dll finde???
(Wobei mir ne konkrete Hilfe natürlich lieber wär, da ich gar net weiß, wie ich das Problem angehen soll...)

blablab 2. Feb 2007 16:10

Re: Daten aus Sounddatei auslesen
 
Ich hab inzwischen folgenden Thread gefunden.

Und ich vermute mal, dass man mit diesem Code

Delphi-Quellcode:
function TForm1.GeneratePeaks(height,width:integer;stream:HStream):TBitmap;
var i,len,r,l,ypos,xpos:integer;
var WaveData : TWaveData;
begin
  result := TBitmap.Create;
  result.Height := height;
  result.Width := width;
  for len := 0 to bass.BASS_StreamGetLength(stream) do
  begin
    BASS_ChannelSetPosition(stream,len);
    BASS_ChannelGetData(stream, @WaveData, 2048);
    for i := 0 to 255 do
    begin
       R := SmallInt(Loword(WaveData[i * 1]));
       L := SmallInt(HIword(WaveData[i * 1]));
       YPos := Trunc(((R + L) / (2 * 65535)) * 1);
       xpos := trunc(len * (width / (BASS_StreamGetLength(stream))));
       result.Canvas.LineTo(xpos,ypos-10);
    end;
  end;
end;
alle Daten aus einer Sounddatei auslesen kann.

Dummerweise treten bei mir aber ein Paar fehler auf:
Undefinierter Bezeichner: BASS_StreamGetLength
Undefinierter Bezeichner: TWaveData
Undefinierter Bezeichner: BASS_StreamGetPosition

Was muss ich denn hier einbinden, damit es funktioniert???

EWeiss 2. Feb 2007 16:15

Re: Daten aus Sounddatei auslesen
 
Zitat:

Zitat von blablab
Ich hab inzwischen folgenden Thread gefunden.

Und ich vermute mal, dass man mit diesem Code

Delphi-Quellcode:
function TForm1.GeneratePeaks(height,width:integer;stream:HStream):TBitmap;
var i,len,r,l,ypos,xpos:integer;
var WaveData : TWaveData;
begin
  result := TBitmap.Create;
  result.Height := height;
  result.Width := width;
  for len := 0 to bass.BASS_StreamGetLength(stream) do
  begin
    BASS_ChannelSetPosition(stream,len);
    BASS_ChannelGetData(stream, @WaveData, 2048);
    for i := 0 to 255 do
    begin
       R := SmallInt(Loword(WaveData[i * 1]));
       L := SmallInt(HIword(WaveData[i * 1]));
       YPos := Trunc(((R + L) / (2 * 65535)) * 1);
       xpos := trunc(len * (width / (BASS_StreamGetLength(stream))));
       result.Canvas.LineTo(xpos,ypos-10);
    end;
  end;
end;
alle Daten aus einer Sounddatei auslesen kann.

Dummerweise treten bei mir aber ein Paar fehler auf:
Undefinierter Bezeichner: BASS_StreamGetLength
Undefinierter Bezeichner: TWaveData
Undefinierter Bezeichner: BASS_StreamGetPosition

Was muss ich denn hier einbinden, damit es funktioniert???

heheheee die Bass.dll (Unit davon) natürlich.

EDIT:
google mal nach winmm oder msacm32 diese sind für die ausgabe einer Wave-Datei verwendbar

gruss

blablab 2. Feb 2007 16:20

Re: Daten aus Sounddatei auslesen
 
das problem ist, die hab ich ja drin...

beim befehl bass.BASS_StreamGetLength(stream) meckert er ja nur rum, dass er den befehl StreamGetLength nicht kennt. Bass kennt er...

EWeiss 2. Feb 2007 16:22

Re: Daten aus Sounddatei auslesen
 
Zitat:

Zitat von blablab
das problem ist, die hab ich ja drin...

beim befehl bass.BASS_StreamGetLength(stream) meckert er ja nur rum, dass er den befehl StreamGetLength nicht kennt. Bass kennt er...

Abhängig von der Version möglich das der Befehl in der 1.8 zu finden ist.

gruss

omata 2. Feb 2007 16:23

Re: Daten aus Sounddatei auslesen
 
In Version 2.1 gab es noch BASS_StreamGetLength, jetzt gibt es nur noch BASS_ChannelGetLength.
Nimm also BASS_ChannelGetLength.

Gruss
Thorsten

blablab 2. Feb 2007 16:33

Re: Daten aus Sounddatei auslesen
 
danke!

weißt du vielleicht noch, in welcher Unit TWaveData deklariert ist???

omata 2. Feb 2007 17:40

Re: Daten aus Sounddatei auslesen
 
Das kannst du selber deklarieren...

Delphi-Quellcode:
type
  TBassWaveDataDWORD = array[0..2048] of DWORD;
  TBassWaveDataSMALLINT = array[0..2048] of smallint;
  TBassWaveDataLong = array[0..8192] of smallint;
kommt eben darauf an, was du für Daten erhalten möchtest bzw. mit welchen Datentypen du weiterarbeiten möchtest.
ggf. musst du noch den dritten Parameter von BASS_ChannelGetData deinen Bedürfnissen anpassen.

Gruss
Thorsten

blablab 2. Feb 2007 19:28

Re: Daten aus Sounddatei auslesen
 
Also ich mach das bis jetzt so:

Delphi-Quellcode:
   if not BASS_Init(-1,44100,0,Application.Handle,nil) then
      ShowMessage('Can''t initialize device');

   chan := BASS_StreamCreateFile(FALSE, PChar(filename),0,0,0);
   for len := 0 to Ceil(bass.BASS_ChannelGetLength(chan) / WaveDataLength) do begin
      BASS_ChannelSetPosition(chan, len*WaveDataLength);
      BASS_ChannelGetData(chan, @WaveData, WaveDataLength);
      for i := 0 to WaveDataLength-1 do
         ShowMessage(IntToStr(WaveData[i]));
   end;
aber WaveData[i] ist immer 0!!!
(für WaveData hab ich einen array[0..WaveDataLength] of SmallInt genommen)

Was mach ich nur falsch???


Edit:
Kann ich für WaveData auch einen array of ShortInt nehmen?

omata 2. Feb 2007 19:31

Re: Daten aus Sounddatei auslesen
 
Die Auswertung geht nur, wenn der Channel auch abgespielt wird oder BASS_STREAM_DECODE/BASS_MUSIC_DECODE als Flag gesetzt wird...

Delphi-Quellcode:
  Channel := BASS_StreamCreateFile(false, PChar(filename), 0, 0, BASS_STREAM_DECODE);
  if (Channel = 0) then
    Channel := BASS_MusicLoad(false, PChar(filename), 0, 0, BASS_MUSIC_DECODE, 0);
Siehe auch hier.

Gruss
Thorsten

blablab 2. Feb 2007 22:11

Re: Daten aus Sounddatei auslesen
 
Danke Thorsten, du kennst dich echt perfekt aus!!! :thumb:

Jetzt funktionert das ganze eigentlich einwandfrei!!!
Aber dann ist da noch ein weiteres Problem aufgetreten: Auf einem alten Rechner (für den das ganze eigentlich gedacht ist) läuft das nicht mehr. Der kann die Bass.dll nicht initialisieren und dann kann er die Datei natürlich auch nicht öffnen.

Ich denk das liegt entweder daran, dass der Rechner irgendwelche Codecs nicht hat (Windows 98)oder weil er keine Soundkarte hat...

Nur ich weiß nicht, was ich dagegen machen kann.

Fällt dir oder jemand anderem dazu noch etwas ein???

omata 2. Feb 2007 22:15

Re: Daten aus Sounddatei auslesen
 
Zitat:

Zitat von blablab
Ich denk das liegt entweder daran, dass der Rechner irgendwelche Codecs nicht hat (Windows 98)oder weil er keine Soundkarte hat...

Das funktioniert auch wunderbar unter Windows98, aber eine Soundkarte muss das System natürlich haben!
Wie soll man den sonst irgendetwas mit Sounds machen?

Verwirrte Grüsse
Thorsten

blablab 2. Feb 2007 22:24

Re: Daten aus Sounddatei auslesen
 
Ja, ich weiß, ist etwas widersprüchlich...
Aber ich will ja nur eine mp3 öffnen, ich will sie ja nicht abspielen.
eigentlich ist das ja kein problem...
Aber wahrscheinlich prüft er erst, ob ich ne soundkarte hab. Und wenn ich keine hab dann verweigert er mir auch das öffnen von dateien, auch wenns eigentlich möglich wäre, oder?

Bedeutet das, mit der bass.dll hab ich keine chance dateien auszulesen ohne eine soundkarte...?

omata 2. Feb 2007 22:49

Re: Daten aus Sounddatei auslesen
 
Tja, ich denke es ist einfacher eine alte, billige Soundkarte in deinen Win98-Rechner einzubauen und damit dann eine mächtige Unterstützung (bass.dll) zu haben/benutzen zu können, als alles selber zu programmieren.

Gruss
Thorsten

blablab 2. Feb 2007 23:30

Re: Daten aus Sounddatei auslesen
 
ist aber n laptop...
und wenn es so net geht, dann lass ichs lieber.
Weil das selber du programmieren trau ich mir net zu...

Aber vielleicht fällt ja jemandem noch etwas ein...
(Vielleicht auch mit ner anderen dll oder so)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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