Markus**: .net Programmierung COM-DexterLib Library

Hallo Forum!

Ich habe nach einer Lösung gesucht, um Videos vorwärts und rückwärts in beliebiger Geschwindigkeit - also auch Frame für Frame - abzuspielen. Da ich kein brauchbares Control o.ä. gefunden habe, habe ich mich entschlossen, das Ganze mittels MediaDetClass aus dem DexterLib Library in einer PictureBox zu realisieren.
Dazu habe ich die GetBitmapBits-Methode benutzt um die "Snapshots" zu erstellen und mit einem Timer die alle n-Millisekunden die PictureBox aktualisiert.

Soweit funktioniert das auch, allerdings läuft das Ganze nicht rund. Es wird stetig langsamer, bis die Bilder nach ein paar Sekunden wieder mit "normaler" Geschwindigkeit abgespielt werden, dann geht das ganze von vorn los.
Ich hatte den GarbageCollector iin Verdacht, da ich ja jede Menge Bitmap-Objekte erzeuge. Mein versuch den Collector regelmäßig manuell aufzurufen, brachte allerdings keine Besserung bzw. Änderung des Verhaltens.

Dass das Ganze "bremst" liegt offenbar an dieser Methode in meinem Code:

  
    public Bitmap getBitmap(int width, int height, double picPosition)  
    {  
        unsafe  
        {  
            byte* res = (byte*)ptr1.ToPointer();                //Pointer Erzeugen  
            dl.GetBitmapBits(picPosition, ref bmpSize, ref *res, width, height);  
            //BitmapDaten aus Pointer Kopieren. Falls kein Bitmap Objekt erwünscht, mit Marshal.Copy() in ein Bytearray kopieren.  
            Bitmap bmp = new Bitmap(width, height, width * 3, PixelFormat.Format24bppRgb, new IntPtr(res + bmpHeaderSize));  
            bmp.RotateFlip(RotateFlipType.Rotate180FlipX);  
            return (bmp);  
        }  
    }  

hat jemand 'ne Idee, wie ich das verbessern kann?

Gruß, MHI

  1. Hi!

    Soweit funktioniert das auch, allerdings läuft das Ganze nicht rund. Es wird stetig langsamer, bis die Bilder nach ein paar Sekunden wieder mit "normaler" Geschwindigkeit abgespielt werden, dann geht das ganze von vorn los.

    Hast du dabei mal das System beobachtet, besonders den allgemeinen Speicherverbrauch und die Auslagerungsdatei?

    hat jemand 'ne Idee, wie ich das verbessern kann?

    Ressourcenverbrauchende Teile sollten in ein using-Block gestellt werden. Wird bei dir vielleicht nicht gehen, weil da ja noch die PictureBox im Spiel ist und du damit kein definiertes Ende der Nutzung des Bitmaps hast.

    return (bmp);

    Warum klammerst du denn da das bmp. In anderen Systemem führt sowas dazu, dass du nun keine Variable sondern das Ergebnis eines Ausdrucks hast. Ob der C#-Compiler so intelligent ist, die überflüssigen Klammern wegzuoptimieren, weiß ich nicht.

    Lo!

    1. Hi!

      Guten Tag!

      Hast du dabei mal das System beobachtet, besonders den allgemeinen Speicherverbrauch und die Auslagerungsdatei?

      Ja - das System habe ich schon betrachtet, während das Programm ausgeführt wird. Der Speicherbedarf ist konstant und schwankt nur leicht, bie der Auslagerungsdatei hab ich jetzt nichtmal 'ne Idee, wie ich das überhaupt überwachen soll.
      Ansonsten geht die Prozessor-Auslastung hoch, allerdings längst nicht zum Anschlag.

      hat jemand 'ne Idee, wie ich das verbessern kann?

      Ressourcenverbrauchende Teile sollten in ein using-Block gestellt werden. Wird bei dir vielleicht nicht gehen, weil da ja noch die PictureBox im Spiel ist und du damit kein definiertes Ende der Nutzung des Bitmaps hast.

      Hatte ich auch schon überlegt. - ggf. muß ich alles zusammen in ein UserControl bauen, was ich dann implementiere.

      return (bmp);

      Warum klammerst du denn da das bmp. In anderen Systemem führt sowas dazu, dass du nun keine Variable sondern das Ergebnis eines Ausdrucks hast. Ob der C#-Compiler so intelligent ist, die überflüssigen Klammern wegzuoptimieren, weiß ich nicht.

      Das mit den Klammern war ein versehen, hatte vorher mal nen Cast drin, davon sind die übrig geblieben. Eine Änderung des Programmverhaltens tut sich allerdings auch ohne klammern nicht.

      Gruß und dank,

      Markus**

      1. Hi!

        [...] bie der Auslagerungsdatei hab ich jetzt nichtmal 'ne Idee, wie ich das überhaupt überwachen soll.

        Über den Taskmanager kann man da zuschauen. In neueren Systemen hat man ja auch noch den Ressourcen-Monitor, der sollte auch was dazu zeigen

        Lo!

        1. Hi!

          Moin

          Über den Taskmanager kann man da zuschauen. In neueren Systemen hat man ja auch noch den Ressourcen-Monitor, der sollte auch was dazu zeigen

          Jo, ebenso hab ich "geschaut" - allerdings sind die Schwankungen so gering, dass ich mit den Mitteln mal sagen möchte: Es tut sich Speichermäßig annähernd nichts.

          Gruß, Markus**

          1. Hi!

            Es tut sich Speichermäßig annähernd nichts.

            Hmm, dann sieht es irgendwie nicht so aus, als ob unaufgeräumte Objektleichen die Ursache sind. Andere Ideen hab ich auch nicht.

            Lo!

            1. Hi!

              Es tut sich Speichermäßig annähernd nichts.

              Hmm, dann sieht es irgendwie nicht so aus, als ob unaufgeräumte Objektleichen die Ursache sind. Andere Ideen hab ich auch nicht.

              Sollte auch nicht... zum Testen hol' ich bilder in 320*240 raus... also ~ 300kb pro Bild -> ~7MB pro sekunde, was ein normaler Speicher theoretisch schaffen sollte...

              denke eher, dass die MediaDetClass für jedes "Bild" nen Stream auf die Videodatei aufmacht und dort der Engpass passiert...

              Keinen Plan ob ich das Video irgendwie in den speicher laden kann um das zu umgehen...

              Lo!

              1. Ich nochmal....

                Hmm, dann sieht es irgendwie nicht so aus, als ob unaufgeräumte Objektleichen die Ursache sind. Andere Ideen hab ich auch nicht.

                Kennt vielleicht jemand nen anderes Library mit dem sich mein Vorhaben "ruckelfrei" realisieren lässt?

                Gruß, Markus**