DirectShow AviMux в оттенках серого MJPEG

Написал компрессор MJPEG DirectShow filter, работает без проблем для цветных изображений. Но когда я пытаюсь поддерживать 8-битные изображения в оттенках серого, я не могу подключить свой фильтр к фильтру мультиплексора Microsoft AVI. Это всегда будет терпеть неудачу в ReceiveConnection. Я в основном копирую BITMAPINFOHEADER входного изображения и меняю biCompression на MJPG и уменьшаю biSizeImage.

Есть ли у Microsoft AVI Muxer какие-либо требования к своему распределителю? Я использую размер выходного BITMAPINFOHEADER и в настоящее время не забочусь о префиксе или выравнивании.

BITMAPINFHEADER выглядит следующим образом: biSize 1064 biWidth 640 biHeight -480 biPlanes 1 biBitCount 8 biCompression 1196444237 biSizeImage 184320 biXPelsPerMeter 0 biYPelsPerMeter 0 biClrUsed 0 biClrImportant 0

Изменение высоты на положительное значение не имеет никакого эффекта. BiSize больше обычного, так как мы используем заголовок, поэтому сохраните дополнительную информацию для кодировки. В цветовом режиме у нас тот же BITMAPINFOHEADER, за исключением того, что значение biBitCount равно 24.


person bazz-dee    schedule 15.02.2018    source источник
comment
Почему бы вам не включить в свой вопрос полную распечатку типа носителя и VIDEOINFOHEADER? То, как вы видите это в отладчике как можно позже, до появления ошибки.   -  person Roman R.    schedule 15.02.2018
comment
Потому что там не так много интересного, кроме размера изображения. biSize 1064 biWidth 640 biHeight -480 biPlanes 1 biBitCount 8 biCompression 1196444237 biSizeImage 184320 biXPelsPerMeter 0 biYPelsPerMeter 0 biClrUsed 0 biClrImportant 0   -  person bazz-dee    schedule 19.02.2018
comment
Цитата VIDEOINFOHEADER не подходит для MJPG.   -  person Roman R.    schedule 19.02.2018
comment
Что выглядит не так? Единственное изменение в рабочем цветовом режиме — количество бит.   -  person bazz-dee    schedule 19.02.2018


Ответы (1)


Фильтр AVI Mux отклоняет типы носителей неправильного формата. Хотя это не единственная возможная причина, в данном случае она выглядит наиболее вероятной (в вопросе действительно не хватает деталей).

Чтобы узнать допустимый тип медиа-образца, необходимо построить график фильтра, который преобразуется в действительный воспроизводимый файл MJPG AVI, например, с помощью GraphStudioNext и внимательно просмотрите поля типа мультимедиа.

введите здесь описание изображения

Биты данных, прикрепленные к исходному вопросу, предполагают, что по крайней мере biSize и biHeight нуждаются в исправлении.

person Roman R.    schedule 19.02.2018
comment
Пробовал менять высоту, но безрезультатно. BiSize правильный, так как мы прикрепляем пользовательский бит к заголовку bitmapinfoheader. То же самое проделываем для цветового режима, все работает без проблем. - person bazz-dee; 19.02.2018
comment
Я пытаюсь подключиться с помощью graphstudionext, и он не показывает больше информации, чем отладчик. - person bazz-dee; 19.02.2018
comment
Вы не разместили полную структуру, которая у вас есть. Вы не опубликовали соответствующие значения структуры цвета, которые вам подходят. Неверное значение biSize (см. MSDN). biHeight неверно. У вас могут быть и другие неверные значения. AVI Mux натыкается на одну из многочисленных проблем, которые у вас есть (однако другие проблемы могут быть проигнорированы, а это означает, что очевидная проблема может быть разрешена для данного конкретного фильтра). - person Roman R.; 19.02.2018
comment
biHeight может быть отрицательным, чтобы указать изменение высоты. Когда я использую абсолютную высоту, DirectShow вставляет декодер сразу после кодировщика, что вообще не имеет смысла. Размер может варьироваться, у вас может быть палитра после BITMAPINFOHEADER или, в нашем случае, некоторые метаданные для декодирования. Эти данные должны быть на месте, и для RGB-изображений это не проблема. - person bazz-dee; 19.02.2018
comment
Даже несмотря на то, что исправить biSize и biHeight не получается. DirectShow будет использовать декодер после кодировщика перед отправкой данных в мультиплексор. - person bazz-dee; 19.02.2018
comment
Это все неправильно. Здесь речь идет о типе носителя на входе мультиплексора AVI. Тип мультимедиа MJPG не может иметь порядок строк снизу вверх. MJPG не имеет палитры. Снимок экрана выше дает вам правильный пример добавления дополнительных байтов, который работает в противоположность вашему способу предоставления недопустимого значения для biSize. Поскольку вы делаете так много неправильно, я не понимаю, как вы до сих пор не отредактировали свой вопрос, указав все данные, которые вы можете предоставить для вопроса. - person Roman R.; 19.02.2018
comment
Да, MJPEG не нуждается в этой информации. Но заголовок avi, написанный мультиплексором, нуждается в этой информации. Также в цветовом режиме MJPEG не имеет палитры. Но это работает. Так почему же мультиплексор avi принимает заголовок в цветном режиме всего с одним изменением? Как DirectShow считает правильным добавить декодер между кодировщиком и мультиплексором, если я исправлю указанные вами параметры? - person bazz-dee; 19.02.2018
comment
Когда AVI Mux не может установить соединение, Filter Graph Manager пытается установить соединение, используя другие промежуточные фильтры. Он просматривает список зарегистрированных фильтров и монтирует некоторые из них между контактами, которые вы подключаете, пытаясь установить соединение с обеих сторон. Вот как в дело вступает декодер, но здесь это просто справочная информация, которая в первую очередь отвлекает от проблемы. - person Roman R.; 19.02.2018