2015-10-22 3 views
0

У меня есть приложение 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' ...}, ...} } 
+0

'VFW_E_TYPE_NOT_ACCEPTED' означает, что тип несовместим. DMO будет принимать только некоторые типы носителей, и ваш источник также может предоставлять данные определенного типа медиа. Вам удастся подключиться, если есть совпадение ... Возможно, вам следует разместить более подробную информацию о том, что именно у вас есть (тип носителя в источнике). –

+0

'CLSID_KsDataTypeHandlerVideo' является' FORMAT_VideoInfo'? Что в 'VIDEOINFOHEADER'. Я бы предположил, что WMV-кодер принимает 32-битный RGB. –

+0

@RomanR .: Да, это то же значение, что и FORMAT_VideoInfo. Я добавил информацию к основному вопросу. – tombola

ответ

0

Некоторые фильтры, особенно мультиплексоры и иногда кодеры, требуют указания частоты кадров видеопотока. Иначе типы носителей отклоняются с общим кодом ошибки, без упоминания о том, что частота кадров является причиной.

WMV9 кодировщика DMO делает принимает 32-битный RGB на входе, так что вы должны попробовать его с положительным значением в AvgTimePerFrameVIDEOINFOHEADER структуре типа носителя:

enter image description here

Смежные вопросы