流格式

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia 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,因此你可以编写适用于这两种设备类型的代码。

控制 DV 摄像机