Udostępnij przez


Ustawianie typu nośnika grupy

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei 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.]

[Ten interfejs API nie jest obsługiwany i może zostać zmieniony lub niedostępny w przyszłości.]

Wszystkie grupy muszą zdefiniować nieskompresowany typ nośnika, audio lub wideo. Typ nieskompresowanego nośnika to format, który odbiorcy widzą lub słyszą podczas odtwarzania treści. Zazwyczaj ostateczne dane wyjściowe będą mieć skompresowany format. Aby uzyskać więcej informacji, zobacz Renderowanie projektu.

Aby ustawić nieskompresowany format, utwórz strukturę AM_MEDIA_TYPE i wypełnij ją odpowiednim typem głównym, podtypem i nagłówkiem formatu. W przypadku wideo należy przydzielić strukturę VIDEOINFOHEADER dla bloku formatu i ustawić szerokość, wysokość oraz głębię bitową. W przypadku dźwięku należy przydziel strukturę WAVEFORMATEX dla bloku formatu i ustaw częstotliwość próbkowania, głębokość bitów i liczbę kanałów. Jeśli ustawisz tylko typ główny, des udostępnia rozsądne wartości domyślne dla innych wartości. W praktyce należy jawnie ustawić wartości w celu kontrolowania danych wyjściowych.

Po zainicjowaniu struktury typów multimediów wywołaj metodę IAMTimelineGroup::SetMediaType, aby ustawić typ nośnika dla grupy.

Poniższy przykład określa 16-bitowe wideo RGB, 320 pikseli szerokości o wysokości 240 pikseli:

AM_MEDIA_TYPE mtGroup;  
mtGroup.majortype = MEDIATYPE_Video;
mtGroup.subtype = MEDIASUBTYPE_RGB555;

// Set format headers.
mtGroup.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));
if (mtGroup.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}

VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mtGroup.pbFormat;
ZeroMemory(pVideoHeader, sizeof(VIDEOINFOHEADER));
pVideoHeader->bmiHeader.biBitCount = 16;
pVideoHeader->bmiHeader.biWidth = 320;
pVideoHeader->bmiHeader.biHeight = 240;
pVideoHeader->bmiHeader.biPlanes = 1;
pVideoHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pVideoHeader->bmiHeader.biSizeImage = DIBSIZE(pVideoHeader->bmiHeader);

// Set the format type and size.
mtGroup.formattype = FORMAT_VideoInfo;
mtGroup.cbFormat = sizeof(VIDEOINFOHEADER);

// Set the sample size.
mtGroup.bFixedSizeSamples = TRUE;
mtGroup.lSampleSize = DIBSIZE(pVideoHeader->bmiHeader);

// Now use this media type for the group.
pGroup->SetMediaType(&mtGroup);

// Clean up.
CoTaskMemFree(mtGroup.pbFormat);

W następnym przykładzie określono grupę audio, ustawiając typ nośnika grupy na 16-bitowy stereo, 44100 próbek na sekundę:

AM_MEDIA_TYPE mt;  
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));

mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;

// Set format block.
mt.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(WAVEFORMATEX));
if (mt.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}
mt.cbFormat = sizeof(WAVEFORMATEX);

// Fill in the WAVEFORMATEX structure.
WAVEFORMATEX *wave = (WAVEFORMATEX*) mt.pbFormat;
wave->wFormatTag = WAVE_FORMAT_PCM;
wave->nChannels = 2;  // Stereo
wave->nSamplesPerSec = 44100;
wave->wBitsPerSample = 16;
wave->nBlockAlign = wave->nChannels * wave->wBitsPerSample/8;
wave->nAvgBytesPerSec = wave->nSamplesPerSec * wave->nBlockAlign; 
wave->cbSize = 0;

hr = pGroup->SetMediaType(&mt);
CoTaskMemFree(mt.pbFormat);

Można również użyć klasy CMediaType w klasach bazowych DirectShow do zarządzania typami multimediów. Zawiera kilka przydatnych metod pomocniczych i automatycznie zwalnia blok formatu.

O typach multimediów

Konstruowanie osi czasu