У меня есть приложение DirectShow для создания молчащих видео, чей фильтр графКак подключить исходный фильтр к кодеру DMO?
my video frame generator -> selectable video compressor -> AVI mux -> file writer
или просто
my video frame generator -> AVI mux -> file writer
Это в основном работает, как ожидалось, если выбран компрессор не является DMO, в этом случае Вызов pFilterGraph-> Connect() из источника в компрессор завершается с ошибкой - обычно с VFW_E_TYPE_NOT_ACCEPTED или VFW_E_CANNOT_CONNECT. Я бы хотел, чтобы DMO работали тоже. Я нашел устаревший образец (AVIEncoderDShow), который я смог настроить для сжатия входного AVI-файла с помощью DMV WMV9, который казался многообещающим на этот счет. Ее график фильтр
pFilterGraph->AddSourceFilter(AVI file) -> AVI splitter -> DMO wrapper for WMV -> AVI mux -> file writer
, так что я думал, что я мог бы просто поменять фильтр источника для моего фильтра (или прыгающий мяч образца DirectShow, что он основан на). Попытка, которая только дает те же самые сбои соединения, хотя. Источником, который я поставляю, является 32-разрядный RGB, который должен принять WMV9. Что он может наткнуться?
EDIT: Детали моего предпочтительного типа носителя являются:
majortype: MEDIATYPE_Video
subtype: MEDIASUBTYPE_RGB32
bFixedSizeSamples: 1
bTemporalCompression: 0
lSampleSize: 3145728
formattype: CLSID_KsDataTypeHandlerVideo
pUnk: NULL
cbFormat: 1128
pbFormat: 0x12ce4bf0
и точная точка отказа с VFW_E_TYPE_NOT_ACCEPTED является
hr = pReceivePin->ReceiveConnection((IPin *)this, pmt);
CBasePin::AttemptConnection(IPin * pReceivePin, const CMediaType * pmt) Line 1796 C++
CBasePin::AgreeMediaType(IPin * pReceivePin, const CMediaType * pmt) Line 1939 C++
CBasePin::Connect(IPin * pReceivePin, const _AMMediaType * pmt) Line 1728 C++
CFilterGraph::ConnectDirectInternal(struct IPin *,struct IPin *,struct _AMMediaType const *) Unknown
CFilterGraph::ConnectDirect(struct IPin *,struct IPin *,struct _AMMediaType const *) Unknown
ConnectFilters(IBaseFilter * pUpstream, IBaseFilter * pDownstream, IGraphBuilder * pGraph, _AMMediaType * pmt) Line 332 C++
pbFormat Мой тип материала для печати в устанавливается как VIDEOINFO, который, похоже, имеет ту же структуру, что и VIDEOINFOHEADER, но с дополнительными данными, прикрепленными к концу. Это выглядит следующим образом:
rcSource {LT(0, 0) RB(0, 0) [0 x 0]} tagRECT
rcTarget {LT(0, 0) RB(0, 0) [0 x 0]} tagRECT
dwBitRate 0 unsigned long
dwBitErrorRate 0 unsigned long
AvgTimePerFrame 0 __int64
bmiHeader {biSize=40 biWidth=1024 biHeight=768 ...} tagBITMAPINFOHEADER
biSize 40 unsigned long
biWidth 1024 long
biHeight 768 long
biPlanes 1 unsigned short
biBitCount 32 unsigned short
biCompression 0 unsigned long
biSizeImage 3145728 unsigned long
biXPelsPerMeter 0 long
biYPelsPerMeter 0 long
biClrUsed 0 unsigned long
biClrImportant 0 unsigned long
bmiColors 0x0d381c60 {{rgbBlue=0 '\0' rgbGreen=0 '\0' rgbRed=0 '\0' ...}, {rgbBlue=0 '\0' rgbGreen=0 '\0' rgbRed=...}, ...} tagRGBQUAD[256]
dwBitMasks 0x0d381c60 {0, 0, 0} unsigned long[3]
[0] 0 unsigned long
[1] 0 unsigned long
[2] 0 unsigned long
TrueColorInfo {dwBitMasks=0x0d381c60 {0, 0, 0} bmiColors=0x0d381c6c {{rgbBlue=0 '\0' rgbGreen=0 '\0' rgbRed=0 '\0' ...}, ...} }
'VFW_E_TYPE_NOT_ACCEPTED' означает, что тип несовместим. DMO будет принимать только некоторые типы носителей, и ваш источник также может предоставлять данные определенного типа медиа. Вам удастся подключиться, если есть совпадение ... Возможно, вам следует разместить более подробную информацию о том, что именно у вас есть (тип носителя в источнике). –
'CLSID_KsDataTypeHandlerVideo' является' FORMAT_VideoInfo'? Что в 'VIDEOINFOHEADER'. Я бы предположил, что WMV-кодер принимает 32-битный RGB. –
@RomanR .: Да, это то же значение, что и FORMAT_VideoInfo. Я добавил информацию к основному вопросу. – tombola