Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEngineoraz Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]
Ponieważ directshow jest modułowe, wymaga sposobu opisania formatu danych w każdym punkcie wykresu filtru. Rozważmy na przykład odtwarzanie AVI. Dane wprowadzane są do grafu jako strumień fragmentów RIFF. Są one analizowane na strumienie wideo i audio. Strumień wideo składa się z ramek wideo, które prawdopodobnie są kompresowane. Po dekodowaniu strumień wideo jest serią nieskompresowanych map bitowych. Strumień audio przechodzi przez podobny proces.
Typy multimediów: Jak directshow reprezentuje formaty
Typ nośnika to uniwersalny i rozszerzalny sposób opisywania formatów multimediów cyfrowych. Kiedy dwa filtry łączą się, zgadzają się na typ mediów. Typ nośnika określa, jakiego rodzaju dane będą dostarczane do filtru podrzędnego przez filtr nadrzędny oraz fizyczny układ danych. Jeśli dwa filtry nie mogą uzgodnić typu nośnika, nie będą się łączyć.
W przypadku niektórych aplikacji nigdy nie trzeba martwić się o typy multimediów. Na przykład w odtwarzaniu plików funkcja DirectShow obsługuje wszystkie szczegóły. Inne rodzaje aplikacji mogą wymagać bezpośredniej pracy z typami multimediów.
Typy multimediów są definiowane przy użyciu struktury AM_MEDIA_TYPE. Ta struktura zawiera następujące informacje:
typ główny: Typ główny to identyfikator GUID definiujący ogólną kategorię danych. Główne typy obejmują wideo, audio, nieparzystowany strumień bajtowy, dane MIDI itd.
podtyp: podtyp jest innym identyfikatorem GUID, który dodatkowo definiuje format. Na przykład w typie głównym wideo istnieją podtypy RGB-24, RGB-32, UYVY itd. W ramach dźwięku znajduje się dźwięk PCM, ładunek MPEG-1 i inne. Podtyp zawiera więcej informacji niż typ główny, ale nie definiuje wszystkiego o formacie. Na przykład podtypy wideo nie definiują rozmiaru obrazu ani szybkości klatek. Są one definiowane przez blok formatu opisany poniżej.
Blok formatu: blok formatu jest blokiem danych opisujących szczegółowo format. Blok formatu jest przydzielany oddzielnie od struktury AM_MEDIA_TYPE. Element pbFormat struktury AM_MEDIA_TYPE wskazuje blok formatu.
Element członkowski pbFormat ma typ void*, ponieważ układ bloku formatu zmienia się w zależności od typu nośnika. Na przykład dźwięk PCM używa struktury WAVEFORMATEX. Wideo korzysta z różnych struktur, w tym VIDEOINFOHEADER i VIDEOINFOHEADER2. typ formatu składowa struktury AM_MEDIA_TYPE jest identyfikatorem GUID określającym, która struktura znajduje się w bloku formatu. Każda struktura formatu ma przypisany identyfikator GUID. Element cbFormat określa rozmiar bloku formatu. Zawsze sprawdzaj te wartości przed wyłuszczeniem wskaźnika pbFormat.
Jeśli blok formatu jest wypełniony, typ główny i podtyp zawierają nadmiarowe informacje. Typ główny i podtyp zapewniają jednak wygodny sposób identyfikowania formatów bez kompletnego bloku formatu. Na przykład można określić ogólny 24-bitowy format RGB (MEDIASUBTYPE_RGB24), bez znajomości wszystkich informacji wymaganych przez VIDEOINFOHEADER struktury, takich jak rozmiar obrazu i szybkość klatek.
Na przykład filtr może użyć następującego kodu, aby sprawdzić typ nośnika:
HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
if (pmt == NULL) return E_POINTER;
// Check the major type. We're looking for video.
if (pmt->majortype != MEDIATYPE_Video)
{
return VFW_E_INVALIDMEDIATYPE;
}
// Check the subtype. We're looking for 24-bit RGB.
if (pmt->subtype != MEDIASUBTYPE_RGB24)
{
return VFW_E_INVALIDMEDIATYPE;
}
// Check the format type and the size of the format block.
if ((pmt->formattype == FORMAT_VideoInfo) &&
(pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
(pmt->pbFormat != NULL))
{
// Now it's safe to coerce the format block pointer to the
// correct structure, as defined by the formattype GUID.
VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
// Examine pVIH (not shown). If it looks OK, return S_OK.
return S_OK;
}
return VFW_E_INVALIDMEDIATYPE;
}
Struktura AM_MEDIA_TYPE zawiera również niektóre pola opcjonalne. Mogą one służyć do dostarczania dodatkowych informacji, ale filtry nie są wymagane do ich używania:
- lSampleSize. Jeśli to pole nie jest zerowe, definiuje rozmiar każdej próbki. Jeśli jest to zero, oznacza to, że rozmiar próbki może ulec zmianie z próbki na próbkę.
- bFixedSizeSamples. Jeśli ta flaga logiczna jest true, oznacza to, że wartość w lSampleSize jest prawidłowa. W przeciwnym razie należy zignorować lSampleSize.
- bTemporalCompression. Jeśli ta flaga logiczna jest false, oznacza to, że wszystkie ramki są ramkami kluczowymi.
Tematy pokrewne