Freigeben über


Festlegen der Videokomprimierungseigenschaften

[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.]

Videokomprimierungsfilter können die IAMVideoCompression-Schnittstelle an ihren Ausgabepins unterstützen. Verwenden Sie diese Schnittstelle, um Komprimierungseigenschaften festzulegen, z. B. die Keyframerate, die Anzahl der vorhergesagten (P) Frames pro Keyframe und die relative Komprimierungsqualität.

Rufen Sie zunächst die IBaseFilter::EnumPins-Methode auf, um den Ausgabepin des Filters zu finden, und fragen Sie den Pin für die Schnittstelle ab. Einige Filter unterstützen die Schnittstelle möglicherweise überhaupt nicht. Andere können die -Schnittstelle verfügbar machen, aber nicht jede Komprimierungseigenschaft unterstützen. Rufen Sie IAMVideoCompression::GetInfo auf, um zu bestimmen, welche Eigenschaften unterstützt werden. Diese Methode gibt mehrere Informationen zurück:

  • Eine Reihe von Funktionenflags
  • Eine beschreibende Zeichenfolge und eine Versionsnummernzeichenfolge
  • Standardwerte für Keyframerate, P-Bildfrequenz und Qualität (sofern unterstützt)

Die -Methode weist die folgende Syntax auf:

hr = pCompress->GetInfo(pszVersion, &cbVersion, pszDesc, &cbDesc, 
         &lKeyFrame, &lPFrame, &dblQuality, &lCap);

Die Parameter pszVersion und pszDesc sind Breitzeichenpuffer, die die Versionszeichenfolge und die Beschreibungszeichenfolge empfangen. Die Parameter cbVersion und cbDesc erhalten die erforderlichen Puffergrößen in Bytes (keine Zeichen). Die Parameter lKeyFrame, lPFrame und dblQuality erhalten die Standardwerte für die Schlüsselbildrate, die P-Bildfrequenz und die Qualität. Die Qualität wird als Gleitkommazahl von 0,0 bis 1,0 ausgedrückt. Der lCap-Parameter empfängt ein bitweises OR der Capabilities-Flags, die durch den aufgezählten CompressionCaps-Typ definiert werden.

Jeder dieser Parameter kann NULL sein. In diesem Fall ignoriert die Methode diesen Parameter. Wenn Sie beispielsweise Puffer für die Versions- und Beschreibungszeichenfolgen zuordnen möchten, rufen Sie zunächst die -Methode mit NULL im ersten und dritten Parameter auf. Verwenden Sie die zurückgegebenen Werte für cbVersion und cbDesc , um die Puffer zuzuordnen, und rufen Sie dann die Methode erneut auf:

int cbVersion, cbDesc; // Size in bytes, not characters!
hr = pCompress->GetInfo(0, &cbVersion, 0, &cbDesc, 0, 0, 0, 0);
if (SUCCEEDED(hr))
{
    WCHAR *pszVersion = new WCHAR[cbVersion/2]; // Wide character = 2 bytes
    WCHAR *pszDesc = new WCHAR[cbDesc/2];
    hr = pCompress->GetInfo(pszVersion, 0, pszDesc, 0, 0, 0, 0, 0);
}

Der Wert von lCap gibt an, welche der anderen IAMVideoCompression-Methoden der Filter unterstützt. Wenn lCap beispielsweise das flag CompressionCaps_CanKeyFrame enthält, können Sie IAMVideoCompression::get_KeyFrameRate aufrufen, um die Keyframerate abzurufen, und IAMVideoCompression::p ut_KeyFrameRate, um die Keyframerate festzulegen. Ein negativer Wert gibt an, dass der Filter den Standardwert verwendet, wie er von IAMVideoCompression::GetInfo abgerufen wird. Beispiel:

if (lCap & CompressionCaps_CanKeyFrame)
{
    hr = pCompress->get_KeyFrameRate(&lKeyFrame);
    if (FAILED(hr) || lKeyFrame < 0)
    {
        lKeyFrame = lDefaultKeyFrame; // From GetInfo.
    }
}

Im folgenden Codebeispiel wird versucht, die IAMVideoCompression-Schnittstelle am Ausgabepin zu finden. Wenn dies erfolgreich ist, werden die Standardwerte und die tatsächlichen Werte für die Komprimierungseigenschaften abgerufen:

HRESULT hr = E_FAIL;
IEnumPins *pEnum = NULL;
IPin *pPin = NULL;
IAMVideoCompression *pCompress = NULL;

// Find the pin that supports IAMVideoCompression (if any).
pFilter->EnumPins(&pEnum);
while (S_OK == pEnum->Next(1, &pPin, NULL))
{
    hr = pPin->QueryInterface(IID_IAMVideoCompression, (void**)&pCompress);
    pPin->Release();
    if (SUCCEEDED(hr)) // Found the interface.
    {
        break;
    }
}
if (SUCCEEDED(hr)) 
{
    long lCap;                     // Capability flags
    long lKeyFrame, lPFrame;       // Real values
    double m_Quality;
    long lKeyFrameDef, lPFrameDef; // Default values
    double QualityDef;
    
    // Get default values and capabilities.
    hr = pCompress->GetInfo(0, 0, 0, 0, &KeyFrameDef, &lPFrameDef,
             &QualityDef, &lCap);
    if (SUCCEEDED(hr))
    {
        // Get actual values where possible.
        if (lCap & CompressionCaps_CanKeyFrame)
        {
            hr = pCompress->get_KeyFrameRate(&lKeyFrame);
            if (FAILED(hr) || lKeyFrame < 0)
                lKeyFrame = lKeyFrameDef;
        }
        if (lCap & CompressionCaps_CanBFrame)
        {
            hr = pCompress->get_PFramesPerKeyFrame(&lPFrame);
            if (FAILED(hr) || lPFrame < 0)
                lPFrame = lPFrameDef;
        }
        if (lCap & CompressionCaps_CanQuality)
        {
            hr = pCompress->get_Quality(&Quality);
            if (FAILED(hr) || Quality < 0)
                Quality = QualityDef;
        }
    }
}

Hinweis

Wenn Sie die ICaptureGraphBuilder2-Schnittstelle zum Erstellen Ihres Graphen verwenden, können Sie die IAMVideoCompression-Schnittstelle abrufen, indem Sie ICaptureGraphBuilder2::FindInterface anstelle von IBaseFilter::EnumPins aufrufen. Die FindInterface-Methode ist eine Hilfsmethode, die Filter sucht und im Diagramm nach einer angegebenen Schnittstelle anheftet.