Delen via


Presentatiedescriptors

Een presentatie is een set gerelateerde mediastreams die een gemeenschappelijke presentatietijd delen. Een presentatie kan bijvoorbeeld bestaan uit de audio- en videostreams van een film. Een presentatiedescriptor is een object dat de beschrijving van een bepaalde presentatie bevat. Presentatiedescriptors worden gebruikt voor het configureren van mediabronnen en sommige media-sinks.

Elke presentatiedescriptor bevat een lijst met een of meer stroomdescriptors. Deze beschrijven de stromen in de presentatie. Streams kunnen worden geselecteerd of gedeselecteerd. Alleen de geselecteerde streams produceren gegevens. Gedesselecteerde streams zijn niet actief en produceren geen gegevens. Elke stroomdescriptor heeft een mediatypehandler, die wordt gebruikt om het mediatype van de stream te wijzigen of het huidige mediatype van de stream op te halen. (Zie Mediatypenvoor meer informatie over mediatypen.)

In de volgende tabel ziet u de primaire interfaces die elk van deze objecten beschikbaar maakt.

Object Interface
Presentatiedescriptor IMFPresentationDescriptor
Stream descriptor IMFStreamDescriptor
Mediatypehandler IMFMediaTypeHandler-

 

Mediabronpresentaties

Elke mediabron biedt een presentatiedescriptor die de standaardconfiguratie voor de bron beschrijft. In de standaardconfiguratie wordt ten minste één stream geselecteerd en heeft elke geselecteerde stream een mediatype. Als u de beschrijving van de presentatie wilt ophalen, roept u IMFMediaSource::CreatePresentationDescriptoraan. De methode retourneert een IMFPresentationDescriptor aanwijzer.

U kunt de beschrijving van de presentatie van de bron wijzigen om een andere set streams te selecteren. Wijzig de presentatiedescriptor alleen als de mediabron is gestopt. De wijzigingen worden toegepast wanneer u IMFMediaSource::Start om de bron te starten.

Als u het aantal streams wilt ophalen, roept u IMFPresentationDescriptor::GetStreamDescriptorCountaan. Als u de streamdescriptor voor een stream wilt ophalen, roept u IMFPresentationDescriptor::GetStreamDescriptorByIndex aan en geeft u de index van de stream door. Streams worden geïndexeerd vanaf nul. De methode GetStreamDescriptorByIndex retourneert een IMFStreamDescriptor aanwijzer. Het retourneert ook een Booleaanse vlag die aangeeft of de stream is geselecteerd. Als de stream is geselecteerd, produceert de mediabron gegevens voor die stream. Anders produceert de bron geen gegevens voor die stream. Als u een stream wilt selecteren, roept u IMFPresentationDescriptor::SelectStream aan met de index van de stream. Als u een stroom wilt deselecteren, roept u IMFPresentationDescriptor::D eselectStreamaan.

De volgende code laat zien hoe u de presentatiedescriptor opzoekt uit een mediabron en de streams opsommen.

HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL  fSelected = FALSE;

IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;

hr = pSource->CreatePresentationDescriptor(&pPresentation);

if (SUCCEEDED(hr))
{
    hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}

if (SUCCEEDED(hr))
{
    for (DWORD iStream = 0; iStream < cStreams; iStream++)
    {
        hr = pPresentation->GetStreamDescriptorByIndex(
            iStream, &fSelected, &pStreamDesc);

        if (FAILED(hr))
        {
            break;
        }

        /*  Use the stream descriptor. (Not shown.) */

        SAFE_RELEASE(pStreamDesc);
    }
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);

Handlers voor mediatypen

Als u het mediatype van de stream wilt wijzigen of het huidige mediatype van de stream wilt ophalen, gebruikt u de handler voor het mediatype van de streamdescriptor. Roep IMFStreamDescriptor::GetMediaTypeHandler aan om de handler voor mediatypen op te halen. Deze methode retourneert een IMFMediaTypeHandler aanwijzer.

Als u gewoon wilt weten welk soort gegevens zich in de stream bevinden, zoals audio of video, kunt u IMFMediaTypeHandler::GetMajorType. Deze methode retourneert de GUID voor het primaire mediatype. Een afspeeltoepassing verbindt bijvoorbeeld meestal een audiostream met de audio-renderer en een videostream met de video-renderer. Als u de mediasessie of het topologielaadprogramma gebruikt om een topologie te bouwen, is de belangrijkste type-GUID mogelijk de enige indelingsgegevens die u nodig hebt.

Als uw toepassing meer gedetailleerde informatie nodig heeft over de huidige indeling, roept u IMFMediaTypeHandler::GetCurrentMediaType. Deze methode retourneert een aanwijzer naar de IMFMediaType interface van het mediatype. Gebruik deze interface om de details van de indeling op te halen.

De handler voor mediatypen bevat ook een lijst met ondersteunde mediatypen voor de stream. Als u de grootte van de lijst wilt ophalen, roept u IMFMediaTypeHandler::GetMediaTypeCountaan. Als u een mediatype wilt ophalen uit de lijst, roept u IMFMediaTypeHandler::GetMediaTypeByIndex aan met de index van het mediatype. Mediatypen worden geretourneerd in de geschatte volgorde van voorkeur. Voor audio-indelingen hebben hogere samplefrequenties bijvoorbeeld de voorkeur boven lagere samplefrequenties. Er is echter geen definitieve regel die van toepassing is op de volgorde, dus u moet deze gewoon behandelen als richtlijn.

De lijst met ondersteunde typen bevat mogelijk niet elk mogelijk mediatype dat door de stream wordt ondersteund. Als u wilt testen of een bepaald mediatype wordt ondersteund, roept u IMFMediaTypeHandler::IsMediaTypeSupportedaan. Als u het mediatype wilt instellen, roept u IMFMediaTypeHandler::SetCurrentMediaTypeaan. Als de methode slaagt, bevat de stream gegevens die voldoen aan de opgegeven indeling. De methode SetCurrentMediaType wijzigt niet de lijst met voorkeurstypen.

De volgende code laat zien hoe u de handler voor het mediatype opsommen, de voorkeursmediatypen opsommen en het mediatype instelt. In dit voorbeeld wordt ervan uitgegaan dat de toepassing een algoritme heeft dat hier niet wordt weergegeven voor het selecteren van het mediatype. De specifieke gegevens zijn sterk afhankelijk van uw toepassing.

HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL  bTypeOK = FALSE;

IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;

hr = pStreamDesc->GetMediaTypeHandler(&pHandler);

if (SUCCEEDED(hr))
{
    hr = pHandler->GetMediaTypeCount(&cTypes);
}

if (SUCCEEDED(hr))
{
    for (DWORD iType = 0; iType < cTypes; iType++)
    {   
        hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);

        if (FAILED(hr))
        {
            break;
        }

        /* Examine the media type. (Not shown.)  */

        /* If this media type is acceptable, set the media type. */

        if (bTypeOK)
        {
            hr = pHandler->SetCurrentMediaType(pMediaType);
            break;
        }

        SAFE_RELEASE(pMediaType);
    }
}    

SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);

mediabronnen

Media Foundation Platform-API's