Autor |
Beitrag |
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 20.11.15 19:03
Hallo!
Wie kann ich eine MP3-Datei in mein Programm einbinden und daraus dann abspielen?
Mit WAV klappt das ja, aber geht es auch mit einer MP3-Datei? Hab's auf die "klassische" Art mit einer .rc versucht, und ja, die Daten der MP3-Datei werden eingebunden, aber das Abspielen funktioniert nicht, jedenfalls nicht mit PlaySound und auch nicht mit SndPlaySound!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
SMO
Beiträge: 120
Erhaltene Danke: 18
D2005 Personal
|
Verfasst: Fr 20.11.15 21:20
Dass es mit diesen alten APIs nicht klappt ist klar. Die sind nur für WAV ausgelegt.
Früher gab es den ACM in Windows, Audio Compression Manager. Damit konnte man diverse Audiocodecs installieren und nutzen, unter anderen auch MP3.
Den ACM gibt es natürlich aus Kompatibilitätsgründen noch immer, aber Microsoft rät schon lange davon ab, ihn noch zu benutzen. Er unterstützt z.B. auch keine Formate mit variablen Bitraten (VBR), wie sie MP3 durchaus haben kann.
Ich kenne drei Möglichkeiten, wie du eine MP3-Datei abspielen kannst.
- Mit der MCI/MMSystem API. Auch die ist veraltet und sollte nicht mehr verwendet werden. Ist relativ einfach zu benutzen, jedenfalls für Dateien. Deine MP3-Ressource direkt aus dem Arbeitsspeicher abzuspielen wäre wahrscheinlich möglich, aber komplizierter.
- Mit DirectShow. Ist anfangs etwas kompliziert, wird über Interface-Objecte angesprochen. Hier gibt's Beispielcode, der aber wahrscheinlich etwas angepasst werden muss (die DirectX Header sollten in deinem Delphi XE2 dabei sein und brauchen nicht separat installiert zu werden).
- Mit einer Drittlösung wie z.B. BASS.DLL. Vorteil: unterstützt sehr viele Formate, relativ einfach zu benutzen (eine Delphi-Unit für die API ist vorhanden). Nachteil: benötigt die zusätzliche DLL, darf nicht kommerziell eingesetzt werden ohne zu zahlen.
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 21.11.15 08:18
SMO hat folgendes geschrieben : | Dass es mit diesen alten APIs nicht klappt ist klar. Die sind nur für WAV ausgelegt. |
Ich hatte die Hoffnung, dass es mit ein paar "Hintertüren" doch geht! Ok, danke!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
SMO
Beiträge: 120
Erhaltene Danke: 18
D2005 Personal
|
Verfasst: Sa 21.11.15 15:54
Was möchtest du denn genau mit der MP3-Datei machen? Einfach nur im Hintergrund abspielen von Anfang bis Ende?
Hier mal ein kleines Codebeispiel für MCI (ja, ich sagte man soll es eigentlich nicht mehr verwenden, aber zur Not geht es noch ).
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| uses MMSystem;
const MyAlias = 'myfile';
type TForm1 = class(TForm) private procedure PlayFile(const FileName: string); procedure MciNotify(var Msg: TMessage); message MM_MCINOTIFY; end;
function MyMciSendString(const Command: string; CallbackWnd: HWND; out MciReturn: string): MCIERROR; var mciReturnStr: array [Byte] of Char; begin Result := mciSendString(PChar(Command), @mciReturnStr[0], SizeOf(mciReturnStr), CallbackWnd); MciReturn := mciReturnStr; if Result <> 0 then begin if not mciGetErrorString(Result, @mciReturnStr[0], Length(mciReturnStr)) then mciReturnStr[0] := #0; ShowMessage('MCI Fehler %d (%s) nach Befehl "%s"', [Result, mciReturnStr, Command]); end; end;
procedure TForm1.PlayFile(const FileName: string); var MciReturn: string; begin if MyMciSendString(Format('open "%s" alias %s wait', [FileName, MyAlias]), Self.Handle, MciReturn) = ERROR_SUCCESS then begin MyMciSendString(Format('play %s notify', [MyAlias]), Self.Handle, MciReturn);
end; end;
procedure TForm1.MciNotify(var Msg: TMessage); begin
if Msg.WParam = MCI_NOTIFY_SUCCESSFUL then ShowMessage(Format('Vorgang für MciHandle %d wurde erfolgreich beendet', [Msg.LParam])) else if Msg.WParam = MCI_NOTIFY_ABORTED then ShowMessage(Format('Vorgang für MciHandle %d wurde abgebrochen', [Msg.LParam])); end; |
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 21.11.15 18:02
SMO hat folgendes geschrieben : | Was möchtest du denn genau mit der MP3-Datei machen? Einfach nur im Hintergrund abspielen von Anfang bis Ende? |
Ja, soll aber gestoppt werden können, ...
SMO hat folgendes geschrieben : | PlayFile(const FileName: string); |
... und soll vor allem keine separate Datei sein, sondern als Ressource in der Programmdatei enthalten sein. Genauso, wie ich es momentan mit der WAV-Datei mache. Genügt mir im Prinzip ja, ich wollte nur wissen, ob nicht ebenso eine MP3-Datei als Ressource eingebunden werden und vor allem abgespielt(!) werden kann!
Denn einbinden kann ich die MP3-Datei, nur weiss ich nicht, wie ich sie abspiele.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
SMO
Beiträge: 120
Erhaltene Danke: 18
D2005 Personal
|
Verfasst: Sa 21.11.15 20:01
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 21.11.15 20:08
SMO hat folgendes geschrieben : | Du könntest zur Not die MP3-Ressource "entpacken" und als temporäre Datei zwischenspeichern. |
Das habe ich auch schon angedacht, gefällt mir aber nicht so recht.
SMO hat folgendes geschrieben : | Oder eben BASS.DLL benutzen. Da geht das Abspielen aus dem Speicher genau wie aus einer Datei (BASS_StreamCreateFile). |
Das werde ich mir zumindest mal ansehen, also BASS.DLL runterladen usw. und dann damit rumtesten.
Immerhin läuft es ja auch mit der WAV-Datei, nur bläht diese halt die EXE ziemlich auf. MP3 wäre da schon besser!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 22.11.15 04:30
galagher hat folgendes geschrieben : | Immerhin läuft es ja auch mit der WAV-Datei, nur bläht diese halt die EXE ziemlich auf. MP3 wäre da schon besser! |
Wenn's nicht so sehr auf die Qualität ankommt, wäre das Ogg-Format eine brauchbare Alternative, das komprimiert noch stärker als MP3. Ich hab hier eine Firebird-Datenbank mit Diskussionen, Vorträgen und Interviews, die alle im Ogg-Format in der DB gespeichert sind, zudem noch in Mono und mit 11025 Hz. Die DB-Anwendung setzt ebenfalls die Bass.dll ein.
Die Datenbank belegt derzeit 7.770.193.920 Bytes (7,7 Gig), was 770 Stunden und 25 Minuten "Geschwätz" entspricht. Pro Stunde wären das dann rund 10.091.160 Bytes, also rund 10 MB. Konkret belegt eine Ogg-Datei, die eine Spieldauer von einer Stunde und 4 Sekunden aufweist, eine Speichergröße von 10.240.169 Bytes. Egal wie ich's auch anstelle, ich schaffe es nicht, mit dem MP3-Format eine gleichgroße oder gar kleinere Datei zu erzeugen, obwohl ich eingestehen muß, daß die kleinste MP3-Datei, die sich aus dieser Ogg-Datei via Audacity erzeugen läßt, lediglich 800 KB größer ist als die Ogg-Datei.
Einloggen, um Attachments anzusehen!
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 28.11.15 08:37
Perlsau hat folgendes geschrieben : | Wenn's nicht so sehr auf die Qualität ankommt, wäre das Ogg-Format eine brauchbare Alternative, das komprimiert noch stärker als MP3. |
Sollte schon eine gewisse Qualität haben!
Wie gesagt, mit der WAV geht es ja, ich habe nur momentan nicht viel Zeit, mir die bass.dll anzusehen, werde dies aber definitiv noch machen. Kann man ja immer mal brauchen! Danke!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Holgerx
Beiträge: 63
Erhaltene Danke: 27
Win95 - Win11 / MSServer2000 - MSServer2019
Delphi 6pro / XE4
|
Verfasst: Sa 28.11.15 12:31
Hab mal nen bischen gegooglt..
libzplay.sourceforge.net/
Scheint eine einfache und als 'PF'-Version sogar Licence-Free Lib zu sein, um u.a. OGG-Streams abspielen zu können..
|
|
Daniel_DT
Beiträge: 16
|
Verfasst: Di 25.04.17 10:02
galagher hat folgendes geschrieben : | Sollte schon eine gewisse Qualität haben! |
Seh ich ähnlich.. OGG macht keinen Spaß finde ich.
|
|
t.roller
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: Di 25.04.17 15:48
|
|
|