Промяна на разделителната способност с помощта на медийна основа под win 7

Пиша приложение на най-добра медийна основа под win 7, използвам IMFMediaSource, за да отправя запитвания към интерфейсите на камерите, за да получа рамки и други свойства. странно е, но не мога да намеря начин да променя резолюцията. изглежда, че ако използвах IMFCaptureSource, бих могъл да използвам SetCurrentDeviceMediaType, за да променя резолюцията, но се поддържа само в Windows 8. така че не можем да променим разделителната способност под win 7, използвайки медийна основа?? има ли начин да се използва директно показване с 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 Streaming Interface като 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
hr връща E_NOINTERFACE :( - person Eldar; 18.04.2013
comment
@Kaleldar, дайте ми известно време, ще се свържа с вас с мостра - person Chris_vr; 19.04.2013