Изменение разрешения с помощью медиафонда под win 7

Я пишу приложение на верхней медиа-основе под Win 7, я использую IMFMediaSource для запроса интерфейсов камер, чтобы получить кадры и другие свойства. это странно, но я не могу найти способ изменить разрешение. кажется, что если бы я использовал IMFCaptureSource, я мог бы использовать SetCurrentDeviceMediaType для изменения разрешения, но он поддерживается только в Windows 8. поэтому мы не можем изменить разрешение под Win 7 с помощью Media Foundation?? есть ли способ использовать прямое шоу с IMFMediaSource для изменения разрешения?? если да, может ли кто-нибудь помочь с примером кода?

Спасибо!


person Eldar    schedule 17.04.2013    source источник


Ответы (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.

надеюсь, это поможет будущему путешественнику из медиа-фонда... :)

person Eldar    schedule 20.04.2013
comment
Спасибо, что поделились кодом. У меня есть один вопрос, почему IMFMediaSource или MFT не поддерживают потоковый интерфейс KS, такой как IKspropertyset IKscontrol. Я когда-либо пробовал это. Пожалуйста, перейдите по ссылке. Я разместил вопрос stackoverflow.com/questions/14880434/ - person Chris_vr; 22.04.2013
comment
Я не хочу спекулировать, я буду иметь дело с наборами свойств KS в медиафонде в ближайший месяц (или 2), скоро вернусь с ответами... - person Eldar; 23.04.2013

Вы можете запросить интерфейс directshow из IMediaSource, который может изменить разрешение.

например: для свойств управления камерой мне нравится это.

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;
}
person Chris_vr    schedule 18.04.2013
comment
час возвращает E_NOINTERFACE :( - person Eldar; 18.04.2013
comment
@Kaleldar дайте мне немного времени, я вернусь к вам с образцом - person Chris_vr; 19.04.2013