Ich erhalte eine H.264 stream
von einem DVR mit seinem SDK. Es gab Speicherverluste und ich dachte, dass es das SDK war, das alle Lecks verursachte. Aber als ich den Stream aufzeichnete und die Frames eins nach dem anderen von der Festplatte abspielte (ohne irgendwelche Drittanbieter-DLLs), bemerkte ich, dass das Problem nicht die DLL ist, sondern der Stream selbst.H.264 Frames Speicher Leck mit einigen Decodern
Seltsamerweise ist DivX H264 Decoder
der einzige Codec, der keinen Speicherverlust verursacht, aber wenn der Stream für eine lange Zeit läuft, stürzt manchmal auch der DivX-Dekoder ab. Ich würde lieber Microsoft DTV-DVD Video Decoder
verwenden, aber es verursacht große Speicherverluste und lässt viele Frames fallen. Viele andere H.264-Decoder, die ich ausprobiert habe, verhalten sich genauso.
Ich untersuchte die h.264 frames
mit einigen h.264 parsers
Vergleich mit einigen anderen problemlosen Streams, aber ich habe nichts offensichtlich aus den Protokollen bemerkt.
Da mein Problem über die h.264 Frames Struktur ist, habe ich einen Quellfilter namens FramesFromFileSourceFilter
vorbereitet, den Sie unten herunterladen können.
http://www.akaydin.com/directshow/FramesFromFileSourceFilter.zip
Es ist ein Visual Studio 2008
Projekt und alle Abhängigkeiten werden in der ZIP-Datei in relativ befindet Ordner (einschließlich der h.264 Frames) enthalten. Alles, was Sie tun müssen, ist, das Projekt zu kompilieren, die Ausgabe mit regsvr32.exe
zu registrieren und den Filter mit jedem gewünschten h.264-Decoder von GraphEdit oder GraphStudio auszuführen. Beispielgrafiken sind unten.
Auch h264 Rahmen sind als einzelne raw h264 Datei auf dem Link, unter dem von VLC spielbar ist (mit falschem FPS seit Original war 12 FPS).
http://www.akaydin.com/directshow/stream.zip
Frage:
Was könnte die Speicherleck Probleme mit vielen bekannten H264 Decoder außer DivX-Decoder verursachen. Was ist los mit diesem Stream?
aktualisieren 1
wird Lesedaten Gewinde entfernt und Funktionalität bewegt in FillBuffer ohne Puffer und Flags zu verwenden. Das Problem bleibt gleich.
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate1.zip
aktualisieren 2
Update1 wurde mit Sleep()
in FillBuffer()
Funktion, die einige Probleme verursachte. Jetzt entfernte ich die Sleep()
und benutzte SetTime()
, um ~ 12 FPS zu haben. Dies löste auch die Droprahmenprobleme, löste jedoch keine Speicherprobleme.
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate2.zip
Speichererhöhung bei Working Set
tritt nur. Virtual Bytes
und Private Bytes
scheinen stabil zu sein.Was könnte fortlaufende Working Set
Speicherinkremente verursachen, die nur mit passiert?
Eigentlich hat mein echter Filter einen besseren Mechanismus, das ist der vereinfachte. Da es zwischen den Bildern jedoch einen Zeitraum von 83 Millisekunden gibt, sollte die Nebenläufigkeit nicht der Fall sein. Außerdem verursacht DivX Decoder keine Speicherlecks. Ich glaube immer noch, dass Streams dieses Problem verursachen. Außerdem funktioniert derselbe Filter gut mit anderen h.264-Streams von anderen Geräten ohne Speicherlecks mit denselben Decodern. –
Vielleicht macht es Ihr echter Filter besser, aber dieser Code verursacht Heap-Korruption. Auf einem anderen Lauf, als es durchkam, bemerkte ich kein Leck (mit MS DTV-DVD Decoder), wie sagt man, ob das Leck stattgefunden hat? –
Speicher nimmt während des Prozesses weiter zu, solange der Filter läuft. natürlich gibt es in diesem Beispiel eine begrenzte Anzahl von Frames. Wenn Sie jedoch mit einem Livestream arbeiten, erreicht die Speicherbelegung nach einigen Stunden Gigabytes. Haben Sie bei der Ausführung des Filters mit MS DTV-DVD Video Decoder keine Speichererhöhung von GraphEdit/GraphStudio bemerkt? Wenn ja, was ist dein Betriebssystem? Ich habe dies auf Win7 32 Bits. –