Share via


Utilisation d’exemples multimédias

Cette rubrique explique comment utiliser l’interface IMFSample pour manipuler des exemples d’objets multimédias. Si vous souhaitez obtenir une vue d’ensemble générale des exemples multimédias, consultez Exemples multimédias.

Pour créer un exemple de média, appelez la fonction MFCreateSample. La liste de mémoires tampons de l’exemple est initialement vide. Pour ajouter une mémoire tampon à la fin de la liste, appelez IMFSample::AddBuffer.

L'exemple de code suivant indique comment créer un exemple et y ajouter une mémoire tampon.

HRESULT CreateMediaSample(DWORD cbData, IMFSample **ppSample)
{
    HRESULT hr = S_OK;

    IMFSample *pSample = NULL;
    IMFMediaBuffer *pBuffer = NULL;

    hr = MFCreateSample(&pSample);

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(cbData, &pBuffer);
    }

    if (SUCCEEDED(hr))
    {
        hr = pSample->AddBuffer(pBuffer);
    }

    if (SUCCEEDED(hr))
    {
        *ppSample = pSample;
        (*ppSample)->AddRef();
    }

    SafeRelease(&pSample);
    SafeRelease(&pBuffer);
    return hr;
}

La méthode recommandée pour obtenir les mémoires tampons à partir de l’exemple consiste à appeler IMFSample::ConvertToContiguousBuffer. Cette méthode retourne une mémoire tampon continue unique.

Pour effectuer une itération via les mémoires tampons de la liste, commencez par appeler IMFSample::GetBufferCount. Cette méthode retourne le nombre de mémoires tampons. Appelez ensuite IMFSample::GetBufferByIndex et spécifiez l’index de la mémoire tampon à récupérer. Les mémoires tampons sont indexées à partir de zéro.

Le code suivant montre comment effectuer une itération dans les mémoires tampons d’un exemple.

IMFMediaBuffer *pBuffer = NULL;
DWORD cBuffers = 0;

hr = pSample->GetBufferCount(&cBuffers);

if (SUCCEEDED(hr))
{
    for (DWORD i = 0; i < cBuffers; i++)
    {
        hr = pSample->GetBufferByIndex(i, &pBuffer);

        // Use buffer (not shown).

        SafeRelease(&pBuffer);

        if (FAILED(hr))
        {
            break;
        }
    }
}

Les exemples ont un horodatage et une durée. L’horodatage indique quand les données de l’exemple doivent être rendues, par rapport à l’horloge de présentation. La durée correspond à la durée pendant laquelle les données doivent être rendues. En règle générale, le composant qui génère les données définit l’horodatage et la durée initiales. Ces valeurs peuvent être modifiées par la session multimédia. Pour définir l’horodatage, appelez IMFSample::SetSampleTime. Pour définir la durée, appelez IMFSample::SetSampleDuration.

Les exemples peuvent également avoir des attributs qui contiennent des informations supplémentaires sur l’exemple. Pour obtenir la liste des exemples d’attributs, consultez Exemples d’attributs. Pour définir et récupérer des attributs, utilisez l’Interface IMFAttributes héritée par IMFSample.

Exemples multimédias

Mémoires tampons multimédias