Поделиться через


Использование кодировки Two-Pass (пакет SDK для формата Windows Media 11)

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменён устройством чтения источника и устройством записи приёмника . средства чтения источников и записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код Источник и Приемник вместо Windows Media Format 11 SDK, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Некоторые кодеки поддерживают двухпроходную кодировку для определенных форматов. В некоторых случаях кодек требует, чтобы указанный формат был закодирован с помощью двух проходов. Если используется двухпроходная кодировка, вы отправляете примеры для потока в кодек перед началом кодирования. Кодек анализирует образцы и настраивает процесс кодирования на основе анализа. Это приводит к более эффективному кодированию файла.

Чтобы определить, поддерживает ли кодек кодировку с одним проходом или двухпроходную кодировку или оба формата, вызовите IWMCodecInfo3::SetCodecEnumerationSetting с g_wszNumPasses и соответствующим значением, а затем перечислите форматы, чтобы узнать, возвращается ли нужный код. Дополнительные сведения о кодеках Windows Media, поддерживающих двухпроходную кодировку, см. в выбор метода кодирования.

Вы можете использовать двухпроходную кодировку с пакетом SDK для формата Windows Media, вызвав методы интерфейса IWMWriterPreprocess.

В случаях, когда для определенного формата требуется двухпроходная кодировка, но приложению не удается пройти предварительную обработку, первый вызов WriteSample завершится ошибкой с NS_E_INVALID_NUM_PASSES.

В следующем примере функции показано, как выполнять двухпроходную кодировку. Эта функция вызывается после того, как писатель настроен с профилем и запущен. Дополнительные сведения об использовании этого кода см. в разделе Использование примеров кода.

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

Создание ASF файлов