BLACK_CRAFTER666 | Дата: Пятница, 09.08.2013, 12:57 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 31
Статус: Offline
| И снова здравствуйте. Решил попробовать разобраться таки с Pin'ами. Чтобы вручную собрать граф, нужно точно знать, какие фильтры должны использоваться. Для формата MPG это точно будут Elecard MPEG Demultiplexer + FFDShow video decoder, либо Microsoft DTV-DVD Video decoder. Для других форматов строить граф пока не планирую, так как не умею определять FourCC. Собираю граф для файла *.mpg:
Код const CLSID_ElecardMPEGDemultiplexer : TGUID = '{136DCBF5-3874-4B70-AE3E-15997D6334F7}'; CLSID_MicrosoftDTVDVDVideoDecoder : TGUID = '{212690FB-83E5-4526-8FD7-74478B7939CD}'; CLSID_FfdshowVideoDecoder : TGUID = '{04FE9017-F873-410E-871E-AB91661A4EF7}';
function tform1.BuildGraph: HRESULT; const nl = #13#10; var InPin, OutPin : IPin; VideoFilter : IBaseFilter; begin Result := S_FALSE;
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER , IID_IGraphBuilder, pGraphBuilder); CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, pCaptureGraphBuilder); pCaptureGraphBuilder.SetFiltergraph(pGraphBuilder);
//FileName := 'd:\(2013) Disney - June 13 15 43 17.mpg'; FileName := 'c:\1.mpg';
pGraphBuilder.AddSourceFilter(StringToOleStr(FileName),'source file',fSource); if not Assigned(fSource) then begin MessageBox(Form1.Handle,PChar('?????????? ?????????? ????!'+nl+filename), PChar('??????!'),MB_ICONERROR); ClearGraph; Result := S_FALSE; Exit; end; CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, pVideoRender); pGraphBuilder.AddFilter(pVideoRender, 'Video Mixing Renderer 9'); Result := CoCreateInstance(CLSID_ElecardMPEGDemultiplexer,nil, CLSCTX_INPROC,IID_IBaseFilter,fElecardDemultiplexer); if Result=s_ok then pGraphBuilder.AddFilter(fElecardDemultiplexer,'elecard demultiplexer') else MessageBox(Form1.Handle,PChar('ELECARD MPEG DEMULTIPLEXER ?? ????????!'),PChar('error'),MB_ICONERROR); Result := CoCreateInstance(CLSID_MicrosoftDTVDVDVideoDecoder,nil,CLSCTX_INPROC, IID_IBaseFilter,fMicrosoftVideoDecoder); if Result=s_ok then pGraphBuilder.AddFilter(fMicrosoftVideoDecoder,'dtvdvd') else MessageBox(Form1.Handle,PChar('Microsoft ?? ????????!'),PChar('error'),MB_ICONERROR); Result := CoCreateInstance(CLSID_FfdshowVideoDecoder,nil,CLSCTX_INPROC, IID_IBaseFilter,ffdshow_video); if Result=s_ok then pGraphBuilder.AddFilter(ffdshow_video,'ffdshow video decoder') else MessageBox(Form1.Handle,PChar('FFDSHOW VIDEO DECODER ?? ????????!'),PChar('error'),MB_ICONERROR);
VideoFilter := fMicrosoftVideoDecoder; //так есть // VideoFilter := ffdshow_video; //так нет if VideoFilter=nil then ShowMessage('video filter = nil');
FindPin2(fSource,PINDIR_OUTPUT,OutPin); FindPin2(fElecardDemultiplexer,PINDIR_INPUT,inpin); if (Assigned(InPin)) and (Assigned(OutPin)) then Result := pGraphBuilder.Connect(OutPin,inpin); // ShowMessage(IntToStr(Result));
FindPin2(fElecardDemultiplexer,PINDIR_OUTPUT,OutPin); FindPin2(VideoFilter,PINDIR_INPUT,inpin); if (Assigned(InPin)) and (Assigned(OutPin)) then begin Result := pGraphBuilder.Connect(OutPin,inpin); end; // ShowMessage(IntToStr(Result));
FindPin2(VideoFilter,PINDIR_OUTPUT,OutPin); FindPin2(pVideoRender,PINDIR_INPUT,inpin); if (Assigned(InPin)) and (Assigned(OutPin)) then Result := pGraphBuilder.Connect(OutPin,inpin); // ShowMessage(IntToStr(Result));
pGraphBuilder.QueryInterface(IID_IMediaControl,pMediaControl); pGraphBuilder.QueryInterface(IID_IMediaPosition,pMediaPosition); pGraphBuilder.QueryInterface(IID_IVideoWindow,pVideoWindow);
pVideoWindow.Put_Owner(Panel1.Handle); pVideoWindow.Put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS); pVideoWindow.SetWindowPosition(Panel1.Left,Panel1.Top, Panel1.ClientWidth,Panel1.ClientHeight); pVideoWindow.put_MessageDrain(Panel1.Handle); pMediaControl.Run; Result := S_OK; end; Звуковые фильтры пока не подключаю. Они нафиг не нужны. А вот с видео получается прикольная штука: Если использовать декодер от Microsoft, то видео есть. А если ffdshow, то ничего нет. Просто окно Panel1. При этом, результат везде равен 0, т.е. всё ок. Собрал такой же граф в GraphStudio - видео есть. Скриншот графа: http://i49.fastpic.ru/big/2013/0730/cf/9835b63a33a006bdcf40a78c685cc1cf.jpg Я помню, что пинами вы не занимались. Но всё-таки, из-за чего это может быть?Добавлено (09.08.2013, 12:57) --------------------------------------------- Я нашел ошибку. Я просто в граф добавлял лишние фильтры. Если добавить только те, которые будут соединяться, тогда всё работает
Сообщение отредактировал BLACK_CRAFTER666 - Вторник, 30.07.2013, 16:47 |
|
| |