資料流程格式
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
MSDV 和 UVC 驅動程式都可以輸出兩種 DV 格式:交錯的音訊視訊或僅限視訊。 交錯的音訊視訊是來自裝置的原始格式。 僅限視訊格式包含相同的資料,但範例會標示為沒有音訊資料。 僅限視訊格式主要適用于與使用 Video for Windows 的應用程式相容。 如需詳細資訊,請參閱 Type-1 與 Type-2 DV AVI 檔案。
MSDV 驅動程式
MSDV 驅動程式有兩個輸出針腳。 第一個輸出針腳會傳送交錯的資料,而第二個輸出針腳則會傳送僅限視訊的資料。 一次只能連接一個輸出針腳。 若要選取格式,請連接適當的輸出釘選。 您可以使用輸出針腳上的 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,因此您可以撰寫適用于這兩種裝置類型的程式碼。
相關主題