Я видел другие вопросы, но у меня почему-то не получается. Среда: Windows 10 MediaFoundation/SourceReader в асинхронном режиме, веб-камера Logitech C922 1080p pro.
Проблема:
Я пытаюсь прочитать веб-камеру, используя медиа-фонд в асинхронном режиме, используя sourcereader. Я получаю вызов
::OnReadSample()
с частотой 60-65 мс вместо ожидаемых 33,33 мс для 30 кадров в секунду.Проверено
hr = m_pReader->GetCurrentMediaType(
(DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM,
&pType
);
и атрибуты печати для pType, что MF_MT_FRAME_RATE
равно 30 x 1. И MIN
, и MAX RANGE
также имеют размер 30 x 1.
- В обратном вызове
::OnReadSample()
также проверено, что Mediatype такой же. Флаги потока не установлены дляMF_SOURCE_READERF_CURRENTMEDIATYPECHANGED
бита. Таким образом, currentmediatype не изменился внутри.
hr = m_pReader->GetCurrentMediaType(
(DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM,
&pt
);
- Я установил частоту кадров даже с помощью https://docs.microsoft.com/en-us/windows/win32/medfound/how-to-set-the-video-capture-frame-rate точная функция на странице выше но все же его вызывают каждые 64 мс или около того. Ниже приведен снимок используемого
pType
.
MF_MT_FRAME_SIZE 640 x 480
MF_MT_AVG_BITRATE 147456000
MF_MT_YUV_MATRIX 2
MF_MT_MAJOR_TYPE MFMediaType_Video
MF_MT_VIDEO_LIGHTING 3
MF_MT_DEFAULT_STRIDE 1280
MF_MT_VIDEO_CHROMA_SITING 6
MF_MT_AM_FORMAT_TYPE {F72A76A0-EB0A-11D0-ACE4-0000C0CC16BA}
MF_MT_FIXED_SIZE_SAMPLES 1
MF_MT_VIDEO_NOMINAL_RANGE 2
MF_MT_FRAME_RATE 30 x 1
MF_MT_PIXEL_ASPECT_RATIO 1 x 1
MF_MT_ALL_SAMPLES_INDEPENDENT 1
MF_MT_FRAME_RATE_RANGE_MIN 30 x 1
MF_MT_SAMPLE_SIZE 614400
MF_MT_VIDEO_PRIMARIES 2
MF_MT_INTERLACE_MODE 2
MF_MT_FRAME_RATE_RANGE_MAX 30 x 1
MF_MT_SUBTYPE MFVideoFormat_YUY2
Пожалуйста, подскажите, чего может не хватать в таком случае. Я как бы получаю 15 кадров в секунду вместо 30 кадров в секунду, которые запрашиваются. Я перечислил типы носителей устройства, и оно поддерживает 30 кадров в секунду.
Заранее спасибо.