Freigeben über


Videofunktionen

[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 IAMStreamConfig::GetStreamCaps-Methode stellt Videofunktionen in einem Array von AM_MEDIA_TYPE - und VIDEO_STREAM_CONFIG_CAPS-Strukturen dar. Sie können dies verwenden, um alle formate und auflösungen verfügbar zu machen, die an einer Pin unterstützt werden, wie unten erläutert.

Audiobezogene Beispiele für GetStreamCaps finden Sie unter Audiofunktionen.

Angenommen, Ihre Aufnahme Karte unterstützt das JPEG-Format bei allen Auflösungen zwischen 160 x 120 Pixeln und einschließlich 320 x 240 Pixel. Der Unterschied zwischen unterstützten Auflösungen besteht in diesem Fall darin, dass Sie von jeder unterstützten Auflösung ein Pixel hinzufügen oder subtrahieren, um die nächste unterstützte Auflösung zu erhalten. Dieser Unterschied in den unterstützten Auflösungen wird als Granularität bezeichnet.

Angenommen, Ihr Karte unterstützt auch die Größe 640 x 480. Im Folgenden werden diese einzelne Auflösung und der obige Auflösungsbereich (alle Größen zwischen 160 x 120 Pixel und 320 x 240 Pixel) veranschaulicht.

Auflösung von 160 x 120 bis 320 x 240 Pixel, plus 640 x 480

Angenommen, es unterstützt das 24-Bit-Farb-RGB-Format bei Auflösungen zwischen 160 x 120 und 320 x 240, aber mit einer Granularität von 8. Die folgende Abbildung zeigt einige der gültigen Größen in diesem Fall.

Auflösung von 160 x 120 bis 320 bis 240, mit Granularität = 8

Um es anders auszudrücken und weitere Auflösungen aufzulisten, sind alle in der Liste der gültigen Auflösungen aufgeführt.

  • 160 x 120
  • 168 x 120
  • 168 x 128
  • 176 x 128
  • 176 x 136
  • ... zusätzliche Auflösungen ...
  • 312 x 232
  • 320 x 240

Verwenden Sie GetStreamCaps , um diese Farbformat- und Dimensionsfunktionen verfügbar zu machen, indem Sie einen Medientyp von 320 x 240 JPEG (wenn dies Ihre Standardgröße oder bevorzugte Größe ist) mit minimalen Funktionen von 160 x 120, maximalen Funktionen von 320 x 240 und einer Granularität von 1 anbieten. Das nächste Paar, das Sie mit GetStreamCaps verfügbar machen, ist ein Medientyp von 640 x 480 JPEG, verbunden mit mindestens 640 x 480 und maximal 640 x 480 und einer Granularität von 0. Das dritte Paar enthält einen Medientyp von 320 x 240, 24-Bit-RGB mit minimalen Funktionen von 160 x 120, maximale Funktionen von 320 x 240 und einer Granularität von 8. Auf diese Weise können Sie fast jedes Format und jede Funktion veröffentlichen, die Ihr Karte möglicherweise unterstützt. Eine Anwendung, die wissen muss, welche Komprimierungsformate Sie bereitstellen, kann alle Paare abrufen und eine Liste aller eindeutigen Untertypen der Medientypen erstellen.

Ein Filter ruft seine Quell- und Zielrechtecke vom Medientyp aus den rcSource- bzw. rcTarget-Membern der VIDEOINFOHEADER-Struktur ab. Filter müssen keine Quell- und Zielrechtecke unterstützen.

Das in der IAMStreamConfig-Dokumentation beschriebene Zuschneiderechteck entspricht dem rcSource-Rechteck der VIDEOINFOHEADER-Struktur für den Ausgabepin.

Das in der IAMStreamConfig-Dokumentation beschriebene Ausgaberechteck ist identisch mit den biWidth - und biHeight-Membern der BITMAPINFOHEADER-Struktur des Ausgabepins (siehe DV-Daten im AVI-Dateiformat).

Wenn der Ausgabepin eines Filters mit einem Medientyp mit nicht leeren Quell- und Zielrechtecken verbunden ist, ist der Filter erforderlich, um das Quellunterrectangle des Eingabeformats in den Zielunterbereich des Ausgabeformats zu strecken. Der Quellunterbereich wird im InputSize-Member der VIDEO_STREAM_CONFIG_CAPS-Struktur gespeichert.

Betrachten Sie beispielsweise das folgende Videokompressorszenario: Das Eingabebild ist im RGB-Format und hat eine Größe von 160 x 120 Pixel. Die obere linke Ecke des Quellrechtecks befindet sich bei der Koordinate (20,20) und die untere rechte Ecke bei (30,30). Das Ausgabebild ist im MPEG-Format mit einer Größe von 320 x 240. Die obere linke Ecke des Zielrechtecks befindet sich bei (0,0) und die untere rechte Ecke bei (100.100). In diesem Fall sollte der Filter ein 10 x 10 Teil der 160 x 120 RGB-Quellbittebitbit annehmen und den oberen 100 x 100-Bereich einer 320 x 240-Bitmap ausfüllen, sodass der Rest der 320 x 240-Bitmap unberührt bleibt. Die folgende Abbildung zeigt dieses Szenario.

Subrectangle-Dehnung

Ein Filter unterstützt dies möglicherweise nicht und kann keine Verbindung mit einem Medientyp herstellen, bei dem rcSource und rcTarget nicht leer sind.

Die VIDEOINFOHEADER-Struktur macht Informationen zu den Datenratenfunktionen eines Filters verfügbar. Angenommen, Sie haben Den Ausgabepin mit einem bestimmten Medientyp mit dem nächsten Filter verbunden (entweder direkt oder mithilfe des medientyps, der von der Funktion CMediaType::SetFormat übergeben wird). Sehen Sie sich den dwBitRate-Member der VIDEOINFOHEADER-Formatstruktur dieses Medientyps an, um zu sehen, auf welche Datenrate Sie das Video komprimieren sollten. Wenn Sie die Anzahl der Zeiteinheiten pro Frame im AvgTimePerFrame-Element der VIDEOINFOHEADER-Struktur mit der Datenrate im dwBitRate-Element multiplizieren und durch 10.000.000 dividieren (die Anzahl der Einheiten pro Sekunde), können Sie ermitteln, wie viele Bytes die einzelnen Frames sein sollten. Sie können einen kleineren Rahmen erstellen, aber niemals einen größeren. Um die Bildfrequenz für einen Videokompressor oder einen Aufnahmefilter zu bestimmen, verwenden Sie AvgTimePerFrame aus dem Medientyp Ihres Ausgabepins.