Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, 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;
}
Связанные разделы