![]() |
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)) ? |
Re: MP3 mit kompilieren
|
Re: MP3 mit kompilieren
gibts sowas nicht in deutsch ?, ich mein ich kann english aber ist etwas umständlich
|
Re: MP3 mit kompilieren
|
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"
|
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 |
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:
Wobei man natürlich die Daten auf mehrere "data"-Chunks aufteilen könnte.
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> Ich habe das gerade mal ausprobiert und das Abspielen einer solchen Ressource mit PlaySound funktioniert ganz problemlos (unter XP). //EDIT: blaues ergänzt. |
Re: MP3 mit kompilieren
Zitat:
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:
|
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:
Damit sieht das Hex-Beispiel von oben so aus:
//
// 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
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 |
Re: MP3 mit kompilieren
Owned :D
In der Spezifikation die ich von ![]() Nochwas was mir auffiel: Zitat:
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 |
Re: MP3 mit kompilieren
Zitat:
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: ). |
Re: MP3 mit kompilieren
Lecker! Mh, wäre dass dann sogar als (kleiner) Ersatz für die BASS.DLL anzusehen? Ich bin gespannt!
|
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) |
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 |
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. |
Re: MP3 mit kompilieren
Funzt auch, ist bestimmt ein Fehler in der Datei (exe) ...
[edit=turboPASCAL]Anhang entfernt. siehe Post von Flocke[edit] |
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)? |
Re: MP3 mit kompilieren
Zitat:
![]() ![]() " gehört nicht zum Code... ;) |
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:
2. RES-Datei erstellen
BGSOUND WAVE "bgsound.wav"
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:
Es müsste dann die Datei "bgsound.res" erstellt worden sein.
BRCC32 bgsound.rc
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:
4. Sound abspielen
...
implementation {$R *.dfm} {$R bgsound.res} ... 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 04:41 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