JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

In mciSendString eingreifen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
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

BeitragVerfasst am: 26.10.2005, 21:37    Titel: In mciSendString eingreifen Antworten mit Zitat

#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 ...

Wink 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 27.10.2005, 08:18    Titel: Antworten mit Zitat

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 Smile

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 Wink
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 27.10.2005, 11:09    Titel: Antworten mit Zitat

Ahh .. sehr gut Wink

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 Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 27.10.2005, 12:10    Titel: Antworten mit Zitat

Mat
Threads gehen auch in der Consolenumgebug Wink Such mal in der MSDN nach "CreateThread" oder Threads im allgemeinen, da gibt es haufenweise Samples in der Consolenumgebung Smile
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 28.10.2005, 10:38    Titel: Antworten mit Zitat

Tolle sache aber kann man MCI auch dazu bewegen Videos in dem Fenster anzuzeigen von denen sie gestartet werden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 28.10.2005, 10:42    Titel: Antworten mit Zitat

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 Wink
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 28.10.2005, 11:30    Titel: Antworten mit Zitat

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 Wink


Könntest du veraten wie ^^
Mich würde es auch brennend interessieren, meine Vermutung liegt ja bei wsprintf() ... Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.10.2005, 12:10    Titel: Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 01.11.2005, 14:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.11.2005, 15:58    Titel: Antworten mit Zitat

Du müsstest ein MCI_WINDOW command nutzen um das zu erreichen:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mci_window.asp
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
alexm
Mini JLI'ler



Anmeldedatum: 20.11.2005
Beiträge: 15
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 20.11.2005, 20:12    Titel: Antworten mit Zitat

ah endlich ein funktionierendes beispiel um mp3's abzuspielen!!
allerdings musste ich bei mir
CPP:
#include "stdafx.h"

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
alexm
Mini JLI'ler



Anmeldedatum: 20.11.2005
Beiträge: 15
Wohnort: Wien
Medaillen: Keine

BeitragVerfasst am: 20.11.2005, 20:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 20.11.2005, 21:36    Titel: Antworten mit Zitat

alexm
Wegen dem "stdafx.h": Du benutzt Vorkompilierte Headerdatein. Deshalb immer "Leere Projekte" erstellen.

Wegen dem Fehler: http://www.jliforum.de/board/viewtopic.php?p=53996
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
sp3cK-r0LL3
Senior JLI'ler


Alter: 34
Anmeldedatum: 18.06.2004
Beiträge: 275

Medaillen: Keine

BeitragVerfasst am: 20.11.2005, 22:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 20.11.2005, 22:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum