2016-12-07 29 views
1

Я пытаюсь заменить коды DirectShow («DS») на Media Foundation («MF») в своем приложении и встретил одну проблему - не могу установить необходимые fps с помощью MF на веб-камеру , MF позволил мне установить только 30 кадров в секунду. Если я попытаюсь установить 25 кадров в секунду, я всегда получаю ошибку 0xc00d5212 в SetCurrentMediaType(). В DS я могу изменить этот параметр.Media Foundation: Невозможно изменить FPS на веб-камере

Мои коды:

ASSERT(m_pReader); //IMFSourceReader *m_pReader; 
IMFMediaType *pNativeType = NULL; 
IMFMediaType *pType = NULL; 
UINT32 w = 1280; 
UINT32 h = 720; 
UINT32 fps = 25; // or 30 

DWORD dwStreamIndex = MF_SOURCE_READER_FIRST_VIDEO_STREAM; 

// Find the native format of the stream. 
HRESULT hr = m_pReader->GetNativeMediaType(dwStreamIndex, 0, &pNativeType); 
if (FAILED(hr)) 
{ 
    //error 
} 

GUID majorType, subtype; 

// Find the major type. 
hr = pNativeType->GetGUID(MF_MT_MAJOR_TYPE, &majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Define the output type. 
hr = MFCreateMediaType(&pType); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_MAJOR_TYPE, majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Select a subtype. 
if (majorType == MFMediaType_Video) 
{ 
    subtype= MFVideoFormat_RGB24; 
} 
else 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_SUBTYPE, subtype); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, w, h); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_RATE, fps, 1); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = m_pReader->SetCurrentMediaType(dwStreamIndex, NULL, pType); 
if (FAILED(hr)) 
{// hr = 0xc00d5212 
    //!!!!!error - if fps == 25 
} 
return hr; 

спасибо за любую помощь.

ответ

3

Может случиться так, что камера не поддерживает гибкие значения частоты кадров и может работать только с поддерживаемым набором, например: 10, 15, 20, 24, 30 fps. Вы должны иметь возможность перечислять поддерживаемые типы носителей и выбирать ту, которая работает для вас - эти типы носителей обычно включают в себя параметры частоты кадров.

Несмотря на то, что Media Foundation и видеозапись DirectShow в конечном итоге попадают в один и тот же бэкэнд, могут возникнуть расхождения в поведении. В частности, вы работаете с API более высокого уровня Media Foundation, который внутренне взаимодействует с медиа-источником, и может случиться так, что частота кадров приводит к 0xC00D5212. MF_E_TOPO_CODEC_NOT_FOUND «Не найдено подходящего преобразования для кодирования или декодирования контента», хотя технически это был путаница может захватывать в соответствующем режиме.

Смотрите также:

+0

Привет, Роман, я попробовал вашу утилиту MF и получил следующее: моя веб-камера может работать только с 1 и 30 кадрами в секунду. Но DS показал другие вещи - 5, 10, 15, 20, 25 и 30 fps. Зачем? Или веб-камера имеет только 30 кадров в секунду, но DS может делить этот fps на другие частоты кадров? это правда? –

+0

Я думаю, что драйвер WDM сообщает о нескольких частотах кадров, но информация может быть неполной и отфильтрована слоем MF. Просто догадаться - нет достаточной информации, чтобы сказать что-то определенное. –

+0

Привет, я думаю, что это ограничение связано с UVC - USB Video Class - драйвером для Media Foundation. Он ориентирован на платформу WindowsStore и оптимизирован для работы с USB-камерами для получения видео не только с форматами RGB и MJPEG, но и с форматами H264 и H265 от аппаратных кодеров - поэтому это приводит к ограничению функциональности. Для получения большей функциональности вы должны использовать DShow или таймер записи, который будет захватывать фреймы с необходимой частотой кадров. –

0

Я добавил таймер для имитации управления кадров в коды. Поэтому в начале я установил 30 кадров в секунду, затем по шкале fps я пропустил несколько кадров для своего приложения. Благодарим за помощь.