Dela via


Presentationsbeskrivningar

En presentation är en uppsättning relaterade medieströmmar som delar en gemensam presentationstid. En presentation kan till exempel bestå av ljud- och videoströmmar från en film. En presentationsbeskrivning är ett objekt som innehåller beskrivningen av en viss presentation. Presentationsbeskrivningar används för att konfigurera mediekällor och vissa mediemottagare.

Varje presentationsbeskrivning innehåller en lista över en eller flera strömbeskrivningar. Dessa beskriver strömmarna i presentationen. Strömmar kan antingen väljas eller avmarkeras. Endast de valda strömmarna producerar data. Avmarkerade strömmar är inte aktiva och producerar inga data. Varje strömbeskrivning har en medietypshanterare, som används för att ändra dataströmmens medietyp eller hämta strömmens aktuella medietyp. (Mer information om medietyper finns i Medietyper.)

I följande tabell visas de primära gränssnitt som vart och ett av dessa objekt exponeras.

Objekt Gränssnitt
Presentationsbeskrivning IMFPresentationDescriptor
Stream-beskrivning IMFStreamDescriptor
Medietypshanterare IMFMediaTypeHandler

 

Media Source-presentationer

Varje mediekälla tillhandahåller en presentationsbeskrivning som beskriver standardkonfigurationen för källan. I standardkonfigurationen väljs minst en ström och varje vald ström har en medietyp. Om du vill hämta presentationsbeskrivningen anropar du IMFMediaSource::CreatePresentationDescriptor. Metoden returnerar en IMFPresentationDescriptor- pekare.

Du kan ändra källans presentationsbeskrivning för att välja en annan uppsättning strömmar. Ändra inte presentationsbeskrivningen om inte mediekällan har stoppats. Ändringarna tillämpas när du anropar IMFMediaSource::Starta för att starta källan.

Om du vill hämta antalet strömmar anropar du IMFPresentationDescriptor::GetStreamDescriptorCount. Om du vill hämta strömbeskrivningen för en ström anropar du IMFPresentationDescriptor::GetStreamDescriptorByIndex och skickar in dataströmmens index. Strömmar indexeras från noll. Metoden GetStreamDescriptorByIndex returnerar en IMFStreamDescriptor- pekare. Den returnerar också en boolesk flagga som anger om strömmen är vald. Om dataströmmen har valts genererar mediekällan data för strömmen. Annars genererar källan inga data för strömmen. Om du vill välja en ström anropar du IMFPresentationDescriptor::SelectStream med dataströmmens index. Om du vill avmarkera en ström anropar du IMFPresentationDescriptor::D eselectStream.

Följande kod visar hur du hämtar presentationsbeskrivningen från en mediekälla och räknar upp strömmarna.

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

Medietyphanterare

Om du vill ändra dataströmmens medietyp eller hämta strömmens aktuella medietyp använder du strömbeskrivningens medietyphanterare. Anropa IMFStreamDescriptor::GetMediaTypeHandler för att hämta medietypshanteraren. Den här metoden returnerar en IMFMediaTypeHandler- pekare.

Om du bara vill veta vilken typ av data som finns i strömmen, till exempel ljud eller video, anropar du IMFMediaTypeHandler::GetMajorType. Den här metoden returnerar GUID för huvudmedietypen. Till exempel ansluter ett uppspelningsprogram vanligtvis en ljudström till ljudåtergivningen och en videoström till videoåtergivningen. Om du använder mediasessionen eller topologiinläsaren för att skapa en topologi kan huvudtypen GUID vara den enda formatinformation som du behöver.

Om programmet behöver mer detaljerad information om det aktuella formatet anropar du IMFMediaTypeHandler::GetCurrentMediaType. Den här metoden returnerar en pekare till IMFMediaType- gränssnitt för medietypen. Använd det här gränssnittet för att hämta information om formatet.

Medietyphanteraren innehåller också en lista över medietyper som stöds för strömmen. Om du vill hämta listans storlek anropar du IMFMediaTypeHandler::GetMediaTypeCount. Om du vill hämta en medietyp från listan anropar du IMFMediaTypeHandler::GetMediaTypeByIndex med medietypens index. Medietyper returneras i ungefärlig prioritetsordning. För ljudformat föredras till exempel högre urvalshastigheter framför lägre urvalshastigheter. Det finns dock ingen slutgiltig regel som styr ordningen, så du bör behandla den helt enkelt som en riktlinje.

Listan över typer som stöds kanske inte innehåller alla möjliga medietyper som strömmen stöder. Om du vill testa om en viss medietyp stöds anropar du IMFMediaTypeHandler::IsMediaTypeSupported. Om du vill ange medietyp anropar du IMFMediaTypeHandler::SetCurrentMediaType. Om metoden lyckas innehåller strömmen data som överensstämmer med det angivna formatet. Metoden SetCurrentMediaType ändrar inte listan över önskade typer.

Följande kod visar hur du hämtar medietypshanteraren, räknar upp önskade medietyper och anger medietyp. Det här exemplet förutsätter att programmet har någon algoritm, som inte visas här, för att välja medietyp. Detaljerna beror mycket på ditt program.

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

mediekällor

Media Foundation Platform-API:er