Sdílet prostřednictvím


Popisovače prezentace

prezentace je sada souvisejících mediálních datových proudů, které sdílejí společný čas prezentace. Prezentace se například může skládat ze zvukových a video streamů z videa. popisovač prezentace je objekt, který obsahuje popis konkrétní prezentace. Popisovače prezentací slouží ke konfiguraci zdrojů médií a některých jímek médií.

Každý popisovač prezentace obsahuje seznam jednoho nebo více popisovačů datových proudů. Ty popisují streamy v prezentaci. Datové proudy je možné vybrat nebo zrušit jejich výběr. Pouze vybrané datové proudy vytvářejí data. Nevybrané datové proudy nejsou aktivní a nevytvářejí žádná data. Každý popisovač datového proudu má obslužnou rutinu typu média, která se používá ke změně typu média datového proudu nebo získání aktuálního typu média datového proudu. (Další informace o typech médií naleznete v tématu Typy médií.)

Následující tabulka ukazuje primární rozhraní, která každý z těchto objektů zveřejňuje.

Objekt Rozhraní
Popisovač prezentace MMFPresentationDescriptor
Popisovač streamu MMFStreamDescriptor
Obslužná rutina typu média MMFMediaTypeHandler

 

Prezentace zdroje médií

Každý zdroj médií poskytuje popisovač prezentace, který popisuje výchozí konfiguraci zdroje. Ve výchozí konfiguraci je vybrán alespoň jeden datový proud a každý vybraný datový proud má typ média. Chcete-li získat popisovač prezentace, zavolejte MMFMediaSource::CreatePresentationDescriptor. Metoda vrátí MMFPresentationDescriptor ukazatel.

Popisovač prezentace zdroje můžete upravit tak, aby vybral jinou sadu datových proudů. Neupravujte popisovač prezentace, pokud není zastaven zdroj médií. Změny se použijí při volání MMFMediaSource::Start ke spuštění zdroje.

Pokud chcete získat počet datových proudů, zavolejte MMFPresentationDescriptor::GetStreamDescriptorCount. Chcete-li získat popisovač streamu, zavolejte MMFPresentationDescriptor::GetStreamDescriptorByIndex a předejte index streamu. Streamy se indexují z nuly. Metoda GetStreamDescriptorByIndex vrátí ukazatel MMFStreamDescriptor. Vrátí také logický příznak označující, jestli je datový proud vybraný. Pokud je datový proud vybraný, zdroj médií vytvoří data pro tento datový proud. Jinak zdroj neprodukuje žádná data pro tento datový proud. Pokud chcete vybrat datový proud, zavolejte MMFPresentationDescriptor::SelectStream s indexem datového proudu. Chcete-li zrušit výběr datového proudu, zavolejte MMFPresentationDescriptor::D eselectStream.

Následující kód ukazuje, jak získat popisovač prezentace ze zdroje médií a vytvořit výčet datových proudů.

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

Obslužné rutiny typů médií

Chcete-li změnit typ média datového proudu nebo získat aktuální typ média datového proudu, použijte popisovač typu média streamu. Volání SOAPStreamDescriptor::GetMediaTypeHandler získat obslužnou rutinu typu média. Tato metoda vrátí ukazatel MMFMediaTypeHandler.

Pokud chcete jednoduše vědět, jaký druh dat je ve streamu, například zvuk nebo video, zavolejte MMFMediaTypeHandler::GetMajorType. Tato metoda vrátí identifikátor GUID pro hlavní typ média. Například aplikace pro přehrávání obvykle připojuje zvukový stream ke zvukovému rendereru a stream videa k rendereru videa. Pokud k vytvoření topologie použijete zavaděč médií nebo zavaděč topologie, může být guid hlavního typu jediné informace o formátu, které potřebujete.

Pokud aplikace potřebuje podrobnější informace o aktuálním formátu, zavolejte MMFMediaTypeHandler::GetCurrentMediaTypeType. Tato metoda vrátí ukazatel na MMFMediaType rozhraní typu média. Pomocí tohoto rozhraní získáte podrobnosti o formátu.

Obslužná rutina typu média obsahuje také seznam podporovaných typů médií pro datový proud. Chcete-li získat velikost seznamu, volání MMFMediaTypeHandler::GetMediaTypeCount. Chcete-li získat typ média ze seznamu, zavolejte ADVISORMediaTypeHandler::GetMediaTypeByIndex s indexem typu média. Typy médií se vrátí v přibližném pořadí předvoleb. Například u zvukových formátů se vyšší vzorkovací frekvence preferují před nižšími vzorkovacími frekvencemi. Neexistuje však žádné konečné pravidlo, které řídí řazení, takže byste s ním měli zacházet jednoduše jako s vodítkem.

Seznam podporovaných typů nemusí obsahovat všechny možné typy médií, které stream podporuje. Chcete-li otestovat, zda je podporován určitý typ média, volání MMFMediaTypeHandler::IsMediaTypeSupported. Chcete-li nastavit typ média, volání MMFMediaTypeHandler::SetCurrentMediaType. Pokud je metoda úspěšná, stream bude obsahovat data, která odpovídají zadanému formátu. Metoda SetCurrentMediaType nezmění seznam upřednostňovaných typů.

Následující kód ukazuje, jak získat obslužnou rutinu typu média, vytvořit výčet upřednostňovaných typů médií a nastavit typ média. V tomto příkladu se předpokládá, že aplikace má určitý algoritmus, který zde není zobrazený pro výběr typu média. Specifika budou výrazně záviset na vaší aplikaci.

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

zdroje médií

rozhraní API platformy Media Foundation