Verwenden Two-Pass Codierung (Windows Media Format 11 SDK)

[Das dieser Seite zugeordnete Feature Windows Media Format 11 SDK ist ein Legacyfeature. Sie wurde durch den Quellleser und den Senkenschreiber ersetzt. Quellleser und Senkenschreiber wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit den Quellleser und senkenden Writer anstelle des Windows Media Format 11 SDK verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Einige Codecs unterstützen die Codierung mit zwei Durchgängen für bestimmte Formate. In einigen Fällen erfordert ein Codec, dass ein angegebenes Format mit zwei Durchläufen codiert wird. Wenn die Zwei-Pass-Codierung verwendet wird, senden Sie die Beispiele für den Stream an den Codec, bevor der Codierungsvorgang erfolgreich ist. Der Codec analysiert die Stichproben und konfiguriert den Codierungsdurchlauf basierend auf der Analyse. Dies führt zu einer effizienter codierten Datei.

Um zu bestimmen, ob ein Codec die Codierung mit einem Durchlauf oder zwei Durchlaufs oder beides für ein bestimmtes Format unterstützt, rufen Sie IWMCodecInfo3::SetCodecEnumerationSetting mit g_wszNumPasses und dem entsprechenden Wert auf, und listen Sie dann die Formate auf, um festzustellen, ob das gewünschte Format zurückgegeben wird. Weitere Informationen zu den Windows Media-Codecs, die die Codierung mit zwei Durchgängen unterstützen, finden Sie unter Auswählen einer Codierungsmethode.

Sie können die Zwei-Pass-Codierung mit dem Windows Media Format SDK verwenden, indem Sie Methoden der IWMWriterPreprocess-Schnittstelle aufrufen.

Wenn für ein bestimmtes Format zwei Codierungen erforderlich sind, die Anwendung jedoch keinen Vorverarbeitungsdurchlauf ausführt, schlägt der erste Aufruf von WriteSample mit NS_E_INVALID_NUM_PASSES fehl.

Die folgende Beispielfunktion veranschaulicht, wie die Codierung mit zwei Durchlaufs ausgeführt wird. Diese Funktion wird aufgerufen, nachdem der Writer mit einem Profil festgelegt und gestartet wurde. Weitere Informationen zur Verwendung dieses Codes finden Sie unter Verwenden der Codebeispiele.

HRESULT PreProcess(IWMWriter* pWriter, DWORD dwInputNum)
{
    HRESULT hr        = S_OK;
    DWORD   dwMaxPass = 0;

    IWMWriterPreprocess* pPreProc = NULL;

    // Get the writer preprocessor interface.
    hr = pWriter->QueryInterface(IID_IWMWriterPreprocess, 
                                 (void**) &pPreProc);
    GOTO_EXIT_IF_FAILED(hr);

    // Check that the input can be preprocessed.
    hr = pPreProc->GetMaxPreprocessingPasses(dwInputNum,0, &dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    if(dwMaxPass == 0)
    {
        hr = NS_E_INVALID_REQUEST;
        goto Exit;
    }

    // Set the number of preprocessing passes to the maximum.
    hr = pPreProc->SetNumPreprocessingPasses(dwInputNum, 0, dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    // Call BeginWriting before calling BeginPreprocessingPass
    hr = pWriter->BeginWriting();

    // Start preprocessing the first pass.
    hr = pPreProc->BeginPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: Make repeated calls to pPreProc->PreprocessSample to
    // preprocess all the samples in the stream.

    // End preprocessing.
    hr = pPreProc->EndPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: If the maximum number of preprocessing passes is greater
    // than one, repeat the preprocessing steps for each pass.

Exit:
    SAFE_RELEASE(pPreProc);
    Return hr;
}

Schreiben von ASF-Dateien