ストリーム形式
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
MSDV と UVC ドライバーの両方で、インターリーブオーディオビデオまたはビデオのみという 2 つの DV 形式を出力できます。 インターリーブオーディオビデオは、デバイスの元の形式です。 ビデオのみの形式には同じデータが含まれていますが、サンプルにはオーディオ データがないとマークされています。 ビデオのみの形式は、主に Video for Windows を使用するアプリケーションとの互換性のために存在します。 詳細については、「 Type-1 vs. Type-2 DV AVI Files」を参照してください。
MSDV ドライバー
MSDV ドライバーには、2 つの出力ピンがあります。 最初の出力ピンはインターリーブ データを送信し、2 番目の出力ピンはビデオ専用データを送信します。 一度に接続できる出力ピンは 1 つだけです。 形式を選択するには、適切な出力ピンを接続します。 出力ピンで IAMStreamConfig インターフェイスを使用して、形式を見つけることができます。
UVC ドライバー
MSDV ドライバーとは異なり、UVC ドライバーは同じピンから両方の形式を提供します。 既定の形式はビデオのみです。 形式を選択するには、出力ピンで IAMStreamConfig インターフェイスを使用します。 GetStreamCaps メソッドを呼び出して、出力ピンのメディアの種類を列挙します。 メディアの種類ごとに、メジャーの種類が目的の形式と一致する場合は、 SetFormat を呼び出して、そのメディアの種類を渡します。
フォーマット | メジャーの種類 |
---|---|
インターリーブオーディオとビデオ | MEDIATYPE_Interleaved |
ビデオのみ | MEDIATYPE_Video |
次の関数は、メジャー型 GUID に基づいて形式を設定します。
HRESULT SetStreamFormat(IAMStreamConfig *pConfig, const GUID& majorType)
{
if (pConfig == NULL)
{
return E_POINTER;
}
// Get the number of stream capabilities.
int count = 0, size = 0;
HRESULT hr = pConfig->GetNumberOfCapabilities(&count, &size);
if (FAILED(hr))
{
return hr;
}
// Allocate memory for the stream capabilities structure.
BYTE *pCaps = new BYTE[size];
if (pCaps == NULL)
{
return E_OUTOFMEMORY;
}
// Enumerate the stream capabilities.
bool bFoundType = false;
for (int ix = 0; ix < count; ix++)
{
AM_MEDIA_TYPE *pmt;
hr = pConfig->GetStreamCaps(ix, &pmt, pCaps);
if (FAILED(hr))
{
break;
}
else if (pmt->majortype == majorType)
{
// This is the media type we want.
bFoundType = true;
hr = pConfig->SetFormat(pmt);
DeleteMediaType(pmt);
break;
}
DeleteMediaType(pmt);
}
delete [] pCaps;
if (FAILED(hr))
{
return hr;
}
return bFoundType ? S_OK : E_FAIL;
}
MSDV ドライバーでは IAMStreamConfig もサポートされているため、両方のデバイスの種類に対応するコードを記述できます。
関連トピック