Utilisation de l’encodage Two-Pass (Windows Media Format 11 SDK)

[La fonctionnalité associée à cette page, le Kit de développement logiciel (SDK) Windows Media Format 11, est une fonctionnalité héritée. Il a été remplacé par le lecteur source et l’enregistreurrécepteur. Le lecteur source et l’enregistreur récepteur ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise le lecteur source et l’enregistreur récepteur au lieu du Kit de développement logiciel (SDK) Windows Media Format 11, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Certains codecs prennent en charge l’encodage à deux passes pour certains formats. Dans certains cas, un codec nécessite qu’un format spécifié soit encodé à l’aide de deux passes. Lorsque l’encodage à deux passes est utilisé, vous envoyez les exemples du flux au codec avant que l’encodage ne passe. Le codec analyse les exemples et configure la passe d’encodage en fonction de l’analyse. Il en résulte un fichier encodé plus efficacement.

Pour déterminer si un codec prend en charge l’encodage à une passe, ou deux passes, ou les deux, pour un format donné, appelez IWMCodecInfo3::SetCodecEnumerationSetting avec g_wszNumPasses et la valeur appropriée, puis énumérez les formats pour voir si celui que vous souhaitez retourner. Pour plus d’informations sur les codecs Windows Media qui prennent en charge l’encodage à deux passes, consultez Choix d’une méthode d’encodage.

Vous pouvez utiliser l’encodage à deux passes avec le Kit de développement logiciel (SDK) au format Windows Media en appelant les méthodes de l’interface IWMWriterPreprocess .

Dans les cas où l’encodage à deux passes est requis pour un format particulier, mais que l’application ne parvient pas à effectuer une passe de prétraitement, le premier appel à WriteSample échoue avec NS_E_INVALID_NUM_PASSES.

L’exemple de fonction suivant montre comment effectuer un encodage à deux passes. Cette fonction est appelée une fois que l’enregistreur a été défini avec un profil et démarré. Pour plus d’informations sur l’utilisation de ce code, consultez Utilisation des exemples de code.

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

Écriture de fichiers ASF