Uso di esempi multimediali

In questo argomento viene descritto come utilizzare l'interfaccia IMFSample per modificare gli oggetti di esempio multimediali. Per una panoramica generale degli esempi multimediali, vedere Esempi multimediali.

Per creare un nuovo esempio multimediale, chiamare la funzione MFCreateSample. Inizialmente, l'elenco di buffer dell'esempio è vuoto. Per aggiungere un buffer alla fine dell'elenco, chiamare IMFSample::AddBuffer.

Il codice seguente illustra come creare un esempio e aggiungervi un buffer.

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

Il modo consigliato per ottenere i buffer dall'esempio consiste nel chiamare IMFSample::ConvertToContiguousBuffer. Questo metodo restituisce un singolo buffer continuo.

Per scorrere i buffer nell'elenco, iniziare chiamando IMFSample::GetBufferCount. Questo metodo restituisce il numero di buffer. Chiamare quindi IMFSample::GetBufferByIndex e specificare l'indice del buffer da recuperare. I buffer vengono indicizzati da zero.

Il codice seguente illustra come scorrere i buffer in un esempio.

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

Gli esempi hanno un timestamp e una durata. Il timestamp indica quando deve essere eseguito il rendering dei dati nell'esempio rispetto all'orologio della presentazione. La durata è l'intervallo di tempo per il quale deve essere eseguito il rendering dei dati. In genere il componente che genera i dati imposta il timestamp iniziale e la durata. Questi valori potrebbero essere modificati dalla sessione multimediale. Per impostare il timestamp, chiamare IMFSample::SetSampleTime. Per impostare la durata, chiamare IMFSample::SetSampleDuration.

Gli esempi possono anche avere attributi, che contengono informazioni aggiuntive sull'esempio. Per un elenco degli attributi di esempio, vedere Attributi di esempio. Per impostare e recuperare attributi, usare l'interfaccia IMFAttributes, che IMFSample eredita.

Esempi di supporti

Buffer multimediali