流格式
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
MSDV 和 UVC 驱动程序都可以输出两种 DV 格式:交错音频-视频或仅视频。 交错音频视频是设备的原始格式。 仅视频格式包含相同的数据,但示例被标记为没有音频数据。 仅视频格式的存在主要是为了与使用 Windows 视频的应用程序兼容。 有关详细信息,请参阅 Type-1 与 Type-2 DV AVI Files。
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,因此你可以编写适用于这两种设备类型的代码。
相关主题