Udostępnij za pośrednictwem


Korzystanie z kodowania Two-Pass (Windows Media Format 11 SDK)

[Funkcja skojarzona z tą stroną, windows Media Format 11 SDK, jest starszą funkcją. Został zastąpiony przez Source Reader i Sink Writer. Czytnik źródła i Zapisujący ujście zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał Czytnika Źródeł i Zapisującego Ujścia zamiast Windows Media Format 11 SDK, gdy to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Niektóre koderów obsługują kodowanie dwuprzepustowe dla niektórych formatów. W niektórych przypadkach kodek wymaga kodowania określonego formatu przy użyciu dwóch przebiegów. Gdy używane jest kodowanie dwuprzepustowe, należy wysłać próbki dla strumienia do kodeka przed właściwym procesem kodowania. Kodek analizuje próbki i konfiguruje proces kodowania na podstawie analizy. Powoduje to wydajniejsze kodowanie pliku.

Aby określić, czy kodek obsługuje kodowanie jednoprzepustowe, dwuprzepustowe, czy oba, w danym formacie, wywołaj metodę IWMCodecInfo3::SetCodecEnumerationSetting z g_wszNumPasses i odpowiednią wartością, a następnie przejrzyj formaty, aby sprawdzić, czy zwracany jest ten, którego potrzebujesz. Aby uzyskać więcej informacji na temat kodowań usługi Windows Media obsługujących kodowanie dwuprzepustowe, zobacz Wybieranie metody kodowania.

Można używać kodowania dwuprzepustowego z zestawem Windows Media Format SDK, wywołując metody interfejsu IWMWriterPreprocess.

W przypadkach, gdy kodowanie dwuprzepustowe jest wymagane dla określonego formatu, ale aplikacja nie może wykonać passa wstępnego przetwarzania, pierwsze wywołanie funkcji WriteSample zakończy się niepowodzeniem z NS_E_INVALID_NUM_PASSES.

Poniższa przykładowa funkcja pokazuje, jak wykonać kodowanie dwuprzepustowe. Ta funkcja jest wywoływana po skonfigurowaniu pisarza z profilem i jego uruchomieniu. Aby uzyskać więcej informacji na temat korzystania z tego kodu, zobacz Using the Code Examples.

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;
}

Pisanie plików ASF