Het gebruik van Two-Pass Encoding (Windows Media Format 11 SDK)
[De functie die is gekoppeld aan deze pagina, Windows Media Format 11 SDK, is een verouderde functie. Het is vervangen door Source Reader en Sink Writer. Bronlezer en Sink Writer zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken bronlezer en Sink Writer- in plaats van Windows Media Format 11 SDK, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]
Sommige codecs ondersteunen twee-pass codering voor bepaalde indelingen. In sommige gevallen vereist een codec dat een opgegeven indeling wordt gecodeerd met behulp van twee passen. Wanneer tweevoudige codering wordt gebruikt, verzendt u de samples van de stream naar de codec voordat de coderingsronde wordt uitgevoerd. De codec analyseert de voorbeelden en configureert de coderingspass op basis van de analyse. Dit resulteert in een efficiënter gecodeerd bestand.
Als u wilt bepalen of een codec codering met één wachtwoord of twee pass ondersteunt, of beide, roept u voor een bepaalde indeling IWMCodecInfo3::SetCodecEnumerationSetting- aan met g_wszNumPasses en de juiste waarde, en inventariseert u de indelingen om te zien of de gewenste indeling wordt geretourneerd. Zie Een coderingsmethode kiezenvoor meer informatie over de Windows Media-codecs die ondersteuning bieden voor codering met twee pass-codering.
U kunt twee-passcodering gebruiken met de Windows Media Format SDK door methoden aan te roepen van de IWMWriterPreprocess interface.
In gevallen waarin codering met twee passes is vereist voor een bepaalde indeling, maar de toepassing geen voorverwerkingspas uitvoert, mislukt de eerste aanroep van WriteSample- met NS_E_INVALID_NUM_PASSES.
De volgende voorbeeldfunctie laat zien hoe u codering met twee pass uitvoert. Deze functie wordt aangeroepen nadat de schrijver is ingesteld met een profiel en is gestart. Voor meer informatie over het gebruik van deze code, zie de codevoorbeelden gebruiken.
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;
}
Verwante onderwerpen