Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi MP3 mit kompilieren (https://www.delphipraxis.net/53012-mp3-mit-kompilieren.html)

150gozilla 8. Sep 2005 13:01


MP3 mit kompilieren
 
Hallo liebe DP´ler

Ich habe folgende frage und zwar:

Habe ich ein Programmgeschrieben, nun alles gut und möchte gerne auch hintergrund musik, gut funzt mit der standart komponente (Delphi 5 pro).

Nur muss ich ja dann die mp3 immer mit dem programm geben, da ja sonst eine fehlermeldung kommt, wie kann ich die mp3 in das programm einkompileren, damit das eins zusammen ist (programm+die mp3 datei(hintergrund musik)) ?

igel457 8. Sep 2005 13:08

Re: MP3 mit kompilieren
 
http://delphi.about.com/od/objectpas.../aa021301a.htm
Gutes Tutorial!

150gozilla 8. Sep 2005 13:15

Re: MP3 mit kompilieren
 
gibts sowas nicht in deutsch ?, ich mein ich kann english aber ist etwas umständlich

slm 8. Sep 2005 13:28

Re: MP3 mit kompilieren
 
hi

dp-forum

ahnliches problem vielleicht kann man dir dort weiter helfen

mfg slm

Flocke 8. Sep 2005 14:28

Re: MP3 mit kompilieren
 
Ich greife mal die den von slm angegebenen Thread auf: Man kann ja auch eine Wave-Datei erstellen, die nicht im PCM-Format sondern im MP3-Format codiert ist - im Grunde muss da nur ein RIFF-Header davor und dahinter steht dann der Inhalt der MP3-Datei. Ein halbwegs guter Audio-Editor sollte das über "Speichern unter" können (ich denke mal CoolEdit z.B.).

Ggf. spielt PlaySound die ja ab, wenn man sie als Resource einbindet, also mit einer RC Datei mit dem Inhalt:

Code:
MP3Resource WAVE "MeinMP3WolfImWavesPelz.wav"

dizzy 8. Sep 2005 14:47

Re: MP3 mit kompilieren
 
*schüttel* mp3 in Wave finde ich nicht sehr gelungen :). Warum? Das Wave-Format ist ein Format dass sich in sog. Chunks aufteilt. Wesentlich sind hier (abgesehen vom Header) das fmt-Chunk dass alle Randinfos zum Wave enthält, und das data-Chunk mit den Wavedaten. So sieht ein normales Wave für gewöhnlich aus, und mehr Definition ist im Standard nicht enthalten - bis auf, dass man beliebig benannte Chunks mit beliebigen Daten einfach mit reinpackan kann! Und das wäre so ein Kandidat für mp3-in-Wav. Es mag mit einer vielzahl von Playern gehen, doch es ist nicht mehr als ein Quasistandard auf den man sich nicht 100%ig verlassen kann.

\\edit: Ich wollte damit ausdrücken, dass die mp3-Daten nicht im data-Chunk landen, sondern in einem "Custom"-Chunk dessen Existenz in keinem Standard definiert ist. Player die von "sauberen" Files ausgehen könnten Probleme mit einem leeren data-Chunk haben.

Wo ist eigentlich das Problem ein mp3 einfach als Ressource einzubinden? Wenn man zum Abspielen nachher im ungüstigsten Fall wieder ein File braucht, kann man sich das zur Laufzeit auch wieder extrahieren (gibts im Forum imho schon ein (paar) Thread(s) zu).


Gruss,
Fabian

Flocke 8. Sep 2005 14:55

Re: MP3 mit kompilieren
 
Naja, für WAVE-Dateien ein CODEC zu benutzen ist durchaus standardgemäß, das ist im Format ja definitiv so vorgesehen - und MP3 als Codec wird sogar mit Windows ausgeliefert (eher coDEC als CODec). Zudem gibt's eine ganze API-Sammlung dazu (ACM - Audio Compression Manager).

Es gibt viele Programme, die von sich aus schon bei MP3-Dateien den kleinen Riff-Header davor schreiben, damit die MP3-Datei vom Format her eine WAVE-Datei ist (habe ich auf jeden Fall schon häufiger mal gesehen).

Das sieht dann so aus:
Code:
00000000 5249 4646 4AE8 0F00                            RIFFJ...        <- "RIFF" + Dateigröße
00000008 5741 5645 666D 7420                            WAVE
0000000C 1E00 0000                                      fmt ....        <- "fmt "-Chunk
00000014 5500 0200 2256 0000 581B 0000 0100 0000        U..."V..X....... <- Formatbeschreibung
00000024 0C00 0100 0200 0000 B600 0100 7105             ............q.
00000032 6661 6374 0400 0000                            fact....        <- "fact"-Chunk
0000003A 31B8 6400                                      1.d.            <- Codec-spezifisches
0000003E 6461 7461 0CE8 0F00                            data....        <- "data"-Chunk
00000046 <hier kommt der originale Inhalt der MP3-Datei>
Wobei man natürlich die Daten auf mehrere "data"-Chunks aufteilen könnte.

Ich habe das gerade mal ausprobiert und das Abspielen einer solchen Ressource mit PlaySound funktioniert ganz problemlos (unter XP).

//EDIT: blaues ergänzt.

dizzy 8. Sep 2005 15:15

Re: MP3 mit kompilieren
 
Zitat:

Zitat von Flocke
Naja, für WAVE-Dateien ein CODEC zu benutzen ist durchaus standardgemäß, das ist im Format ja definitiv so vorgesehen - und MP3 als Codec wird sogar mit Windows ausgeliefert (eher coDEC als CODec). Zudem gibt's eine ganze API-Sammlung dazu (ACM - Audio Compression Manager).

Mh, ich mag Containerformate nicht :D. Dass das mit dem Windowsplayer geht habe ich vermutet, bin mir aber nicht sicher wie es im Allgemeinen aussieht. Aber gut - hierbei geht es ja nur um PlaySound, und dass der es kann hast du geschrieben. Von daher für diesen Fall wohl ein funktionierender Weg zum Ziel.

Es bleibt aber dabei, dass ich mir keine andere Problemstellung vorstellen kann, bei der diese Uneindeutigkeit (auf den ersten Blick) wirklich Sinn macht. Ich hätte da eher den Player/die API erweitert und mp3s hinzugefügt, statt so ein Mischwurschtel zu betreiben :)

Die "alten" Unterformate (CCITT a/µ-Law etc.) sind ja noch im ursprünglichen Standard definiert - das ist noch okay, aber da noch alle möglichen Codecs mit hinein zu legen, möh - ist halt Geschmacksache ^^

Zitat:

Zitat von Flocke
Wobei man natürlich die Daten auf mehrere "data"-Chunks aufteilen könnte.

Wo läge der Sinn darin?

Flocke 8. Sep 2005 15:42

Re: MP3 mit kompilieren
 
Ergänzung zu oben, Auszug aus aktueller mmreg.h des PSDK. MPEGLAYER3WAVEFORMAT ist mindestens seit 1999 definiert (wahrscheinlich aber noch eher).

Code:
//
// MPEG Layer3 WAVEFORMATEX structure
// for WAVE_FORMAT_MPEGLAYER3 (0x0055)
//
#define MPEGLAYER3_WFX_EXTRA_BYTES  12

// WAVE_FORMAT_MPEGLAYER3 format sructure
//
typedef struct mpeglayer3waveformat_tag {
  WAVEFORMATEX wfx;
  WORD         wID;
  DWORD        fdwFlags;
  WORD         nBlockSize;
  WORD         nFramesPerBlock;
  WORD         nCodecDelay;
} MPEGLAYER3WAVEFORMAT;

typedef MPEGLAYER3WAVEFORMAT         *PMPEGLAYER3WAVEFORMAT;
typedef MPEGLAYER3WAVEFORMAT NEAR   *NPMPEGLAYER3WAVEFORMAT;
typedef MPEGLAYER3WAVEFORMAT FAR    *LPMPEGLAYER3WAVEFORMAT;

//==========================================================================;

#define MPEGLAYER3_ID_UNKNOWN           0
#define MPEGLAYER3_ID_MPEG              1
#define MPEGLAYER3_ID_CONSTANTFRAMESIZE 2

#define MPEGLAYER3_FLAG_PADDING_ISO     0x00000000
#define MPEGLAYER3_FLAG_PADDING_ON      0x00000001
#define MPEGLAYER3_FLAG_PADDING_OFF     0x00000002
Damit sieht das Hex-Beispiel von oben so aus:

Code:
00000000 5249 4646 4AE8 0F00                            RIFFJ...        <- "RIFF" + Dateigröße
00000008 5741 5645                                      WAVE
0000000C 666D 7420 1E00 0000                            fmt ....        <- "fmt "-Chunk + Größe
00000014 ---- WAVEFORMATEX ----
         5500           $55 : wFormatTag : WAVE_FORMAT_MPEGLAYER3
         0200           $02 : nChannels
         2256 0000      22050 : nSamplesPerSec : Abspielfrequenz
         581B 0000      7000 : nAvgBytesPerSec : Bitrate (56 kBit/s)
         0100           1 : nBlockAlign
         0000           0 : wBitsPerSample
         0C00           12 : cbSize : MPEGLAYER3_WFX_EXTRA_BYTES
00000032 ---- MPEGLAYER3WAVEFORMAT ----
         0100           1 : wID : MPEGLAYER3_ID_MPEG
         0200 0000      $00000002 : fdwFlags : MPEGLAYER3_FLAG_PADDING_OFF
         B600           182 : nBlockSize : Std. Framegröße für Frequenz/Bitrate/Layer/Version
         0100           1 : nFramesPerBlock
         7105           1393 : nCodecDelay : ? wird vom Codec eingesetzt
00000032 6661 6374 0400 0000                            fact....        <- "fact"-Chunk + Größe
0000003A 31B8 6400      6600753 : Anzahl Samples (gesamt / je Kanal ??)
0000003E 6461 7461 0CE8 0F00                            data....        <- "data"-Chunk + Größe

dizzy 8. Sep 2005 16:53

Re: MP3 mit kompilieren
 
Owned :D

In der Spezifikation die ich von www.wotsit.org hatte war nichts dergleichen auch nur erwähnt, und auf deren Basis bewegte ich mich. Nun, da es PSDK-seitig scheinbar einwandfrei ist dies so einzusetzen, ist das wohl okay. Mögen tu ich's trotzdem nicht - in ein Wave gehören meiner Meinung nach unkomprimierte Daten, oder im schlimmsten Fall a/µ-Law :mrgreen:

Nochwas was mir auffiel:
Zitat:

Es gibt viele Programme, die von sich aus schon bei MP3-Dateien den kleinen Riff-Header davor schreiben, damit die MP3-Datei vom Format her eine WAVE-Datei ist (habe ich auf jeden Fall schon häufiger mal gesehen).
Warum sollte man ein mp3 als Wave gelten lassen, wenn es doch eh .mp3 heisst und auch die darin zu erwartenden Daten enthält!? Ein RIFF-Header hat imho noch weniger etwas in einem mp3 verloren als mp3-Daten in einem RIFF-Wave :stupid:
Das führt für mein Verständnis zunächst lediglich zu einer Vermischung der Formate und damit einhergehender Uneindeutigkeit insbesondere der Dateiendung.

MfG,
Fabian

Flocke 8. Sep 2005 17:01

Re: MP3 mit kompilieren
 
Zitat:

Zitat von dizzy
Warum sollte man ein mp3 als Wave gelten lassen, wenn es doch eh .mp3 heisst und auch die darin zu erwartenden Daten enthält!? Ein RIFF-Header hat imho noch weniger etwas in einem mp3 verloren als mp3-Daten in einem RIFF-Wave :stupid:
Das führt für mein Verständnis zunächst lediglich zu einer Vermischung der Formate und damit einhergehender Uneindeutigkeit insbesondere der Dateiendung.

Du hast natürlich nicht ganz Unrecht, mit dem RIFF-Header ist aber so (bei MP3s wird eh' der Anfang übersprungen bis das erste gültige SyncWord gefunden wird).

Hab' gerade schon mal angefangen was zu hacken 8)

Wenn's fertig ist (kann allerdings noch ein paar Tage dauern), dann wird's analog wie PlaySound funktionieren, allerdings mit MP3-Dateien (über Delphi-Streams + acm-Streaming + Wave-Ausgabe im eigenen Thread --- das braucht bestimmt mind. 3 Tage Debugging :stupid: ).

dizzy 8. Sep 2005 17:17

Re: MP3 mit kompilieren
 
Lecker! Mh, wäre dass dann sogar als (kleiner) Ersatz für die BASS.DLL anzusehen? Ich bin gespannt!

Flocke 9. Sep 2005 19:38

Re: MP3 mit kompilieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab' auf jeden Fall schon mal ein kleines Tool für 150gozilla gemacht, mit dem man MP3s ohne wirkliche Konvertierung in WAVEs umwandeln kann (es wird dann ein entsprechender RIFF-Header davor gesetzt und mit der Erweiterung WAV abgespeichert).

Das Resultat kann man dann als Ressource einbinden und mit PlaySound direkt abspielen 8)

150gozilla 12. Sep 2005 07:55

Re: MP3 mit kompilieren
 
Hi ;) danke für das tool, nur funzt es nicht.

ist keine gültige win 32 anwendung^^

Das ist alle hier nen bissl kompliziert

Flocke 12. Sep 2005 08:44

Re: MP3 mit kompilieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eigentlich sollte es gehen ... ich schau gerade mal ...

[Weiter]

Huch, du hattest Recht. Ich hatte versucht, die JCL-Debug-Infos mit dem GNU-Utility "strip" rauszumachen, aber das hat wohl die EXE zerschossen.

Als Anlage eine neuere Version, mit der es einwandfrei klappen sollte. Einfach ein MP3-File draufziehen und dann auf "Convert to wav" klicken. Die Sourcen kommen später nach, ich bin gerade mitten im Coden des ACM-Streaming.

Noch ein Hinweis: PlaySound "mag" keine VBR-MP3s, da werden vom Ende immer ein paar Zehntelsekunden weggelassen - in dem Fall solltest du einfach ca. 1 Sekunde Stille anhängen.

turboPASCAL 12. Sep 2005 08:57

Re: MP3 mit kompilieren
 
Funzt auch, ist bestimmt ein Fehler in der Datei (exe) ...

[edit=turboPASCAL]Anhang entfernt. siehe Post von Flocke[edit]

150gozilla 12. Sep 2005 09:01

Re: MP3 mit kompilieren
 
Also er hat mir eine Wave draus gemacht :) *danke nochmal*

und wie binde ich die jetzt in mein Programm ein, damit es nur ein file ist (meine .exe)?

turboPASCAL 12. Sep 2005 10:14

Re: MP3 mit kompilieren
 
Zitat:

Zitat von 150gozilla
und wie binde ich die jetzt in mein Programm ein, damit es nur ein file ist (meine .exe)?

Das ist bestimmt mit der Suchfunkeion der DP herrauszufenden Hier im Forum suchensound in resource einbinden :wink:

Soundressourcen

&quot; gehört nicht zum Code... ;)

Flocke 12. Sep 2005 12:16

Re: MP3 mit kompilieren
 
In den Posts, die turboPASCAL aufgeführt hat, steht's schon recht deutlich. Hier noch einmal eine Zusammenfassung:

1. RC-Datei erstellen

Erstelle eine Textdatei mit der Endung RC (geht so weit ich weiß auch über Delphi). Als Inhalt gibst du jeweils eine Zeile mit
a) Name der Ressource
b) Typ der Ressource (hier immer WAVE)
c) Dateiname der Ressource
Beispiel:
Code:
BGSOUND WAVE "bgsound.wav"
2. RES-Datei erstellen

Rufe eine Kommandozeile auf, wechsle in dein Projektverzeichnis und rufe BRCC32 mit deiner bei (1) erstellten RC-Datei auf.
Sagen wir mal, deine Datei hieße "bgsound.rc". Beispiel:
Code:
BRCC32 bgsound.rc
Es müsste dann die Datei "bgsound.res" erstellt worden sein.

3. Ressource einbinden

Binde diese Ressource in irgendeine deiner Units ein, z.B. in das Hauptformular.
-> Suche die Stelle hinter implementation, wo {$R *.dfm} steht und füge eine neue Zeile dahinter ein für die bei (2) erstellt RES-Datei.
Beispiel:
Delphi-Quellcode:
...
implementation

{$R *.dfm}
{$R bgsound.res}

...
4. Sound abspielen

Rufe PlaySound nun einfach mit einem der Namen (1a) aus der RC-Datei auf.
Beispiel:
Delphi-Quellcode:
PlaySound('BGSOUND', hInstance, SND_RESOURCE or SND_ASYNC);

Du kannst beliebig viele Sounds in die RC-Datei packen (natürlich mit unterschiedlichen Namen). Jeder Aufruf von PlaySound stoppt aber den vorhergehenden - du kannst also immer nur einen Sound gleichzeitig abspielen.


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