 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 26.10.2005, 21:37 Titel: In mciSendString eingreifen |
|
|
#include <windows.h>
#include <iostream.h>
#pragma comment(lib,"winmm.lib")
int main()
{
cout << "Open file ..." << endl;
mciSendString("open file.mp3", NULL, 0, NULL);
cout << "Play file ..." << endl;
mciSendString("play file.mp3 wait", NULL, 0, NULL);
cout << "MP3 zuende ..." << endl;
mciSendString("close file.mp3", NULL, 0, NULL);
return 0;
}
[/cpp]
Wie man sieht, spielt das Programm in einem Dos-Fenster eine MP3 ab.
Kann man dabei auch auf Nachrichten reagieren ? (Parallel zu mciSendString)
Da im Code ja erst weitergemacht wird, wenn die MP3 abgespielt ist ...
Ansonsten würde ich mal schauen ob man mit DirectX (genauso wie Midi oder wav Dateien) auch MP3's und Avi's abspielen kann ...
Danke schonmal vorweg !
*EDIT*
Habe das mal ausprobiert:
CPP: | int main()
{
cout << "Play file ..." << endl;
mciSendString("play file.avi wait", NULL, 0, NULL);
return 0;
} |
Und es klappt auch perfekt, aber wo ist der Nachteil bei dieser Schreibweise ??
Ich gehe mal davon aus das sie einen hat, wie z.B. Speicherverlust etc. _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 27.10.2005, 08:18 Titel: |
|
|
Hi,
jo endlich mal einer der weiß was Qualität ist: MCI!
Mit MCI kann man sehr viele Dinge sehr einfach machen, z.B. die Position abfragen: CPP: | bool mci::getPosition (void)
{
char buffer[512];
if (::mciSendString("status mp3player position", buffer, 512, NULL) != 0)
{
// Es gab einen Fehler
::SetWindowText (status_, "Unable to get position");
return (false);
}
// Umrechnungen durchführen
unsigned long ms = ::atoi(buffer); // Position in Millisekunden
unsigned long sek = ms / 1000; // Milisekunden umgerechnet in Sekunden
unsigned long min = sek / 60; // Die Sekunden umgerechnet in Minuten
unsigned long hours = min / 60; // Die Minuten umgerechnet in Stunden
unsigned long sek2 = sek-(hours*60)-(min*60); // Sekunden darf nicht größer als 60 sein..
// HHMMSS umwandlung
::wsprintf (buffer, "%i:%i:%i", hours, min, sek2);
// Position anzeigen
::SetWindowText (status_, cmd);
return (true);
} |
Wie Du sicherlich schon bei anderen MCI Anwendungen z.B. Windows Media Player oder WinAMP gesehen hast, basieren diese Anwendungen auf Threads. Würdest Du den Player in einen Thread stopfen, wäre das Programm nicht mehr blockiert und Du könntest dann z.B. mit oben geposteter Funktion den Status abfragen und ausgeben
DirectX für Player eignet sich eigentlich sogut wie gar nicht, verbraucht zuviele Resourcen und andere Anwendungen werden z.B. durch die Benutzung von Direct3D Blockiert sowie durch DirectShow.
Daher: MCI  _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 27.10.2005, 11:09 Titel: |
|
|
Ahh .. sehr gut
Das hat mir geholfen - Danke
Ich kann jetzt zwar nicht bei der Konsolen-Anwendung bleiben, aber das sollte es auf kurz oder lang ja sowieso nicht sein  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 27.10.2005, 12:10 Titel: |
|
|
Mat
Threads gehen auch in der Consolenumgebug Such mal in der MSDN nach "CreateThread" oder Threads im allgemeinen, da gibt es haufenweise Samples in der Consolenumgebung  _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 28.10.2005, 10:38 Titel: |
|
|
Tolle sache aber kann man MCI auch dazu bewegen Videos in dem Fenster anzuzeigen von denen sie gestartet werden? |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 28.10.2005, 10:42 Titel: |
|
|
Chriss hat Folgendes geschrieben: | Tolle sache aber kann man MCI auch dazu bewegen Videos in dem Fenster anzuzeigen von denen sie gestartet werden? |
ja kann man  _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 28.10.2005, 11:30 Titel: |
|
|
Dragon hat Folgendes geschrieben: | Chriss hat Folgendes geschrieben: | Tolle sache aber kann man MCI auch dazu bewegen Videos in dem Fenster anzuzeigen von denen sie gestartet werden? |
ja kann man  |
Könntest du veraten wie ^^
Mich würde es auch brennend interessieren, meine Vermutung liegt ja bei wsprintf() ...  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.10.2005, 12:10 Titel: |
|
|
CPP: | int myPlayAvi (HWND hWnd, char *filename, int loop)
{
char cmd[300];
wsprintf(cmd, "open \"%s\" alias mympeg type MPEGVideo style child", filename);
if (mciSendString(cmd, 0, 0, 0) != 0)
{
MessageBox(NULL, "MCI-Error: Kann Datei nicht öffnen!", "Fehler", 0);
return -1;
}
wsprintf(cmd, "window mympeg handle %lu", hWnd);
if (mciSendString(cmd, 0, 0, 0) != 0)
{
wsprintf(cmd, "MCI-Error: Kann window handle %ld nicht setzen", hWnd);
MessageBox(NULL, cmd, "Fehler", 0);
return -1;
}
wsprintf(cmd, "play mympeg from 0");
if (loop) wsprintf(cmd, "%s repeat", cmd);
if (mciSendString(cmd, 0, 0, 0) != 0)
{
MessageBox(NULL, "MCI-Error: Kann Datei nicht absielen!", "Fehler", 0);
return -1;
}
return 0;
}
int myStopAvi (void)
{
char cmd[300];
wsprintf(cmd, "close mympeg");
if (mciSendString(cmd, 0, 0, 0) != 0)
{
MessageBox(NULL, "MCI-Error: Kann Datei nicht schließen!", "Fehler", 0);
return -1;
}
return 0;
} | Sämtliche Codecs, die installiert sind, kann er theoretisch abspielen - sogar mit sound
Als handle könnt ihr das Hauptfenster oder was auch immer eingeben. Für Spiele ist evtl noch interessant, dass man bei play auch den Parameter Fullscreen in den cmd-string setzen kann. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 01.11.2005, 14:50 Titel: |
|
|
Weiß jemand wie man solch ein Video auf dem Fenster positionieren kann? Bei google hab ich bisher nur gefunden wie es bei VB funktioniert. Dort wird einfach ein bildobjekt erzeugt und dem MCI einfach das Handel des Bildobjekts übergeben (so wie in dem Bsp. von Patrick)
Kann jemand was damit anfangen?
Zudem würde es mich interesieren ob man soch ein Video auch in der Größe Skalieren kann. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
|
Nach oben |
|
 |
alexm Mini JLI'ler

Anmeldedatum: 20.11.2005 Beiträge: 15 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 20.11.2005, 20:12 Titel: |
|
|
ah endlich ein funktionierendes beispiel um mp3's abzuspielen!!
allerdings musste ich bei mir
am anfang hinzufügen.
keine ahnung warum. vielleicht kann mir das wer erklären?
Zuletzt bearbeitet von alexm am 20.11.2005, 20:18, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
alexm Mini JLI'ler

Anmeldedatum: 20.11.2005 Beiträge: 15 Wohnort: Wien Medaillen: Keine
|
Verfasst am: 20.11.2005, 20:18 Titel: |
|
|
in eine win32 anwendung kann man das aber so nicht einbinden, oder?
CPP: | // mp3playwin.cpp : Definiert den Einsprungpunkt für die Anwendung.
//
#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
#pragma comment(lib,"winmm.lib")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
// ZU ERLEDIGEN: Fügen Sie hier den Code ein.
cout << "Open file ..." << endl;
mciSendString("open NickelbackSomeday.mp3", NULL, 0, NULL);
cout << "Play file ..." << endl;
mciSendString("play NickelbackSomeday.mp3 wait", NULL, 0, NULL);
cout << "MP3 zuende ..." << endl;
mciSendString("close NickelbackSomeday.mp3", NULL, 0, NULL);
return 0;
}
#include "stdafx.h"
|
danach erhalte ich die fehlermeldung:
D:\C++ Projekte\mp3playwin\mp3playwin.cpp(16) : error C2065: 'mciSendString' : nichtdeklarierter Bezeichner
warum kommt dieser fehler wenns als konsolenanwendung ja funktioniert? |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
sp3cK-r0LL3 Senior JLI'ler

Alter: 34 Anmeldedatum: 18.06.2004 Beiträge: 275
Medaillen: Keine
|
Verfasst am: 20.11.2005, 22:01 Titel: |
|
|
funktioniert z.B. der vlc auch über die mci? wie kann er dann so sachen wissen wie: sync failed. oder so was? _________________ sex is updatedb; locate; talk; date; cd; strip; look; touch; finger; unzip; uptime; gawk; head; apt-get install condom; mount; fsck; gasp; more; yes; more; umount; apt-get remove --purge condom; make clean; sleep |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 20.11.2005, 22:23 Titel: |
|
|
sp3cK-r0LL3
Für sowas gibt es Konstanten die man per Recieverfunktion abfangen kann. Ähnlich wie bei der Win32INetAPI wird für alles eine Message an eine Recieverfunktion gesendet, die man dort selbst implementieren kann um auf das Ereignis einzugehen. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|