3

我正在 win 7 下在顶级媒体基础上编写应用程序,我使用 IMFMediaSource 来查询相机接口以获取帧和其他属性。这很奇怪,但我找不到改变分辨率的方法。似乎如果我使用 IMFCaptureSource 我可以使用 SetCurrentDeviceMediaType 来更改分辨率,但它仅在 Windows 8 中受支持。所以我们不能在 win 7 下使用媒体基础更改分辨率?有没有办法使用直接显示与 IMFMediaSource 来改变分辨率?如果是这样,任何人都可以提供一些代码示例吗?

谢谢!

4

2 回答 2

2

好的,所以我最终发现了。我正在使用 IMFSourceReader 从 MFMediaSource 获取样本,因此在配置 SourceReader 后,您可以迭代相机支持的本机媒体类型,如下所示:

HRESULT nativeTypeErrorCode = S_OK;
DWORD count = 0;
UINT32 streamIndex = 0;
UINT32 requiredWidth = 1600;
UINT32 requiredheight = 900;
while (nativeTypeErrorCode == S_OK)
{
    IMFMediaType * nativeType = NULL;    
    nativeTypeErrorCode = m_pReader->GetNativeMediaType(streamIndex, count, &nativeType);
    if(nativeTypeErrorCode != S_OK) continue;

    // get the media type 
    GUID nativeGuid = {0};
    hr = nativeType->GetGUID(MF_MT_SUBTYPE, &nativeGuid);

    if (FAILED(hr)) return hr;

    UINT32 width, height;
    hr = ::MFGetAttributeSize(nativeType, MF_MT_FRAME_SIZE, &width, &height);

    if (FAILED(hr)) return hr;

    if(nativeGuid == <my type guid> && width == requiredWidth && height == requiredheight)
    {
        // found native config, set it
        hr = m_pReader->SetCurrentMediaType(streamIndex, NULL, nativeType);
        if (FAILED(hr)) return hr;
        break;
    }

    SafeRelease(&nativeType);
    count++;
}

这意味着我没有创建具有所需分辨率的新媒体类型,我获得了具有所需配置的本机媒体类型,并将其设置在 SourceReader 上。

希望它对未来的媒体基金会旅行者有所帮助...... :)

于 2013-04-20T18:33:54.173 回答
0

您可以从 IMediaSource 查询可以更改分辨率的 directshow 接口。

例如:对于相机控制属性,我喜欢这样。

IAMCameraControl* m_pCameraControl = NULL;
HRESULT hr = S_OK;

hr = pMediaSource->QueryInterface(IID_PPV_ARGS(&m_pCameraControl));
if (m_pCameraControl == NULL)
{
    return E_FAIL;
}

同样,在您的情况下,我不确定界面,但我想它将采用以下方式。

 IAMStreamConfig * m_pStreamConfig = NULL;
HRESULT hr = S_OK;

hr = pMediaSource->QueryInterface(IID_PPV_ARGS(&m_pStreamConfig ));
if (m_pCameraControl == NULL)
{
    return E_FAIL;
}
于 2013-04-18T13:50:25.530 回答