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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2013, 14:16   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Видеоплеер DirectShow - ручное построение графа

Здравствуйте.
Основываясь на уже всем известной статье, написал свой видеоплеер.
Интерфейс написал целеком на WinApi. Из статьи взял только создание Графа(Дракулы) и функцию RenderFile(), которая, как я понял, автоматически ищет и подключает нужные кодеки.
Но воспроизведение иногда глючит, а некоторые файлы вообще не открываются.
В связи с этим, возник логичный вопрос: Как построить граф вручную в зависимости от типа/формата исходного видео-файла?
Как узнать, какие сплиттеры/кодеки нужны и как правильно подключить их к Графу(Дракуле)? И как получить список сплиттеров/декодеров, установленных в системе? Пробовал ковыряться во флагах(или как их там) CLSID_*, но не нашел, какие из них получают список видеодекодеров/сплиттеров.
Дополнительный вопрос: как вытащить информацию о видео-файле? Такую, как: FourCC, битрейт аудио/видео, количество кадров в секунду (fps), и т.п.
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.07.2013, 15:17   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Допустим, создаю граф и добавляю в него файл-источник:
Код:
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder);
FGraphBuilder.AddSourceFilter(StringToOleStr(FileName),'source file',fSource);
Что теперь сделать, чтобы узнать, какие сплиттеры/кодеки нужны?
BLACK_RAIN вне форума Ответить с цитированием
Старый 05.07.2013, 10:08   #3
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Я советую ваще использовать библеотеку Bass_DSHOW. Это библеотека написана на основе технологии DirectShow. Используется очень просто. Скачать тут:
http://surodev.com/downloads/BASS_DSHOW.zip -на 32 битку.
http://surodev.com/downloads/BASS_DSHOW(x64).zip - на 64 бит.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 05.07.2013, 14:11   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Я советую ваще использовать библеотеку Bass_DSHOW.
Я хочу научиться делать это без подключения каких-либо библиотек. У меня почти получается.
Вот код:
Код:
procedure tform1.ClearGraph;
begin
  if Assigned(haali) then haali := nil;
  if Assigned(ffdshow) then ffdshow := nil;
   if Assigned(FMediaControl) then FMediaControl:= NIL;
   if Assigned(pBasicAudio) then pBasicAudio := nil;
 if Assigned(FVideoWindow)  then FVideoWindow := NIL;
 if Assigned(FAudioRender)  then FAudioRender := nil;
 if Assigned(FVideoRender)  then  FVideoRender:= nil;
// if Assigned(FDirectVobSub)  then FDirectVobSub:= nil;
 if Assigned(FCaptureGraphBuilder) then FCaptureGraphBuilder   := NIL;
 if Assigned(FGraphBuilder) then FGraphBuilder:= NIL;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  res : HRESULT;
begin
CoInitialize(nil);
ClearGraph;
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder);
FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
Fn := 'd:\(2013) Disney - June 14 15 48 44.mpg';
//Fn := 'c:\1.flv';
FGraphBuilder.AddSourceFilter(StringToOleStr(Fn),'source file',fl_SrcFile);
CoCreateInstance(CLSID_haaliMediaSplitter,nil,CLSCTX_INPROC_SERVER,IID_IBaseFilter,haali);
FGraphBuilder.AddFilter(haali,'haali');
CoCreateInstance(CLSID_FfdshowVideoDecoder,nil,CLSCTX_INPROC_SERVER,IID_IBaseFilter,ffdshow);
FGraphBuilder.AddFilter(ffdshow,'ffdshow');
CoCreateInstance(CLSID_AudioRender, nil, CLSCTX_INPROC, IID_IBaseFilter, FAudioRender);
FGraphBuilder.AddFilter(FAudioRender, 'DirectSound Audio Renderer');
CoCreateInstance(CLSID_VideoMixingRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FVideoRender);
FGraphBuilder.AddFilter(FVideoRender, 'Video Renderer');
  res := FCaptureGraphBuilder.RenderStream(nil, nil, fl_SrcFile, nil ,FAudioRender);
  if res<>s_ok then
  Begin
    ShowMessage('sound error');
//    Exit;
  End;
  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video, fl_SrcFile, nil ,FVideoRender);
  if res<>s_ok then
  Begin
    ShowMessage('video error');
    Exit;
  End;

FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
FGraphBuilder.QueryInterface(IID_IBasicAudio,pBasicAudio);
pBasicAudio.put_Volume(-10000);
FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
 FVideoWindow.put_Owner(Panel1.Handle);
 FVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
 FVideoWindow.put_MessageDrain(Panel1.Handle);
 FVideoWindow.SetWindowPosition(0, 0, Panel1.ClientRect.Right,Panel1.ClientRect.Bottom);

 FMediaControl.Run;

 listFilters; //выводит в ListBox список подключенных фильтров.
end;
Файлы MPEG-2 PS/TS читаются. FFDShow подгружается. Это видно по наличию его OSD в моём окне с видео. И звук есть (если его не убавлять).
А вот про Haali Splitter не уверен. Он добавляется в граф, но нет значка в трее. И flv файлы не открываются. Хотя, по-идее, если Haali и ffdshow подключены, то должны открываться. Я не прав?
Может, я что-то не так подключаю? Если да, то что?

Последний раз редактировалось BLACK_RAIN; 05.07.2013 в 14:25.
BLACK_RAIN вне форума Ответить с цитированием
Старый 05.07.2013, 16:30   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Немного изменил код. Подключил FFDShow video decoder, FFDShow audio decoder, Haali media splitter, ac3filter.
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  res : HRESULT;
begin
CoInitialize(nil);
ClearGraph;
//??????? ?????? ??? ????? ????????
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder);
FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
//Fn := 'd:\(2013) Disney - June 14 15 48 44.mpg';
Fn := 'c:\1.flv';
FGraphBuilder.AddSourceFilter(StringToOleStr(Fn),'source file',fl_SrcFile);
CoCreateInstance(CLSID_haaliMediaSplitter,nil,CLSCTX_INPROC,IID_IBaseFilter,haali);
FGraphBuilder.AddFilter(haali,'haali');
CoCreateInstance(CLSID_FfdshowVideoDecoder,nil,CLSCTX_INPROC,IID_IBaseFilter,ffdshow);
FGraphBuilder.AddFilter(ffdshow,'ffdshow video decoder');
{CoCreateInstance(CLSID_ffdshowAudioDecoder,nil,CLSCTX_INPROC,IID_IBaseFilter,ffdshow_audio);
FGraphBuilder.AddFilter(ffdshow_audio,'ffdshow audio decoder');}
CoCreateInstance(CLSID_AC3Filter,nil,CLSCTX_INPROC,IID_IBaseFilter,ac3filter);
FGraphBuilder.AddFilter(ac3filter,'ac3filter');
CoCreateInstance(CLSID_AudioRender, nil, CLSCTX_INPROC, IID_IBaseFilter, FAudioRender);
FGraphBuilder.AddFilter(FAudioRender, 'DirectSound Audio Renderer');
CoCreateInstance(CLSID_VideoMixingRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FVideoRender);
FGraphBuilder.AddFilter(FVideoRender, 'Video Renderer');
  res := FCaptureGraphBuilder.RenderStream(nil, nil, fl_SrcFile, nil, faudiorender);
  if res<>s_ok then
  Begin
    ShowMessage('sound error');
//    Exit;  End;
  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video, fl_SrcFile, nil ,FVideoRender);
  if res<>s_ok then
  Begin
    ShowMessage('video error');
    Exit;
  End;
//  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video, ffdshow, nil ,FVideoRender);

FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
FGraphBuilder.QueryInterface(IID_IBasicAudio,pBasicAudio);
pBasicAudio.put_Volume(-1000);
FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
 FVideoWindow.put_Owner(Panel1.Handle);
 FVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
 FVideoWindow.put_MessageDrain(Panel1.Handle);
 FVideoWindow.SetWindowPosition(0, 0, Panel1.ClientRect.Right,Panel1.ClientRect.Bottom);

 FMediaControl.Run;

 listFilters;
end;
Теперь подопытный flv-файл загрузился, но при рендеринге звука выдает ошибку.
Может кто-нибудь скажет, как правильно?
BLACK_RAIN вне форума Ответить с цитированием
Старый 05.07.2013, 20:22   #6
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Немного изменил код. Подключил FFDShow video decoder, FFDShow audio decoder, Haali media splitter, ac3filter.
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  res : HRESULT;
begin
CoInitialize(nil);
ClearGraph;
//??????? ?????? ??? ????? ????????
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder);
FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
//Fn := 'd:\(2013) Disney - June 14 15 48 44.mpg';
Fn := 'c:\1.flv';
FGraphBuilder.AddSourceFilter(StringToOleStr(Fn),'source file',fl_SrcFile);
CoCreateInstance(CLSID_haaliMediaSplitter,nil,CLSCTX_INPROC,IID_IBaseFilter,haali);
FGraphBuilder.AddFilter(haali,'haali');
CoCreateInstance(CLSID_FfdshowVideoDecoder,nil,CLSCTX_INPROC,IID_IBaseFilter,ffdshow);
FGraphBuilder.AddFilter(ffdshow,'ffdshow video decoder');
{CoCreateInstance(CLSID_ffdshowAudioDecoder,nil,CLSCTX_INPROC,IID_IBaseFilter,ffdshow_audio);
FGraphBuilder.AddFilter(ffdshow_audio,'ffdshow audio decoder');}
CoCreateInstance(CLSID_AC3Filter,nil,CLSCTX_INPROC,IID_IBaseFilter,ac3filter);
FGraphBuilder.AddFilter(ac3filter,'ac3filter');
CoCreateInstance(CLSID_AudioRender, nil, CLSCTX_INPROC, IID_IBaseFilter, FAudioRender);
FGraphBuilder.AddFilter(FAudioRender, 'DirectSound Audio Renderer');
CoCreateInstance(CLSID_VideoMixingRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FVideoRender);
FGraphBuilder.AddFilter(FVideoRender, 'Video Renderer');
  res := FCaptureGraphBuilder.RenderStream(nil, nil, fl_SrcFile, nil, faudiorender);
  if res<>s_ok then
  Begin
    ShowMessage('sound error');
//    Exit;  End;
  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video, fl_SrcFile, nil ,FVideoRender);
  if res<>s_ok then
  Begin
    ShowMessage('video error');
    Exit;
  End;
//  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video, ffdshow, nil ,FVideoRender);

FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
FGraphBuilder.QueryInterface(IID_IBasicAudio,pBasicAudio);
pBasicAudio.put_Volume(-1000);
FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
 FVideoWindow.put_Owner(Panel1.Handle);
 FVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
 FVideoWindow.put_MessageDrain(Panel1.Handle);
 FVideoWindow.SetWindowPosition(0, 0, Panel1.ClientRect.Right,Panel1.ClientRect.Bottom);

 FMediaControl.Run;

 listFilters;
end;
Теперь подопытный flv-файл загрузился, но при рендеринге звука выдает ошибку.
Может кто-нибудь скажет, как правильно?
Ну тогда дай текст ошибки и напиши куда падает, а то у нас ванги нет!
P.S. Библеотека Bass_DSHOW.dll экономит в 4 раза больше времени, чем DirectShow.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 05.07.2013, 20:36   #7
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Подкоментировал код:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  res : HRESULT; //в функцую с типом HResult оформи
begin
CoInitialize(nil); //иницилизируем OLE-контейнер.
ClearGraph; //очищаем граф, и зачем? Он у тебя и так чист, при запуске программы переменая IGraphBuilder на nil

//в процедуру создания графа, только при открытие файла. После закрытия файла, граф надо чистить.
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder); //иницилизируем граф
CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder); //кажись иницилизация фильтра(интерфейса)
FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder); //устанавливаем граф
//Fn := 'd:\(2013) Disney - June 14 15 48 44.mpg'; //хахахаха
Fn := 'c:\1.flv'; //даем название файла(замение переменой FileName в процедуре).
FGraphBuilder.AddSourceFilter(StringToOleStr(Fn),'source file',fl_SrcFile); //добавляем свой фильтр в граф
CoCreateInstance(CLSID_haaliMediaSplitter,nil,CLSCTX_INPROC,IID_IBaseFilter,haali); //иницилизация звукового фильтра
FGraphBuilder.AddFilter(haali,'haali'); //добавляем ещё фильтр
CoCreateInstance(CLSID_FfdshowVideoDecoder,nil,CLSCTX_INPROC,IID_IBaseFilter,ffdshow); //иницилизиоруем ВидеоДекодер(он получит хэндл фрейма в видео).
FGraphBuilder.AddFilter(ffdshow,'ffdshow video decoder'); //добавляем его в граф
{CoCreateInstance(CLSID_ffdshowAudioDecoder,nil,CLSCTX_INPROC,IID_IBaseFilter,ffdshow_audio); //вот это ты зря коментишь, тут иницилизация Декодера звука
FGraphBuilder.AddFilter(ffdshow_audio,'ffdshow audio decoder');} //добавка его в фильтр(если ты так оставишь, то видео воспроизводится без звука)
//Совет: Иницилизируй всё сразу
CoCreateInstance(CLSID_AC3Filter,nil,CLSCTX_INPROC,IID_IBaseFilter,ac3filter); //Иницилизируем ещё какой-то фильтр, наверно, который разделяет поток
FGraphBuilder.AddFilter(ac3filter,'ac3filter'); //добавляем его в граф
CoCreateInstance(CLSID_AudioRender, nil, CLSCTX_INPROC, IID_IBaseFilter, FAudioRender); //иницилизируем и добавляем выводящий звук фильтр
FGraphBuilder.AddFilter(FAudioRender, 'DirectSound Audio Renderer');
CoCreateInstance(CLSID_VideoMixingRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FVideoRender); //тоже с видеовыводом(он изменит handle панели)
FGraphBuilder.AddFilter(FVideoRender, 'Video Renderer');
  res := FCaptureGraphBuilder.RenderStream(nil, nil, fl_SrcFile, nil, faudiorender);
  if res<>s_ok then
  Begin
    ShowMessage('sound error');
//    Exit;  End;
  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video, fl_SrcFile, nil ,FVideoRender);
  if res<>s_ok then
  Begin
    ShowMessage('video error');
    Exit;
  End;
//  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video, ffdshow, nil ,FVideoRender);

FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
FGraphBuilder.QueryInterface(IID_IBasicAudio,pBasicAudio);
pBasicAudio.put_Volume(-1000);
FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
 FVideoWindow.put_Owner(Panel1.Handle);
 FVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
 FVideoWindow.put_MessageDrain(Panel1.Handle);
 FVideoWindow.SetWindowPosition(0, 0, Panel1.ClientRect.Right,Panel1.ClientRect.Bottom); //xVideo_ChannelRemoveWindow, устанавливает окно видео

 FMediaControl.Run; //шоу начинается

 listFilters;
end;
Для вывода видео из Avi файла(и любого другого видео-файла) требуется 5 фильтров:
Фильтр для чтения файла с диска.
Фильтр для создания потока.
Фильтр для разделения потока.
Фильтр вывода звука.
Фильтр вывода фреймов(кадров) видео.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 06.07.2013, 09:54   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Подкоментировал код:
Это было излишне Я не говорил, что не понимаю, что значит каждая из строчек.
Цитата:
Сообщение от саша40 Посмотреть сообщение
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  res : HRESULT; //в функцую с типом HResult оформи
begin
ClearGraph; //очищаем граф, и зачем? Он у тебя и так чист, при запуске программы переменая IGraphBuilder на nil
//в процедуру создания графа, только при открытие файла. После закрытия файла, граф надо чистить.
Я знаю. Но для тестового проекта сойдет и так. Я очищаю граф в OnDestroy().
Цитата:
Сообщение от саша40 Посмотреть сообщение
Для вывода видео из Avi файла(и любого другого видео-файла) требуется 5 фильтров:
Фильтр для чтения файла с диска.
Фильтр для создания потока.
Фильтр для разделения потока.
Фильтр вывода звука.
Фильтр вывода фреймов(кадров) видео.
В приведенном коде, что из этого я забыл? Кстати, в данном случае я открываю не AVI, а FLV. Что нужно для FLV?
Цитата:
Сообщение от саша40
Ну тогда дай текст ошибки и напиши куда падает, а то у нас ванги нет!
А я разве не написал? Значит, забыл.
Код:
  res := FCaptureGraphBuilder.RenderStream(nil, nil, fl_SrcFile, nil, faudiorender);
  if res<>s_ok then
  Begin
    ShowMessage('sound error');
//    Exit;  
End;
В этом месте res не равно s_ok, вот и вся ошибка. Хотя, фильтр аудио добавлен в граф. Если открывать MPG, то всё s_ok.
P.S. Сделал вот так:
Код:
  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_AUDIO, fl_SrcFile, nil ,FAudioRender);
и звук пошел Ошибка пропала.
На данном этапе остался только один вопрос:
Как вытащить FourCC аудио/видео?

Последний раз редактировалось BLACK_RAIN; 06.07.2013 в 10:26.
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.07.2013, 12:59   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Нихрена не понял!
если делать вот так
Код:
  res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_AUDIO, fl_SrcFile, nil ,FAudioRender);
то FLV идет со звуком, а MPG не идет вообще.
а если так
Код:
  res := FCaptureGraphBuilder.RenderStream(nil, nil, fl_SrcFile, nil ,FAudioRender);
то MPG идет со звуком, а FLV без звука!
чё за троллинг?

переделал.
Вот так работает:
Код:
  t := LowerCase(ExtractFileExt(fn));
  if (t = '.mpg') or (t='.ts') then
  begin
    res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_stream, fl_SrcFile, nil ,FVideoRender);
    res := FCaptureGraphBuilder.RenderStream(nil, nil, fl_SrcFile, nil ,FAudioRender);
  end else
  begin
    res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_video,fl_SrcFile, nil ,FVideoRender);
    res := FCaptureGraphBuilder.RenderStream(nil, @MEDIATYPE_AUDIO, fl_SrcFile, nil ,FAudioRender);
  end;
но почему? Чем mpg и ts отличаются от остальных?
И как узнать, какой аргумент передавать в RenderStream(..., ??? ,...,...,...)? Методом тыка?

Последний раз редактировалось BLACK_RAIN; 06.07.2013 в 14:13.
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.07.2013, 15:52   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Вот одно из решений:
Код:
function FindPin(const filter: IBaseFilter; const pinDir: _PinDirection; var pinOut: IPin):Boolean;
var
  enumPins: IEnumPins;
  Direction : _PinDirection;
begin
  Result := False;
  enumPins := nil;
  filter.EnumPins(enumPins);
  while enumPins.Next(1,pinOut,0)=s_ok do
    begin
      pinOut.QueryDirection(Direction);
      if Direction=pinDir then
      begin
        Result := True;
        enumPins := nil;
        Exit;
      end;
    end;
  if Assigned(enumPins) then enumPins := nil;
end;


var
  pin : IPin;
  mediatype : TAMMediaType;

pGraphBuilder.AddSourceFilter(StringToOleStr(FileName),'source file',fSource);
  if not FindPin(fSource,PINDIR_OUTPUT,pin) then
  begin
    ClearGraph;
    Result := S_FALSE;
    Exit;
  end;
  pin.ConnectionMediaType(mediatype);
  Result := pCaptureGraphBuilder.RenderStream(nil, mediatype.pbFormat, fSource, nil ,pVideoRender);
  Result := pCaptureGraphBuilder.RenderStream(nil, MEDIATYPE.pbFormat, fSource, nil ,pAudioRender);
  MoFreeMediaType(@mediatype);
.......
Надо было просто MediaType узнать.
Проверил на нескольких файлах. Видео и звук есть.

Последний раз редактировалось BLACK_RAIN; 06.07.2013 в 16:48.
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