AnimatedControl - Converter



  • Ich habe vergessen zu erwähnen, dass dieser Fehler nur auftritt, wenn ich MCIWndCreate aufrufe. Andernfalls gibt es keine Meldung.

    Hier jetzt nochmal der derzeitige Code:

    char *command = "open \"data\\test.avi\" type mpegvideo alias test";
    MCIERROR a = mciSendString(command, NULL, NULL, NULL);
    MCIERROR a_2 = mciSendString("play test", NULL, NULL, NULL);
    

    Dieser Funktioniert Fehlerfrei, auch mit dem relativen Pfad. Du hast jedoch geschrieben, dass ich dem open-Befehl ein Fenster Handle mitgeben kann. Wie würde dieser denn Aussehen?

    MfG



  • Ist schon lang her, dass ich was damit gemacht habe. Ich hätt gedacht, das müsste eben mit MCIWndCreate funktionieren, vielleicht hast du da noch was falsch gemacht.

    Es gibt auch einen window Befehl:

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd743882(v=vs.85).aspx

    Müsste dann irgendwie so gehen:

    window ALIAS handle HWND

    Die großgeschriebenen Teile musst durch die entsprechenden Werte austauschen.



  • Unreg schrieb:

    Ich wusste nicht, dass es noch ander Bibliotheken gibt.
    Ich verwende jetzt MCI und habe es schon kurz getestet.

    Was willst du denn eigentlich machen? *

    MCI ist halt schon reichlich alt - vielleicht gibt's ja eine neuere Technologie die ähnlich einfach zu verwenden ist.

    *: Also was kann man sich unter "Video abspielen" vorstellen? Ein grosses Video so als "Video" halt, oder willst du zig/hunderte kurze und kleine Mini-Videos in einem Fenster abspielen (z.B. als animierte Buttons), oder ...?



  • Hallo,

    @Mechanics:
    Das habe ich auch schon vorher mal ausprobiert, jedoch Erfolgslos. Es wird einfach in einem neuen Fenster dargestellt. Als Error bekomme ich diesen hier zurück: MCIERR_BAD_CONSTANT

    @hustbaer
    Also es sind nur kurze Videos, so ca. 10 Sekunden. Auch sind es nur maximal 10 Videos die auf einmal Dargestellt werden müssen. Die Videos sollten einfach auf das Fenster an einer bestimmten Position dargestellt und abgespielt werden, also auf keinem Button o.ä.
    Deshalb wollte ich ursprünglich ja auch den AnimationControl verwenden.

    MfG



  • Unreg schrieb:

    Als Error bekomme ich diesen hier zurück: MCIERR_BAD_CONSTANT

    Das heißt halt, ein Parameter ist falsch. Sicher, dass du ein richtiges Handle richtig formatiert übergibst?

    MCI ist natürlich schon sehr alt, aber grundsätzlich funktionieren muss es. Funktioniert z.B. immer noch problemlos im Irfan Viewer.



  • Ja, ich hab es mit dem erstellten Window versucht. Recht viel falsch machen kann man da doch nicht.



  • Poste einfach mal deinen kompletten Code, kann ja nicht so viel sein.



  • HWND m_vid = MCIWndCreate(hWndImage, GetModuleHandle(NULL), WS_CHILD | WS_VISIBLE| MCIWNDF_NOMENU| MCIWNDF_NOTIFYALL| MCIWNDF_NOPLAYBAR, "data\\test.avi");
    char *command = "open \"data\\test.avi\" type mpegvideo alias test";
    MCIERROR a = mciSendString(command, NULL, NULL, NULL);
    MCIERROR a_1 = mciSendString("window test handle m_vid", NULL, NULL, NULL);
    MCIERROR a_2 = mciSendString("play test", NULL, NULL, NULL);
    


  • Was soll Windows mit deinem Variablennamen anfangen können? Du musst schon den Wert der Variable in den String schreiben. Und ich glaub, für den window Befehl brauchst du MCIWndCreate nicht, bin mir jetzt aber nicht sicher.



  • @Unreg
    Und muss es in C bzw. C++ implementiert sein?

    In C# klickst du dir in ein paar Minuten ne Form oder ein WCF-Fenster zusammen wo du in ein paar weiteren Minuten deine 10 Videos mit nem MediaPlayer Control drinnen laufen hast (je einem natürlich).



  • @Mechanics
    Wenn ich das mit MCIWndCreate erstellte Fenster oder mein Main-Window verwende, bekomme ich wieder den BAD_CONSTANT Error.

    @hustbaer
    Ja, es muss in C/C++ sein.

    Ich glaub es wird wirklich mal zeit auf eine andere API umzusteigen...



  • Ich hab das Gefühl, dass du immer noch was falsch machst. Du gibst doch anscheinend wirklich "m_vid" rein, und nicht den Wert davon.



  • Dann mal hier der Code:

    HWND m_vid = MCIWndCreate(hWndImage, GetModuleHandle(NULL), WS_CHILD | WS_VISIBLE| MCIWNDF_NOMENU| MCIWNDF_NOTIFYALL| MCIWNDF_NOPLAYBAR, "data\\test.avi");
    char *command = "open \"data\\test.avi\" type mpegvideo alias test";
    char value_hwnd[255] = "window test handle ";
    char value_hwnd2[255];
    sprintf(value_hwnd2, "%p", m_vid);
    strcat(value_hwnd, value_hwnd2);
    
    MCIERROR a = mciSendString(command, NULL, NULL, NULL);
    MCIERROR a_1 = mciSendString(value_hwnd, NULL, NULL, NULL);
    MCIERROR a_2 = mciSendString("play test", NULL, NULL, NULL);
    

    Auch in der Debugging-Console stimmen die Werte überein.



  • Habs grad ausprobiert, funktioniert bei mir wunderbar. Ich benutz aber Qt und bin zur Zeit etwas von den entsprechenden String Funktonen verwöhnt. Hab schon ewig nicht mehr mit C Strings gearbeitet, kann jetzt also nicht sagen, inwiefern das passt. Was sicher falsch ist, ist der p Parameter, du brauchst eher d. Ansosten ist value_hwnd2 wohl sowohl uninitialisiert, als auch zu lang, weil nicht 0 terminiert nach dem Wert.



  • Super, %d hats ausgemacht.

    Vielen Dank für deine Geduld und Lösungen. 🙂



  • Hallo,
    nun hätte ich jedoch noch eine letzte Frage: Ist es möglich mit MCI auch Videos von der Resource abzuspielen?

    MfG



  • Nein, aber das wird auch mit keinem anderen Framework ohne weiteres gehen. Das einfachste ist, die Datei aus der Resource ins Temp Verzeichnis zu schreiben und von dort abzuspielen.
    Mit DirectShow hättest du zwar die Möglichkeit, eigene Source Filter zu schreiben, aber das ist so viel Aufwand, dass ich mir das erst gar nicht näher anschauen würde.



  • Ja, dass es mit DirectShow mit viel arbeit geht wusste ich. Wollte nur mal fragen ob es bei MCI evtl. die Möglichkeit gibt.
    Danke. 🙂


Anmelden zum Antworten