Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 Uhr.
Seite 1 von 2  1 2      

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