Verwenden von Two-Pass Encoding (Windows Media Format 11 SDK)

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

Rufen Sie IWMCodecInfo3::SetCodecEnumerationSetting mit g wszNumPasses und dem entsprechenden Wert auf, um zu bestimmen, ob ein Codec die Ein-Pass-Codierung oder zwei Durchläufe oder beides unterstützt, und nennen Sie _ dann die Formate, um festzustellen, ob das gewünschte zurückgegeben wird. Weitere Informationen zu den Windows Mediencodecs, die die Zwei-Pass-Codierung 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.

In Fällen, in denen die Zwei-Pass-Codierung für ein bestimmtes Format erforderlich ist, 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 Zwei-Pass-Codierung 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