Deskryptory prezentacji
Prezentacja to zestaw powiązanych strumieni multimediów, które mają wspólny czas prezentacji. Na przykład prezentacja może składać się ze strumieni audio i wideo z filmu. Deskryptor prezentacji jest obiektem zawierającym opis określonej prezentacji. Deskryptory prezentacji służą do konfigurowania źródeł multimediów i niektórych ujściów multimediów.
Każdy deskryptor prezentacji zawiera listę co najmniej jednego deskryptora strumienia . Te opisano strumienie w prezentacji. Strumienie można wybrać lub usunąć zaznaczenie. Tylko wybrane strumienie generują dane. Niezaznaczone strumienie nie są aktywne i nie generują żadnych danych. Każdy deskryptor strumienia ma program obsługi typu nośnika, który służy do zmieniania typu nośnika strumienia lub pobierania bieżącego typu nośnika strumienia. (Aby uzyskać więcej informacji na temat typów multimediów, zobacz Typy multimediów.)
W poniższej tabeli przedstawiono podstawowe interfejsy, które uwidacznia każdy z tych obiektów.
Sprzeciwiać się | Interfejs |
---|---|
Deskryptor prezentacji | IMFPresentationDescriptor |
Deskryptor strumienia | IMFStreamDescriptor |
Procedura obsługi typów multimediów | IMFMediaTypeHandler |
Prezentacje źródła multimediów
Każde źródło multimediów udostępnia deskryptor prezentacji opisujący domyślną konfigurację źródła. W konfiguracji domyślnej jest zaznaczony co najmniej jeden strumień, a każdy wybrany strumień ma typ nośnika. Aby uzyskać deskryptor prezentacji, wywołaj IMFMediaSource::CreatePresentationDescriptor. Metoda zwraca wskaźnik IMFPresentationDescriptor.
Deskryptor prezentacji źródła można zmodyfikować, aby wybrać inny zestaw strumieni. Nie należy modyfikować deskryptora prezentacji, chyba że źródło multimediów zostanie zatrzymane. Zmiany są stosowane podczas wywoływania IMFMediaSource::Start, aby uruchomić źródło.
Aby uzyskać liczbę strumieni, wywołaj metodę IMFPresentationDescriptor::GetStreamDescriptorCount. Aby pobrać deskryptor strumienia dla strumienia, wywołaj metodę IMFPresentationDescriptor::GetStreamDescriptorByIndex i przekaż indeks strumienia. Strumienie są indeksowane z zera. Metoda GetStreamDescriptorByIndex zwraca wskaźnik IMFStreamDescriptor. Zwraca również flagę logiczną wskazującą, czy wybrano strumień. W przypadku wybrania strumienia źródło multimediów generuje dane dla tego strumienia. W przeciwnym razie źródło nie generuje żadnych danych dla tego strumienia. Aby wybrać strumień, wywołaj IMFPresentationDescriptor::SelectStream za pomocą indeksu strumienia. Aby usunąć zaznaczenie strumienia, wywołaj metodę IMFPresentationDescriptor::D eselectStream.
Poniższy kod przedstawia sposób pobierania deskryptora prezentacji ze źródła multimediów i wyliczania strumieni.
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);
Programy obsługi typów multimediów
Aby zmienić typ nośnika strumienia lub pobrać bieżący typ nośnika strumienia, użyj programu obsługi typów multimediów deskryptora strumienia. Wywołaj IMFStreamDescriptor::GetMediaTypeHandler, aby uzyskać procedurę obsługi typów multimediów. Ta metoda zwraca wskaźnikIMFMediaTypeHandler.
Jeśli po prostu chcesz wiedzieć, jakiego rodzaju dane są w strumieniu, takie jak audio lub wideo, wywołaj metodę IMFMediaTypeHandler::GetMajorType. Ta metoda zwraca identyfikator GUID dla głównego typu nośnika. Na przykład aplikacja odtwarzania zwykle łączy strumień audio z modułem renderowania audio i strumieniem wideo z modułem renderowania wideo. Jeśli używasz sesji multimediów lub modułu ładującego topologii do utworzenia topologii, identyfikator GUID typu głównego może być jedynymi potrzebnymi informacjami o formacie.
Jeśli aplikacja potrzebuje bardziej szczegółowych informacji o bieżącym formacie, wywołaj metodę IMFMediaTypeHandler::GetCurrentMediaTypeType. Ta metoda zwraca wskaźnik do interfejsu IMFMediaType typu nośnika. Użyj tego interfejsu, aby uzyskać szczegółowe informacje o formacie.
Procedura obsługi typów multimediów zawiera również listę obsługiwanych typów multimediów dla strumienia. Aby uzyskać rozmiar listy, wywołaj IMFMediaTypeHandler::GetMediaTypeCount. Aby uzyskać typ nośnika z listy, wywołaj metodę IMFMediaTypeHandler::GetMediaTypeByIndex z indeksem typu nośnika. Typy multimediów są zwracane w przybliżonej kolejności preferencji. Na przykład w przypadku formatów audio preferowane są wyższe współczynniki próbkowania w przypadku niższych stawek próbek. Nie ma jednak ostatecznej reguły, która rządzi kolejnością, więc należy traktować ją po prostu jako wytyczne.
Lista obsługiwanych typów może nie zawierać każdego możliwego typu nośnika obsługiwanego przez strumień. Aby sprawdzić, czy dany typ nośnika jest obsługiwany, wywołaj metodę IMFMediaTypeHandler::IsMediaTypeSupported. Aby ustawić typ nośnika, wywołaj metodę IMFMediaTypeHandler::SetCurrentMediaTypeType. Jeśli metoda powiedzie się, strumień będzie zawierać dane zgodne z określonym formatem. Metoda SetCurrentMediaType nie zmienia listy preferowanych typów.
Poniższy kod pokazuje, jak pobrać procedurę obsługi typu nośnika, wyliczyć preferowane typy multimediów i ustawić typ nośnika. W tym przykładzie przyjęto założenie, że aplikacja ma jakiś algorytm, a nie pokazany tutaj, aby wybrać typ nośnika. Szczegółowe informacje będą zależeć znacznie od aplikacji.
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);
Tematy pokrewne
-
interfejsy API platformy Media Foundation