mp3 abspielen mit einem C++ Programm
-
Golem86 schrieb:
Mag sein, dass de Aufrufsyntax anders ist, aber immer noch besser, als eine Funktion, die auf nur einem OS existiert. BTW: exec() macht das gleiche, nur dass es das aufrufende Programm mit dem neuen Programm überschreibt.
Das sehe ich anders, Portabilität um jeden Preis, nein, da muss man abwägen...dann doch besser die von dir vorgeschlagene liblame oder eine ähnliche. system hat ja noch andere (nicht unbedingt erwünschte) "Nebenwirkungen", z.B. das Öffnen eines Kommandozeilen-Interpreter-Prozesses mit dem entsprechenden Fenster auf Windows-Systemen. Prozesse sind systemeigene Geschichten, die man, notfalls mit einer plattformübergreifenden Bibliothek, behandeln sollte.
MfG,
Probe-Nutzer
-
drakon schrieb:
Wie allgmein die System () Aufrufe zu vermeiden sind.
sorry, aber dies ist imho eine schwache argumentation, die der kerl dafür anbringt, system() nicht zu benutzen. noch dazu, dass er sich eigentlich auch speziell auf system("pause") bezieht, von daher ist der link als argumentationsstütze hier nicht angebracht
immer dieses system()-bashing am besten nebst omgwtf-global-variables
-
Mahlzeit,
vielen Dank für die ganzen Antworten, das bringt mich schon weiter
Allerdings stehe ich ein wenig auf dem Schlauch.
Ich versuche das Ganze über ShellExecute zu realisieren.
Ein Bild zu öffnen klappt wunderbar:
ShellExecute(NULL,NULL,"C:\\Bilder\\bild.jpg",NULL, NULL, SW_MAXIMIZE);
So, nun möchte ich eine mp3 abspielen lassen (gut, von mir aus muss es nicht der VLC sein, hauptsache die mp3 lässt sich auf jedem Rechner abspielen..)
ShellExecute(NULL,"open","C:\\Mucke\\JOIN ME.mp3",NULL,SW_SHOWNORMAL);
Hier erhalte ich aber die Fehlermeldung:
17 C:\Dev-Cpp\Projekte\1\main.cpp invalid conversion from `int' to `const CHAR*' 287 C:\Dev-Cpp\include\shellapi.h too few arguments to function `HINSTANCE__* ShellExecuteA(HWND__*, const CHAR*, const CHAR*, const CHAR*, const CHAR*, INT)'
Hmm, laut MSDN müsste das doch korrekt sein?
-
17 C:\Dev-Cpp\Projekte\1\main.cpp invalid conversion from `int' to `const CHAR*'
Zeig' mal Zeile 17...
287 C:\Dev-Cpp\include\shellapi.h too few arguments to function `HINSTANCE__* ShellExecuteA(HWND__, const CHAR, const CHAR*, const CHAR*, const CHAR*, INT)'
Da hast du nur eine NULL vergessen
MfG,
Probe-Nutzer
-
Zeile 17:
ShellExecute(NULL,"open","C:\\Mucke\\JOIN ME.mp3",NULL,SW_SHOWNORMAL);
Probe-Nutzer schrieb:
287 C:\Dev-Cpp\include\shellapi.h too few arguments to function `HINSTANCE__* ShellExecuteA(HWND__, const CHAR, const CHAR*, const CHAR*, const CHAR*, INT)'
Da hast du nur eine NULL vergessen
Tatsächlich
Außerdem habe ich gesehen, dass ich eine Zeile nicht auskommentiert habe *aufmeinenkopfklatsch*
Super, es funktioniert, vielen Dank, eine super Community muss ich sagen
Mein Ziel ist, nur ein kleines Prog zu schreiben, das wie folgt abläuft:
User klickt auf die .exe
Er bekommt ein DOS Fenster mit 3 mp3s zur Auswahl und wählt eine davon, worauf die mp3 abgespielt wird ^^Als nächstes wollte ich schauen, ob es machbar ist, dass der User dieses "Programm" erstmal installieren muss.
Vielen Dank noch mal
-
sothis_ schrieb:
nebst omgwtf-global-variables
Du hast ein F vergessen: omfgwtf.
-
hustbaer schrieb:
sothis_ schrieb:
nebst omgwtf-global-variables
Du hast ein F vergessen: omfgwtf.
tschuldigung
-
Hmm, das Programm will nicht so wie ich will,
und zwar geht es darum, automatisch das Verzeichnis zu finden, dachte dass es mit %username% gehen würde..
Habe folgende Zeilen eingefügt:
char username[256] = {0}; unsigned long laenge = sizeof(username); GetUserName(username, &laenge);
Diese Zeile
cout << "\nUsername: " << username;
gibt mir auch korrekt den Usernamen an.
Wenn ich jetzt aber schreibe
ShellExecute(NULL,"open","C:\\Dokumente und Einstellungen\\%username%\\Desktop\\Mucke\\JOIN ME.mp3",NULL,NULL,SW_SHOWNORMAL);
wird der Quelltext zwar kompiliert; jedoch wird die mp3 nicht abgespielt.
Der Pfad ist korrekt, nur scheint das mit dem %username% nicht klappen.Wie bekomme ich es hin, dass die mp3 auf allen Rechnern abgespielt wird (vorausgesetzt natürlich, dass die mp3 im Ordner Mucke aufm Desktop liegt)?
-
Das %username% wird nicht einfach, ohne noch etwas zu tun, durch den wirklichen aktuellen Benutzernamen ersetzt. Es gibt dafür eine spezielle Funktion:
char path[MAX_PATH + 1]; // ersetzt in % eingefasste Umgebungsvariablen ::ExpandEnvironmentStrings("C:\\Dokumente und Einstellungen\\%username%\\Desktop\\Mucke\\JOIN ME.mp3", path, MAX_PATH + 1); ::ShellExecute(NULL, "open", path, NULL ,NULL, SW_SHOWNORMAL);
Aber das war jetzt kein Problem mehr, das in dieses Forum gehört (WinAPI-Funktionen). Prüfe aber zuerst, ob die mp3-Datei wirklich in diesem Pfad liegt...;)
MfG,
Probe-Nutzer
-
Hey Probe-Nutzer,
vielen Dank für deine Mühen, jetzt ist es PERFEKT
Ja, werde in Zukunft die Fragen in den richtigen Unterforen stellen
Vielen Dank noch mal
Einen schönen Tag noch an die Community
-
$h4rk schrieb:
... hauptsache die mp3 lässt sich auf jedem Rechner abspielen..)
Bist du sicher, dass dieser Code auch auf älteren Betriebssystemen wie ME den richtigen Effekt hat.
@Alle, die die Portabilität aussen vor lassen wollen:
Notfalls kann mans ja so lösen;#ifdef linux system(...) #else ShellExecute(...) #endif
Außerdem kannst du mit externen Playern wie VLC einfacher die Controls (Play, Stop usw.) anzeigen, wenn du sie brauchst.
Mit Lame könnte es theorteisch patentrechtliche Probleme Begen (MP3 -> Fraunhofern). Wenn du als Hintergrundmusik etwas abspielen möchtest, kansnt du genauso OGG nehmen, das ist meines Wissens komplett frei.
Sucht doh auch einfach mal auf Sourceforge nach "C++ MP3 Player". Bestimmt finden sich da interessante Sachen.mfg, Hans