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


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

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен средством чтения исходного кода и модуля записи приемника. Средство чтения исходного кода и модуль записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал средство чтения исходного кода и модуль записи приемника вместо пакета SDK для Windows Media Format 11. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие 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