PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mit C++ mplayer benutzen



8shadow8
26-11-2004, 13:08
Hallo,
ich weiß dass es vielleicht ein bisschen sinnlos ist, aber ich würde gerne wissen wie ich aus einem C++ Programm mit mplayer ein Mp3 öffnen kann. Wie es geht weiß ich schon, aber das Problem ist, dass man bei der Pfandangabe anscheind keine Leerzeichen benutzen kann. Mplayer wird im C Programm so gestartet:


system ("mplayer /home/shadow/lied.mp3");

Das funktioniert auch soweit. Wenn ich jetzt aber z.B ein Mp3 öffnen will, das im Ordner Eigene Datein liegt kommt er nich mehr klar. Aus der bash würde ich das Mp3 so öffnen:


mplayer /home/shadow/Egeine\ Datein/lied.mp3;

Gebe ich diesen Befehl allerdings in das C Programm, scheint der Pfand dann aber nicht richtig an mplayer übermittelt werden, weil C++ mit dem Leerzeichen vom Ordner "Eigene Datein" anscheind nicht klar kommt. Nun meine Frage ;) :
Wie kann ich das in C++ machen, dass er Leerzeichen in einer Pfadangabe auch als Leerzeichen erkennt?

ContainerDriver
26-11-2004, 13:54
Servus.
Ich nehme mal an, das Code-Beispiel beeinhaltet nur einen Abschreibfehler.
Vlt. gehts so:
system("mplayer \"/pfad/mit leerzeichen\"");

Ich habe es nicht ausprobiert, müsste aber denke ich mal gehen.

Gruß, Florian

8shadow8
26-11-2004, 14:53
jo, danke funktioniert

8shadow8
26-11-2004, 15:19
jetzt hät ich nochmal ne Frage zu dieser system() Funktion.
Wie kann ich dort einen Befehl ausführen lassen, der sich aus einer Variablen und einem festgelegten String zusammensetzt.
Also: Ich speichere in einer Textdatei den Pfad zu einem Mp3, diese Datei lese ich dann mit dem Programm ein und möchte dann das Mp3 was in dieser Textdatei steht abspielen. Also ungefähr so:

system("mplayer" pfadausdertextdatei)
Wenn ich den kompletten Befehl in der Textdatei speichere funktioniert mein Programm schon, aber ich würde halt gerne nur den Pfad zum Mp3 speichern.

anda_skoa
26-11-2004, 15:24
void runMplayer(const std::string& file)
{
std::string command = "mplayer + " \"" + file + "\"";
system(command.c_str());
}


Ciao,
_

8shadow8
26-11-2004, 15:42
Das ist ja langweilig lol
ich hab doch noch ne eigene Lösung gefunden lmao:

char string[60];
string[0]=109; //m
string[1]=112; //p
string[2]=108; //l
string[3]=97; //a
string[4]=121; //y
string[5]=101; //e
string[6]=114; //r
string[7]=32; //Leerzeichen
int i=8;
cout<<"lese Datei..";
ifstream in("playlist.txt");
while(!in.eof())
{
char ch;
ch=in.get();
cout<<ch;
string[i]=ch;
i++;
}
cout<<string;

system(string);

ich habs halt gern so kompliziert wie möglich.

Joghurt
26-11-2004, 18:33
char string[60];
string[0]=109; //m
string[1]=112; //p
string[2]=108; //l
string[3]=97; //a
string[4]=121; //y
string[5]=101; //e
string[6]=114; //r
string[7]=32; //Leerzeichen
ich habs halt gern so kompliziert wie möglich.Das sieht man. Das kannst du auch einfach so schreiben:
char string[60]="mplayer ";

PS: Wundert mich, dass du nicht
0[string] = 0155;
1[string] = 0160;
// etc geschrieben hast... :D

panzi
26-11-2004, 22:31
aber was wenn der pfad ein " oder ' beinhaltet? das kann unter linux tatsächlich der fall sein!


// eine in C++ überladene system funktion
// hoff das const is an der richtigen stelle
int system( const char * app, size_t argc, char const * argv[] ) {
std::string cmd;

escape( app, cmd );

for( size_t i = 0; i < argc; ++ i ) {
cmd += " ";
escape( argv[ i ], cmd );
}

return system( cmd.c_str() );
}

void escape( const char * src, std::string & dest ) {
dest += "\"";

while( src ) {
switch( *src ) {
case '\"': dest += "\\\""; break;
case '\'': dest += "\\'"; break;
case '\\': dest += "\\\\"; break;
default: dest += *src;
}
++ src;
}

dest += "\"";
}

8shadow8
28-11-2004, 10:59
lol, vielen danke für den Tip Joghurt :D und allen anderen natürlich auch.

blackpearl
28-11-2004, 16:11
ich habe da auch mal direkt ne frage:

//edit:

Wie kann ich ne mp3 file über kaffeine abspielen, OHNE das sich dabei der GUI öffnet??//

VIELEN DANK

Manuel

anda_skoa
29-11-2004, 14:39
Naja, die Idee eier GUI Applikation ist ansich schon, eine GUI zu haben :)
Man kann ja einen Commandline Player starten, wenn man keine möchte.

Oder als workaround das Playerfenster mit Hilfe der Kommandozeilen Option "geometry" in den nicht sichtbaren Bereich verschieben.

Ciao,
_