Использование кодировки 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;
}
Связанные темы