Dieser bringt mich wirklich dazu, meine Haare herauszuziehen. Ich habe einen DirectShow-Transformationsfilter geschrieben, der von CTransformFilter abgeleitet wurde. Ich habe einen Input-Pin von CTransformInputPin abgeleitet. Wenn die Receive-Methode meines Eingangspins aufgerufen wird, protokolliert sie die Darstellungszeiten des IMediaSamples in einer Datei. Das alles funktioniert gut, bis ich den Graphen stoppe und neu starte (ich benutze MS Graphedt). Die meiste Zeit, wenn man wieder läuft, gibt es keine Probleme. Aber etwa bei etwa einem Dutzend Mal, dass ich aufhöre und dann den Graphen erneut starte, ist die Startzeit der Präsentation negativ. Es steigt schließlich auf und steigt über Null an, während der Graph läuft, aber es holt nie die Stromzeit auf, mit dem Ergebnis, dass die Stromzeit für jede Abtastung signifikant über Kopf der Präsentationsstartzeit bleibt.Negative Präsentationszeit in DirectShow
Ich habe dies mit einer Logitech Webcam Pro 9000 und einer Logitech C600 Kamera beobachtet, aber nicht mit einer Winbook Kamera, also frage ich mich, ob das ein Logitech Problem ist. Hat jemand andere negative Präsentationszeiten auf Video IMediaSamples nach dem Anhalten und wieder laufen gesehen? (Ich habe in der Pre-Roll-Flag im IMediaSample sah. Es ist immer S_FALSE)
UPDATE:
Ich habe CTransformFilter die außer Kraft gesetzt (eigentlich CBaseFilter der) Run-Methode mit diesem:
STDMETHODIMP MyTransformFilter::Run(REFERENCE_TIME tStart)
{
char buff[1000];
REFERENCE_TIME rTime;
m_pClock->GetTime(&rTime);
sprintf(buff, "Run tstart = %lld, rTime = %lld", tStart, rTime);
Trace(buff); // open my log file, add buff, close my log file
return CTransformFilter::Run(tStart);
}
Ich benutzte Graphedt, um den Graphen zu starten, 10 Sekunden lang zu laufen, 5 Sekunden zu pausieren und dann erneut zu starten. Hier ist die Ausgabe:
Run tstart = 7855978550000, rTime = 7855978450000
Run tstart = 7856030610000, rTime = 7856126960000
Die beiden Zeiten von 5,2 Sekunden abweichen Ausführen übergeben (über die Höhe der Zeit, die ich angehalten). Die beiden Referenzzeitpunkte unterscheiden sich um 14,6 Sekunden (etwa die Gesamtzeit zwischen Aufrufen von Run). Abgesehen von dem leichten Anstieg, den der Filtergraph-Manager zu der Zeit hinzufügt, die an Run (10 ms, im ersten Aufruf) übergeben wurde, würde ich erwarten, dass diese bei jedem Aufruf von Run nahezu identisch sind. Stattdessen ist die Zeit, die beim zweiten Aufruf an Run übergeben wird, etwa 10 Sekunden hinter dem Referenztakt. Ich wäre äußerst dankbar für Hilfe, um zu verstehen, warum die Zeit, die beim zweiten Aufruf von Run verstrichen ist, nicht (fast) die gleiche ist wie die Zeit, die die Referenzuhr beim zweiten Aufruf zurückgibt.
UPDATE 2:
Problem erscheint in der Logitech-Version 13.31.1044.0 Treiber. Siehe Antwort unten.
Ich würde das verstehen, wenn die Stream-Zeit auf dem neugestarteten Graph nicht bei Null neu gestartet wurde. Jedes Mal, wenn ich den Graphen stoppe und starte, beginnt die Stream-Zeit wieder bei Null. Aber bei etwa einem von 12 Malen beginnt der Capture-Filter (wenn es eine Logitech-Kamera ist) davor (-15.000.000 oder mehr REFERENCE_TIME-Einheiten) davor. Wenn nichts anderes, würde ich erwarten, dass der Capture-Filter konsistent über die Beziehung zwischen seinen Darstellungszeiten und der Stream-Zeit des Graphen ist. –
-15M ist -1,5 Sekunden - ziemlich viel aber fällt immer noch in den zweiten Absatz oben. –
Kann ich irgendetwas tun, um dies zu korrigieren? Ich versuche, die Präsentationszeit mit der Streamzeit zu vergleichen, damit ich entscheiden kann, ob ich ein Sample löschen soll oder nicht, anstatt es in meinem Transformationsfilter zu verarbeiten. Wenn der Capture-Filter mit einem negativen Wert beginnt, bleibt er von da an so weit hinter dem Stream-Team und lässt mir keine Möglichkeit, zu entscheiden, ob das Sample so weit hinter der Stream-Zeit liegt, die ich fallen lassen sollte es. –