Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2013, 14:56   #31
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Есть вот такая штукенция: http://mediaarea.net/ru/MediaInfo
Человек_Борща вне форума Ответить с цитированием
Старый 08.08.2013, 15:24   #32
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Спасибо. Почитаю.
Еще вот что интересует: по-идее, даже если не определять этот чортов кодек, будь он не ладен, ffdshow должен декодировать почти всё. Так?
Собираю граф, подключая ffdshow:
Код:
function tform1.BuildGraph: HRESULT;
var
  n : Integer;
  enumPins: IEnumPins;
  pinDir : _PinDirection;
  pin,InPinVideo,InPinAudio, OutPinVideo,OutPinAudio : IPin;
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 := 'c:\1.flv';
Result := pGraphBuilder.AddSourceFilter(StringToOleStr(FileName),'source file',fSource);
    if Result <> s_ok then
    begin
      MessageBox(Form1.Handle,PChar('?????????? ?????????? ????!'+nl+filename),
                       PChar('??????!'),MB_ICONERROR);
      ClearGraph;
      Result := S_FALSE;
      Exit;
    end;
        CoCreateInstance(CLSID_VideoRenderer, nil, CLSCTX_INPROC,
                      IID_IBaseFilter, pVideoRender);
        pGraphBuilder.AddFilter(pVideoRender, 'Video Mixing Renderer 9');
    Result := CoCreateInstance(CLSID_FfdshowVideoDecoder,nil,CLSCTX_INPROC,
                               IID_IBaseFilter,ffdshow_video);
    if Result=s_ok then
    Result := pGraphBuilder.AddFilter(ffdshow_video,'ffdshow video decoder') else
    MessageBox(Form1.Handle,PChar('FFDSHOW VIDEO DECODER ?? ????????!'),PChar('error'),MB_ICONERROR);

    n := 0;
    fSource.EnumPins(enumPins);
    while (enumPins.Next(1,pin,0)=s_ok) do
      begin
        pin.QueryDirection(pinDir);
        if pinDir = pindir_output then
        begin
          if n=0 then
          OutPinVideo := pin else
          OutPinAudio := pin;
          inc(n);
        end;
      end;

    n := 0;
    ffdshow_video.EnumPins(enumPins);
    while (enumPins.Next(1,pin,0)=s_ok) do
      begin
        pin.QueryDirection(pinDir);
        if pinDir = pindir_input then
        begin
          if n=0 then
          inPinVideo := pin else
          inPinAudio := pin;
          inc(n);
        end;
      end;
    Result := pGraphBuilder.Connect(OutPinVideo,InPinVideo);
    ShowMessage(IntToStr(Result));
    ZeroMemory(@mt,SizeOf(mt));
    Result := InPinVideo.connectionmediaType(mt);
  case Result of
    E_POINTER:
    MessageBox(0,PChar('E_POINTER'),PChar('SOUND ERROR'),MB_ICONERROR);
    VFW_E_NOT_CONNECTED:
    MessageBox(0,PChar('NOT IN GRAPH'),PChar('SOUND ERROR'),MB_ICONERROR);
  end;
  if IsEqualGUID(mt.subtype,mediasubtype_avc1) then
  lbl1.Caption := 'avc, '+ GUIDToString(MEDIASUBTYPE_AVC1);

    n := 0;
    enumPins := nil;
    InPinVideo := nil;
    OutPinVideo := nil;
    pVideoRender.EnumPins(enumPins);
    while (enumPins.Next(1,pin,0)=s_ok) do
      begin
        pin.QueryDirection(pinDir);
        if pinDir = pindir_input then
        begin
          if n=0 then
          inPinVideo := pin else
          inPinAudio := pin;
          inc(n);
        end;
      end;

    n := 0;
    ffdshow_video.EnumPins(enumPins);
    while (enumPins.Next(1,pin,0)=s_ok) do
      begin
        pin.QueryDirection(pinDir);
        if pinDir = pindir_output then
        begin
          if n=0 then
          outPinVideo := pin else
          outPinAudio := pin;
          inc(n);
        end;
      end;
    Result := pGraphBuilder.Connect(OutPinVideo,InPinVideo);
    ShowMessage(IntToStr(Result));
На windows xp это работает - видео идет, а на windows 7 нет - видно только TPanel1.
why is it?
p.s. Нашел косяк. Вопрос закрыт.

Последний раз редактировалось BLACK_RAIN; 09.08.2013 в 09:52.
BLACK_RAIN вне форума Ответить с цитированием
Старый 09.11.2013, 20:51   #33
RavangerV
Новичок
Джуниор
 
Регистрация: 03.10.2013
Сообщений: 2
По умолчанию DirectShow граф

а вы не могли бы подсказать как найти количество выходов Ouput У файла, к примеру если в графе смотреть, там у Mkv есть видео, аудио, и субтитры, а у avi, видео и аудио. Как узнать сколько таких выходов у файла??
P.S: Изучаю все методом тыка, так что если можно поканкретней)

Последний раз редактировалось RavangerV; 09.11.2013 в 20:53.
RavangerV вне форума Ответить с цитированием
Старый 11.11.2013, 10:50   #34
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от RavangerV Посмотреть сообщение
к примеру если в графе смотреть, там у Mkv есть видео, аудио, и субтитры, а у avi, видео и аудио.
Это зависит от того, имеет ли исходный файл видео/аудио/субтитры.

Цитата:
Сообщение от RavangerV Посмотреть сообщение
Как узнать сколько таких выходов у файла??
Для этого надо подключить к исходному файлу сплиттер и перебрать его выходные пины. Вот один из способов:
Код:
var
pin : ipin;
enumPins : IEnumPins;
pindir : _PinDirection;
begin
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER , IID_IGraphBuilder, pGraphBuilder);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
                         pCaptureGraphBuilder);
pCaptureGraphBuilder.SetFiltergraph(pGraphBuilder);
      Result := pGraphBuilder.AddSourceFilter(StringToOleStr(fn),
                                     StringToOleStr(ExtractFileName(fn)),fSource);
        n := 0;
        pin := nil;
        enumPins := nil;
        fSource.EnumPins(enumPins);
        while (enumPins.Next(1,pin,0)=s_ok) do
      begin
        pin.QueryDirection(pinDir);
        if pinDir = pindir_output then
        begin
          ///////bla-bla-code/////////
          inc(n);  //n = количество выходов
        end;
      end;
      pin := nil;
        enumPins := nil;
Однако, такой способ распознает не все файлы. В этом случае, нужно подключать сплиттер вручную.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
построение графа !! drylozav Помощь студентам 0 06.10.2010 01:23
Построение графа nissa Помощь студентам 0 08.05.2010 00:57
Построение графа транзакций. Alex_sim Общие вопросы .NET 7 29.04.2010 21:58
Построение и иследование графа Сашf Общие вопросы Delphi 1 17.05.2009 17:35