그룹 미디어 유형 설정
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
[이 API는 지원되지 않으며 나중에 변경되거나 사용할 수 없습니다.]
모든 그룹은 오디오 또는 비디오 중 하나의 압축되지 않은 미디어 형식을 정의해야 합니다. 압축되지 않은 미디어 유형은 시청자가 재생 중에 보거나 듣는 형식입니다. 일반적으로 최종 출력은 압축된 형식입니다. 자세한 내용은 프로젝트 렌더링을 참조하세요.
압축되지 않은 형식을 설정하려면 AM_MEDIA_TYPE 구조를 만들고 적절한 주 형식, 하위 형식 및 형식 헤더로 채웁니다. 비디오의 경우 서식 블록에 VIDEOINFOHEADER 구조를 할당하고 너비, 높이 및 비트 깊이를 설정합니다. 오디오의 경우 형식 블록에 WAVEFORMATEX 구조를 할당하고 샘플 속도, 비트 깊이 및 채널 수를 설정합니다. 주 형식만 설정하면 DES는 다른 값에 적절한 기본값을 제공합니다. 실제로 출력을 제어하도록 값을 명시적으로 설정해야 합니다.
미디어 형식 구조를 초기화한 후 IAMTimelineGroup::SetMediaType 메서드를 호출하여 그룹의 미디어 형식을 설정합니다.
다음 예제에서는 너비가 320픽셀인 16비트 RGB 비디오를 240픽셀 높이로 지정합니다.
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);
다음 예제에서는 그룹 미디어 형식을 초당 16비트 스테레오, 44100 샘플로 설정하여 오디오 그룹을 지정합니다.
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);
DirectShow 기본 클래스에서 CMediaType 클래스를 사용하여 미디어 형식을 관리할 수도 있습니다. 몇 가지 유용한 도우미 메서드가 포함되어 있으며 형식 블록을 자동으로 해제합니다.
관련 항목