CSourceSeeking-Klasse
[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.]
Die CSourceSeeking-Klasse ist eine abstrakte Klasse zum Implementieren der Suche in Quellfiltern mit einem Ausgabepin.
Diese Klasse unterstützt die IMediaSeeking-Schnittstelle . Es stellt Standardimplementierungen für alle IMediaSeeking-Methoden bereit. Geschützte Membervariablen speichern die Startzeit, die Stoppzeit und die aktuelle Rate. Standardmäßig wird das einzige Von der -Klasse unterstützte Zeitformat TIME_FORMAT_MEDIA_TIME (100 Nanosekundeneinheiten). Weitere Informationen finden Sie unter Hinweise.
Geschützte Membervariablen | BESCHREIBUNG |
---|---|
m_rtDuration | Dauer des Datenstroms. |
m_rtStart | Startzeit |
m_rtStop | Stoppzeit. |
m_dRateSeeking | Wiedergaberate. |
m_dwSeekingCaps | Suchen nach Funktionen. |
m_pLock | Zeiger auf ein kritisches Abschnittsobjekt zum Sperren. |
Geschützte Methoden | BESCHREIBUNG |
CSourceSeeking | Konstruktormethode. |
Reine virtuelle Methoden | BESCHREIBUNG |
ChangeRate | Wird aufgerufen, wenn sich die Wiedergaberate ändert. |
ChangeStart | Wird aufgerufen, wenn sich die Startposition ändert. |
ChangeStop | Wird aufgerufen, wenn sich die Stoppposition ändert. |
IMediaSeeking-Methoden | BESCHREIBUNG |
IsFormatSupported | Bestimmt, ob ein angegebenes Zeitformat unterstützt wird. |
QueryPreferredFormat | Ruft das bevorzugte Zeitformat des Objekts ab. |
SetTimeFormat | Legt das Zeitformat fest. |
IsUsingTimeFormat | Bestimmt, ob ein angegebenes Zeitformat das aktuell verwendete Format ist. |
GetTimeFormat | Ruft das aktuelle Zeitformat ab. |
GetDuration | Ruft die Dauer des Datenstroms ab. |
GetStopPosition | Ruft den Zeitpunkt ab, zu dem die Wiedergabe beendet wird, relativ zur Dauer des Datenstroms. |
GetCurrentPosition | Ruft die aktuelle Position relativ zur Gesamtdauer des Datenstroms ab. |
GetCapabilities | Ruft alle Suchfunktionen des Datenstroms ab. |
CheckCapabilities | Fragt ab, ob der Stream über angegebene Suchfunktionen verfügt. |
ConvertTimeFormat | Konvertiert von einem Zeitformat in ein anderes. |
SetPositions | Legt die aktuelle Position und die Stoppposition fest. |
GetPositions | Ruft die aktuelle Position und die Stoppposition ab. |
GetAvailable | Ruft den Zeitraum ab, in dem die Suche effizient ist. |
SetRate | Legt die Wiedergaberate fest. |
GetRate | Ruft die Wiedergaberate ab. |
GetPreroll | Ruft die Vorrollzeit ab. |
Bemerkungen
Wenn sich die Startposition, die Stoppposition oder die Wiedergaberate ändert, ruft das CSourceSeeking-Objekt eine entsprechende reine virtuelle Methode auf:
- Startposition: CSourceSeeking::ChangeStart
- Stoppposition: CSourceSeeking::ChangeStop
- Wiedergaberate: CSourceSeeking::ChangeRate
Die abgeleitete Klasse muss diese Methoden implementieren. Nach jedem Suchvorgang muss ein Filter Folgendes ausführen:
- Rufen Sie die IPin::BeginFlush-Methode für den Downstreameingabenadel auf.
- Halten Sie den Workerthread an, der Daten bereitstellt.
- Rufen Sie die IPin::EndFlush-Methode auf dem Eingabenadel auf.
- Starten Sie den Workerthread neu.
- Rufen Sie die IPin::NewSegment-Methode für den Eingabenadel auf.
- Legen Sie die Diskontinuitätseigenschaft für das erste Beispiel fest. Rufen Sie die IMediaSample::SetDiscontinuity-Methode auf.
Der Aufruf von BeginFlush gibt den Workerthread frei, wenn der Thread blockiert wird, um ein Beispiel zu übermitteln.
Stellen Sie in Schritt 2 sicher, dass der Thread das Senden von Daten beendet hat. Abhängig von der Implementierung müssen Sie möglicherweise warten, bis der Thread beendet wird, oder darauf, dass der Thread eine Antwort einer Art signalisiert. Wenn Der Filter die CSourceStream-Klasse verwendet, blockiert die CSourceStream::Stop-Methode , bis der Workerthread antwortet.
Idealerweise sollte das neue Segment (Schritt 5) aus dem Workerthread bereitgestellt werden. Dies kann auch durch das CSourceSeeking-Objekt erfolgen, solange der Filter es mit den Beispielen serialisiert.
Das folgende Beispiel zeigt eine mögliche Implementierung. Es wird davon ausgegangen, dass der Ausgabepin des Quellfilters von CSourceSeeking und CSourceStream abgeleitet ist. In diesem Beispiel wird die Hilfsmethode UpdateFromSeek definiert, die Schritte 1 4 ausführt. Die CSourceStream::OnThreadStartPlay-Methode wird überschrieben, um das neue Segment zu senden und ein Flag festzulegen, das die Diskontinuität angibt. Der Workerthread übernimmt dieses Flag und ruft die IMediaSample::SetDiscontinuity-Methode auf :
void CMyStream::UpdateFromSeek()
{
if (ThreadExists())
{
DeliverBeginFlush();
Stop();
DeliverEndFlush();
Run();
}
}
HRESULT CMyStream::OnThreadStartPlay()
{
m_bDiscontinuity = TRUE;
return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}
Unterstützung zusätzlicher Zeitformate
Standardmäßig unterstützt diese Klasse die Suche nur in Einheiten der Referenzzeit (TIME_FORMAT_MEDIA_TIME). Um zusätzliche Zeitformate zu unterstützen, überschreiben Sie die IMediaSeeking-Methoden , die sich mit Zeitformaten befassen:
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::SetTimeFormat
Überschreiben Sie außerdem die verbleibenden IMediaSeeking-Methoden , um die erforderlichen Konvertierungen zwischen Zeitformaten durchzuführen. Nachdem die SetTimeFormat-Methode aufgerufen wurde, müssen alle IMediaSeeking-Methoden eingehende und ausgehende Zeitparameter als im neuen Zeitformat behandeln. Wenn die variable m_rtDuration beispielsweise die Dauer in Einheiten der Referenzzeit darstellt, das aktuelle Zeitformat jedoch Frames ist, muss die GetDuration-Methode den Wert zurückgeben , m_rtDuration in Frames konvertiert wurden. Beispiel:
STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
HRESULT hr = CSourceSeeking::GetDuration(pDuration);
if (SUCCEEDED(hr))
{
if (m_TimeFormat == TIME_FORMAT_FRAME)
{
// Convert from reference time to frames.
*pDuration = TimeToFrame(*pDuration); // Private method.
}
}
return hr
}
Achten Sie außerdem darauf, in der IMediaSeeking::SetPositions-Methode nach dem flag AM_SEEKING_ReturnTime zu suchen. Wenn dieses Flag vorhanden ist, konvertieren Sie die Positionswerte in Referenzzeiten, wenn Sie sie an den Aufrufer zurückgeben.
Anforderungen
Anforderung | Wert |
---|---|
Header |
|
Bibliothek |
|