Я использую Video Resizer DSP Video Resizer DSP, чтобы изменить размер моего видео. Я работаю с Lazarus Free Pascal и DSPack.Как работать с AMMediaType для видеофильтров
Этот сайт объясняет, как использовать: http://alax.info/blog/1371
- CoCreateInstance ЦСП, как DMO и добавить его в ДМО обертке фильтра
- Используйте IWMResizerProps :: SetFullCropRegion для инициализации DSP
- Подключите входной контакт
- Установить тип выходного сигнала через IMediaObject :: SetOutputType
- IGraphBuilder :: вывод вывода ConnectDirect
Я пишу это:
//Create Resizer DMO
hr := CoCreateInstance(CLSID_DMOWrapperFilter, NIL, CLSCTX_ALL,
IID_IBaseFilter, FResizerDMO);
if FAILED(hr) then EXIT;
//CLSID_CVideoResizerDMO = '{1ea1ea14-48f4-4054-ad1a-e8aee10ac805}'
Hr := (FResizerDMO as IDMOWrapperFilter).Init(CLSID_CVideoResizerDMO,
DMOCATEGORY_VIDEO_EFFECT);
if FAILED(Hr) then EXIT;
//Add filter to graph
(fgRender as IGraphBuilder).AddFilter(FResizerDMO, 'Resizer');
if FAILED(Hr) then EXIT;
// end create FResizerDMO in my graph
// Set output type via IMediaObject::SetOutputType and create structure
ZeroMemory(@mt, sizeof(DMO_MEDIA_TYPE));
mt.majortype := MEDIATYPE_Video;
mt.subtype := MEDIASUBTYPE_RGB32;
mt.formattype := FORMAT_VideoInfo;
mt.lSampleSize := pVIH.bmiHeader.biSize;
FillChar(pVIH, SizeOf(TVideoInfoHeader), 0);
mt.pbFormat := CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));
pVIH := TVideoInfoHeader(mt.pbFormat^);
pVIH.bmiHeader.biWidth := 720;
pVIH.bmiHeader.biHeight := 576;
pVIH.bmiHeader.biXPelsPerMeter:=9;
pVIH.bmiHeader.biYPelsPerMeter:=16;
pVIH.bmiHeader.biSize := SizeOf(TBitmapInfoHeader);
pVIH.bmiHeader.biSizeImage := 720 * 576 * 4;
// connect pin and next
hr := (FResizerDMO as IMediaObject).SetOutputType
(0,@mt,DMO_SET_TYPEF_CLEAR);
в час я получить DMO_E_TYPE_NOT_ACCEPTED. , где я ошибаюсь? Может кто-нибудь мне помочь? Спасибо.
'biBitCount' должно быть 32, а не 4. –