Цветовой формат скрытого потока камеры IMFTransform, IMFTransform :: ProcessOutput возвращает данные стоп-кадра - PullRequest
0 голосов
/ 24 марта 2019

Я очень новичок в Windows Media Foundation API.Я пытаюсь создать программу, которая может отображать и управлять входящим потоком видео с камеры.
Я использую Media Foundation для чтения видеопотока, поддерживаемый цветовой формат NV12, поэтому мне пришлось преобразовать его в RGB илиARGB для создания объекта текстуры Opengl.
Я пытался сделать это, используя чистый код на языке C ++ на стороне процессора, но производительность очень плохая.Затем я попытался использовать IMFTranform для преобразования цвета, производительность очень хорошая, но у меня возникла странная проблема.
IMFTransform::Process возвращает S_OK, но я получаю вывод стоп-кадра.Пиксель конечного изображения не обновляется в реальном времени, он замораживается для многих кадров, а время замораживания становится все длиннее и длиннее.Если я использую чистый код C ++ для преобразования цветов, то все работает нормально.

Вот мой код, https://gist.github.com/zhiqiang-li/16d1a6a1b00e8fb39847c8ca323b5604. Пожалуйста, дайте мне знать, что вы думаете, я делаю неправильно.

1 Ответ

0 голосов
/ 25 марта 2019

Вы пытались позволить SourceReader выполнить преобразование за вас:

hr = mAttributes->SetUINT32(MF_READWRITE_DISABLE_CONVERTERS, FALSE);

По умолчанию считыватель источника и приемник могут выполнять некоторые преобразования формата для несжатых аудио- и видеопотоков. Чтобы отключить это поведение, установите для этого атрибута значение ИСТИНА при создании средства чтения или записи исходного кода.

По умолчанию это FALSE, поэтому вам не нужно явно устанавливать этот атрибут.

Тогда:

hr = mSourceReader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediaType);

с:

mOutputMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);

Также рассчитайте размер изображения в соответствии с форматом NV12 (MF_MT_FRAME_SIZE). Не устанавливайте MF_MT_DEFAULT_STRIDE, SourceReader сделает это за вас.

Таким образом, идея состоит в том, чтобы получить формат NV12 из SourceReader, даже если источник захвата предоставляет формат RGB32. SourceReader обычно может это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...