次の方法で共有


グループ メディアの種類の設定

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

[この API はサポートされていないため、今後変更または使用できない可能性があります。]

すべてのグループで、オーディオまたはビデオの圧縮されていないメディアの種類を定義する必要があります。 圧縮されていないメディアの種類は、再生中に閲覧者が表示または読み上げる形式です。 通常、最終的な出力は圧縮形式になります。 詳細については、「 プロジェクトのレンダリング」を参照してください。

圧縮されていない形式を設定するには、 AM_MEDIA_TYPE 構造体を作成し、適切なメジャー型、サブタイプ、および書式ヘッダーを入力します。 ビデオの場合は、フォーマット ブロックに VIDEOINFOHEADER 構造体を割り当て、幅、高さ、ビット深度を設定します。 オーディオの場合は、フォーマット ブロックに WAVEFORMATEX 構造体を割り当て、サンプル レート、ビット深度、チャネル数を設定します。 メジャー型のみを設定した場合、DES は他の値に対して適切な既定値を提供します。 実際には、出力を制御するために値を明示的に設定する必要があります。

メディアの種類の構造を初期化した後、 IAMTimelineGroup::SetMediaType メソッドを呼び出して、グループのメディアの種類を設定します。

次の例では、16 ビット RGB ビデオを指定します。幅は 320 ピクセル、高さは 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 ビット ステレオ、1 秒あたり 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 クラスを使用して、メディアの種類を管理することもできます。 便利なヘルパー メソッドがいくつか含まれており、書式ブロックが自動的に解放されます。

メディアの種類について

タイムラインの構築