• Hallo!

    Ich habs nach langem tüfteln doch endlich geschafft Bilder aus einer Webcam mit DirectX (DirectShow) zu lesen. Das Problem war, dass man nach dem Starten der Kamera nicht gleich beginnen kann den Stream einzulesen, da DirectX anscheinend noch etwas initialisieren muss (keine Ahnung). Auf jeden Fall hab ich gesehen, dass andere Programme nach dem Starten der Kamera ein Sleep(500) einbauen bevor sie das erste Frame einlesen. Nachdems bei mir bei Sleep(500) ab und zu noch immer nicht geht, hab ichs auf Sleep(1000) gesetzt und es funktioniert prima. Irgendwie sehr schlimm Sleep zu verwenden, aber wenns nicht anders geht..

    Jetzt aber zu meinem Problem: Ich möchte nun in meinem Programm Videos auch laden und es funktioniert auch alles prima, nur gibts es eine Stelle, an der es ein großes Problem gibt. Nachdem ich nämlich die Kamera gestartet habe und später wieder gestoppt habe, kann ich keine Videos mehr öffnen. Auch Sleep hilft hier nichts mehr :distur:.

    Ich öffne die AVI-Files mit AVIFileOpen und dort passiert auch schon der Fehler. Ich weiß leider nicht welcher Fehler genau passiert, weil ich die Funktion aus einer Library verwende und diese den Rückgabewert nicht weitergibt. Folgende Werte können auftreten:


    AVIERR_BADFORMAT
    The file couldn't be read, indicating a corrupt file or an unrecognized format.

    AVIERR_MEMORY
    The file could not be opened because of insufficient memory.

    AVIERR_FILEREAD
    A disk error occurred while reading the file.

    AVIERR_FILEOPENA disk error occurred while opening the file.


    Das erste und das dritte würde ich ausschließen, aber ich könnte auch nichts damit anfangen, wenn ich wüsste welcher Wert zurückgeliefert wird, weil ich mir nicht erklären kann, warum das nur passiert, nachdem ich die Kamera an hatte (und anschließend sauber geschlossen).


    Hat jemand einen Rat?

    mfg

    640K ought to be enough for anybody. :eek2:

  • Wenn ich das richtig verstanden habe willst du Videos sowohl von einer Kamera als auch von einer AVI-Datei einlesen können. Im Prinzip gibt es also 2 unabhängige Komponenten, wobei eine die andere stört.

    Ich würde mal genau untersuchen ob beim Starten oder Beenden der Kamera (oder sonst irgendwo in deinem Programm) nicht versehentlich auf nicht allozierte Speicherbereiche geschrieben wird. Das verursacht nämlich manchmal nicht sofort einen Fehler, sondern bringt erst später laufenden Code zum Absturz. Ich hatte auch aus diesem Grund mal fast den gleichen Fehler, wo ein ganz unschuldiger Aufruf plötzlich unerklärlicherweise gescheitert ist (bei mir war es das Öffnen einer Datei mit ifstream).

    Eigentlich halte ich keinen der möglichen Fehlercodes von AVIFileOpen für realistisch, weil der Aufruf dann auch vor Verwendung der Kamera scheitern müsste (AVIERR_MEMORY wäre wohl noch am ehesten möglich, aber auch nur falls der Kamera-Code ein riesiges Speicherloch hinterlässt). Daher glaube ich dass AVIFileOpen nicht von sich aus scheitert, sondern eher dass in Wirklichkeit ein anderer Code daran schuld ist.

  • Du hast richtig verstanden und es funktioniert auch beides unabhängig voneinander. Folgendes hab ich ausprobiert:

    1.) AVI laden -> abspielen -> OK
    2.) Kamera laden -> abspielen -> OK
    3.) AVI laden -> abspielen -> Kamera laden -> OK
    4.) Kamera laden -> abspielen -> AVI laden -> FEHLER

    Also da kanns ja dann nur ein Fehler der Kamera sein. Leider les ich nicht direkt über DirectShow ein, da ich mit meinem neuen Compiler DirectShow nicht verwenden kann (JA SOWAS GIBTS AUCH). In der Firma wurde daher eine Library programmiert, die das Problem mit DirectShow irgendwie umgeht, und ich kann über diese Library Kameras verwenden.

    Ich nehm an, dass dort irgendwo das Problem liegt, weil mein Code eigentlich sehr sauber ist und ich alles mögliche schon probiert hab. Bin ich jetzt machtlos? Es muss ja eine Lösung geben. Ich hab auch schon versuch das ganze Objekt der Kameraklasse zu löschen.. kein Erfolg. Ich bin ratlos..

    640K ought to be enough for anybody. :eek2:

  • Ich finde auch dass es ziemlich eindeutig an der Kamera liegt. Für mich schaut es nach wie vor so aus als ob durch die Verwendung der Kamera am Heap irgendwas zerstört wird, das spätere Funktionsaufrufe zum Absturz bringt (ist eventuell ein Fehler in der Library, mit deren Hilfe DirectShow angesprochen wird).

    Nachdem du nicht direkt auf DirectShow zugreifst ist das relativ schwer zu testen, aber ich würde mal probieren den Code für die Kamera soweit es geht stückweise auszukommentieren (z.B. Öffnen und Schließen, aber dazwischen nicht verwenden). Vielleicht lässt sich das Problem dadurch weiter eingrenzen. Ich bin das Problem bei mir genauso angegangen, bis ich es auf den Aufruf einer Funktion eingrenzen konnte. Und da hat sich dann rausgestellt dass darin ein Zugriff in einen nicht allozierten Speicher erfolgte.

  • Ja, das mach ich eh auch immer so und es liegt eindeutig am stoppen der Kamera. Komischerweise funktionierts bei mir nicht, aber bei einem Kollegen schon. Es dürfte daher an einem Versionskonflikt irgendeiner dll liegen. Aber gut zu wissen, wo der Fehler liegt. Wenn ich den Versionskonflikt gefunden hab, werd ich ihn hier reinposten. Vielleicht hilfts mal wem.

    mfg

    640K ought to be enough for anybody. :eek2:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!