Erstellen von Daten in einem Erfassungsfilter
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
In diesem Thema wird beschrieben, wie ein benutzerdefinierter DirectShow-Erfassungsfilter Ausgabedaten generieren soll.
Filterstatusänderungen
Ein Erfassungsfilter sollte nur Daten erzeugen, wenn der Filter ausgeführt wird. Senden Sie keine Daten von Ihren Pins, wenn der Filter angehalten ist. Geben Sie außerdem VFW_S_CANT_CUE von der CBaseFilter::GetState-Methode zurück, wenn der Filter angehalten wird. Dieser Rückgabewert informiert den Filtergraph-Manager, dass er nicht auf Daten aus dem Filter warten soll, während der Filter angehalten wird. Weitere Informationen finden Sie unter Filterstatus.
Der folgende Code zeigt, wie Die IMediaFilter::GetState-Methode implementiert wird:
CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
CheckPointer(pState, E_POINTER);
*pState = m_State;
if (m_State == State_Paused)
{
return VFW_S_CANT_CUE;
}
else
{
return S_OK;
}
}
Steuern einzelner Streams
Die Ausgabepins eines Erfassungsfilters sollten die IAMStreamControl-Schnittstelle unterstützen, sodass eine Anwendung jeden Pin einzeln ein- oder ausschalten kann. Beispielsweise kann eine Anwendung eine Vorschau ohne Erfassung anzeigen und dann in den Aufnahmemodus wechseln, ohne das Filterdiagramm neu zu erstellen. Sie können die CBaseStreamControl-Klasse verwenden, um diese Schnittstelle zu implementieren.
Zeitstempel
Wenn der Filter eine Stichprobe erfasst, zeitstempeln Sie das Beispiel mit der aktuellen Streamzeit. Die Endzeit ist die Startzeit plus die Dauer. Wenn der Filter beispielsweise zehn Stichproben pro Sekunde erfasst und die Datenstromzeit 200.000.000 Einheiten beträgt, wenn der Filter die Stichprobe erfasst, sollten die Zeitstempel 200000000 und 201000000 betragen. (Es gibt 10.000.000 Einheiten pro Sekunde.)
Um die Streamzeit zu berechnen, rufen Sie die IReferenceClock::GetTime-Methode auf, um die aktuelle Referenzzeit abzurufen, und substrativieren Sie dann die ursprüngliche Startzeit. Rufen Sie alternativ die CBaseFilter::StreamTime-Methode auf, die dieselbe Berechnung ausführt. Um den Zeitstempel für ein Beispiel festzulegen, rufen Sie die IMediaSample::SetTime-Methode auf.
Wenn der Filter jedoch über eine Vorschau-Pin verfügt, sollten Beispiele aus dem Vorschaupin keine Zeitstempel aufweisen. Der Grund dafür ist, dass Stichproben den Renderer immer etwas nach dem Zeitpunkt der Erfassung erreichen. Wenn die Stichproben mit Zeitstempel versehen werden, behandelt der Renderer sie als spät, und es kann versucht werden, die Stichproben aufzuholen. (Weitere Informationen finden Sie unter DirectShow-Videoaufnahmefilter.) Beachten Sie, dass die IAMStreamControl-Schnittstelle die Pin erfordert, um die Beispielzeiten nachzuverfolgen. Für eine Vorschau-Pin müssen Sie möglicherweise die Implementierung so ändern, dass sie nicht auf Zeitstempeln angewiesen ist.
Zeitstempel müssen immer von einer Stichprobe zur nächsten zunehmen. Dies gilt auch dann, wenn der Filter angehalten wird. Wenn der Filter ausgeführt, angehalten und dann erneut ausgeführt wird, muss das erste Beispiel nach der Pause einen größeren Zeitstempel aufweisen als das letzte Beispiel vor der Pause.
Abhängig von den Daten, die Sie erfassen, kann es sinnvoll sein, die Medienzeit für die Stichproben festzulegen.
Weitere Informationen finden Sie unter Zeit und Uhren in DirectShow.
Zugehörige Themen