Partager via


Pour énumérer les formats d’entrée

[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 lecteur source et enregistreur ré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.]

Chacun des codecs Windows Media accepte un ou plusieurs types de supports d’entrée pour la compression. Le Kit de développement logiciel (SDK) au format Windows Media vous permet d’entrer une plus grande variété de formats que ceux pris en charge par les codecs. Pour ce faire, le Kit de développement logiciel (SDK) effectue des transformations de prétraitement sur les entrées si nécessaire, comme le redimensionnement des images vidéo ou le rééchantillonnage audio. Dans tous les cas, vous devez vous assurer que les formats d’entrée des fichiers que vous écrivez correspondent aux données que vous envoyez à l’enregistreur. Chaque codec a un format multimédia d’entrée par défaut défini dans l’enregistreur lorsque le profil est chargé. Vous pouvez examiner le format d’entrée par défaut en appelant IWMWriter::GetInputProps.

Les codecs vidéo prennent en charge les formats suivants : IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RVB 32, RVB 24, RVB 565, RVB 555 et RVB 8. Les codecs audio prennent en charge l’audio PCM.

Pour énumérer les formats d’entrée pris en charge par un codec, procédez comme suit :

  1. Créez un objet writer et définissez un profil à utiliser. Pour plus d’informations sur la définition de profils dans l’enregistreur, consultez Pour utiliser des profils avec l’enregistreur.
  2. Identifiez le numéro d’entrée pour lequel vous souhaitez case activée les formats. Pour plus d’informations sur l’identification des numéros d’entrée, consultez Pour identifier les entrées par nombre.
  3. Récupérez le nombre total de formats d’entrée pris en charge par l’entrée souhaitée en appelant IWMWriter::GetInputFormatCount.
  4. Effectuez une boucle dans tous les formats d’entrée pris en charge, en effectuant les étapes suivantes pour chacun d’eux.
    • Récupérez l’interface IWMInputMediaProps pour le format d’entrée en appelant IWMWriter::GetInputFormat.
    • Récupérez la structure WM_MEDIA_TYPE pour le format d’entrée. Appelez IWMMediaProps::GetMediaType, en passant la valeur NULL pour le paramètre pType pour obtenir la taille de la structure. Ensuite, allouez de la mémoire pour contenir la structure et appelez à nouveau GetMediaType pour obtenir la structure. IWMInputMediaProps hérite d’IWMMediaProps. Vous pouvez donc effectuer les appels à GetMediaType à partir du instance d’IWMInputMediaProps récupéré à l’étape précédente.
    • Le format décrit dans la structure WM_MEDIA_TYPE contient toutes les informations pertinentes sur le format d’entrée. Le format de base du média est identifié par WM_MEDIA_TYPE.subtype. Pour les flux vidéo, le membre pbFormat pointe vers une structure WMVIDEOINFOHEADER allouée dynamiquement qui contient des détails supplémentaires sur le flux, y compris la taille du rectangle. La taille des trames d’entrée n’est pas requise pour correspondre exactement à une taille prise en charge par le codec. S’ils ne correspondent pas, les composants d’exécution du KIT de développement logiciel (SDK), dans de nombreux cas, redimensionnent automatiquement les images vidéo d’entrée en un élément que le codec peut accepter.

L’exemple de code suivant recherche le format d’entrée du sous-type passé en tant que paramètre. Pour plus d’informations sur l’utilisation de ce code, consultez Utilisation des exemples de code.

HRESULT FindInputFormat(IWMWriter* pWriter, 
                       DWORD dwInput,
                       GUID guidSubType,
                       IWMInputMediaProps** ppProps)
{
    DWORD   cFormats = 0;
    DWORD   cbSize   = 0;

    WM_MEDIA_TYPE*      pType  = NULL;
    IWMInputMediaProps* pProps = NULL;

    // Set the ppProps parameter to point to NULL. This will
    //  be used to check the results of the function later.
    *ppProps = NULL;

    // Find the number of formats supported by this input.
    HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
    if (FAILED(hr))
    {
        goto Exit;
    }
    // Loop through all of the supported formats.
    for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
    {
        // Get the input media properties for the input format.
        hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Get the size of the media type structure.
        hr = pProps->GetMediaType(NULL, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Allocate memory for the media type structure.
        pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
        if (pType == NULL)
        {
            hr = E_OUTOFMEMORY;
            goto Exit;
        }
        
        // Get the media type structure.
        hr = pProps->GetMediaType(pType, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }

        if(pType->subtype == guidSubType)
        {
            *ppProps = pProps;
            (*ppProps)->AddRef();
            goto Exit;
        }

        // Clean up for next iteration.
        delete [] pType;
        pType = NULL;
        SAFE_RELEASE(pProps);
    } // End for formatIndex.

    // If execution made it to this point, no matching format was found.
    hr = NS_E_INVALID_INPUT_FORMAT;

Exit:
    delete [] pType;
    SAFE_RELEASE(pProps);
    return hr;
}

IWMWriter Interface

Écriture de fichiers ASF