Суббота, 16.12.2017, 21:33
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Delphi » DirectShow и Delphi. » MPG-файл и Pin'ы (декодер от Microsoft работает, а ffdshow нет)
MPG-файл и Pin'ы
BLACK_CRAFTER666Дата: Пятница, 09.08.2013, 12:57 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: 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)
---------------------------------------------
Я нашел ошибку.
Я просто в граф добавлял лишние фильтры. Если добавить только те, которые будут соединяться, тогда всё работает smile

Сообщение отредактировал BLACK_CRAFTER666 - Вторник, 30.07.2013, 16:47
 
Форум » Delphi » DirectShow и Delphi. » MPG-файл и Pin'ы (декодер от Microsoft работает, а ffdshow нет)
Страница 1 из 11
Поиск:


Copyright MyCorp © 2017Конструктор сайтов - uCoz