Arbeiten mit Medienbeispielen

In diesem Thema wird beschrieben, wie Sie die IMFSample-Schnittstelle zum Bearbeiten von Medienbeispielobjekten verwenden. Eine allgemeine Übersicht über Medienbeispiele finden Sie unter Medienbeispiele.

Rufen Sie zum Erstellen eines neuen Medienbeispiels die MFCreateSample-Funktion auf. Zunächst ist die Pufferliste des Beispiels leer. Rufen Sie IMFSample::AddBuffer auf, um am Ende der Liste einen Puffer hinzuzufügen.

Der folgende Code zeigt die Erstellung eines Beispiels sowie das Hinzufügen eines Puffers:

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

Die empfohlene Methode zum Abrufen der Puffer aus dem Beispiel besteht darin, IMFSample::ConvertToContiguousBuffer aufzurufen. Diese Methode gibt einen einzelnen fortlaufenden Puffer zurück.

Um die Puffer in der Liste zu durchlaufen, rufen Sie zunächst IMFSample::GetBufferCount auf. Diese Methode gibt die Anzahl der Puffer zurück. Rufen Sie dann IMFSample::GetBufferByIndex auf, und geben Sie den Index des abzurufenden Puffers an. Puffer werden von Null ausgehend indiziert.

Der folgende Code zeigt, wie die Puffer in einem Beispiel durchlaufen werden:

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

Beispiele haben einen Zeitstempel und eine Dauer. Der Zeitstempel gibt an, wann die Daten im Beispiel relativ zur Präsentationssystemuhr gerendert werden sollen. Die Dauer ist die Zeitspanne, in der die Daten gerendert werden sollen. In der Regel legt die Komponente, die die Daten generiert, den anfänglichen Zeitstempel und die Dauer fest. Diese Werte werden möglicherweise von der Mediensitzung geändert. Um den Zeitstempel festzulegen, rufen Sie IMFSample::SetSampleTime auf. Um die Dauer festzulegen, rufen Sie IMFSample::SetSampleDuration auf.

Beispiele können auch Attribute aufweisen, die zusätzliche Informationen zum Beispiel enthalten. Eine Liste der Beispielattribute finden Sie unter Beispielattribute. Verwenden Sie zum Festlegen und Abrufen von Attributen die IMFAttributes-Schnittstelle, die IMFSample erbt.

Medienbeispiele

Medienpuffer