Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.12.2011, 20:40
flaunder flaunder вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 7
Репутация: 10
Печаль Конвертор AVI 2 MOV на Delphi и DirectShow

При соединение фильтра, у которого много выходов с фильтром, у которого один вход прога ругается. Я в панике).
ругается здесь:


красным выделил сообщение, которое вылетает
Код:
вот процедура:

function GetPin(pFilter: IBaseFilter; pinDir: PIN_DIRECTION): IPin;
var
  bFound: Boolean;
  pEnum : IEnumPins;
  pPin  : IPin;
  PinDirThis: PIN_DIRECTION;

begin
  Result := nil;
  bFound := false;
  pFilter.EnumPins(pEnum);
  while (pEnum.Next(1, pPin, nil) = S_OK) do
  begin
    pPin.QueryDirection(PinDirThis);
    if (pinDir = PinDirThis) then
    begin
      bFound := true;
      break;
    end;
  end;
  pEnum.Reset;
  if bFound then Result := pPin;
end;
Админ: Пользуемся тегами для оформления кода!

Видимо надо здесь как то узнавать какой пин брать... плииз хеелп, а то бадааа буум))

Последний раз редактировалось Admin, 05.12.2011 в 21:04.
Ответить с цитированием
  #2  
Старый 06.12.2011, 12:25
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Нет красного цвета. Где вылетает?
Ответить с цитированием
  #3  
Старый 07.12.2011, 08:13
flaunder flaunder вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 7
Репутация: 10
По умолчанию

спасибо администратору, который удалил весь второй листинг))
Код:
// берем пины
  pAVIspliterOutV := GetPin(pAVIspliter, PINDIR_OUTPUT);
  if not Assigned(pAVIspliterOutV) then begin
    ShowMessage('Не удается получить pAVIspliterOutV');
    exit;
  end;

  pVideodecoderIn := GetPin(pVideodecoder, PINDIR_INPUT);
  if not Assigned(pVideodecoderIn) then begin
    ShowMessage('Не удается получить pVideodecoderIn');
    exit;
  end;

  pAudiodecoderIn := GetPin(pAudiodecoder, PINDIR_INPUT);
  if not Assigned(pAudiodecoderIn) then begin
    ShowMessage('Не удается получить pAudiodecoderIn');
    exit;
  end;

  // соединяем
  hr := pGraphBuilder.Connect(pAVIspliterOutV, pVideodecoderIn);
  if FAILED(hr) then begin
    ShowMessage('Не удается соединить фильтры pAVIspliterOutV и pVideodecoderIn');
    exit;
  end;
  hr := pGraphBuilder.Connect(pAVIspliterOutV, pAudiodecoderIn);
  if FAILED(hr) then begin
    ShowMessage('Не удается соединить фильтры pAVIspliterOutV и pAudiodecoderIn');
    exit;
  end;
вот здесь должно быть выделено)
Ответить с цитированием
  #4  
Старый 07.12.2011, 15:58
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

У вас два последних Connect не могут сработать одновременно, т.к. вы дважды задействовали пин pAVIspliterOutV. Попробуйте поменять местами, может, он соединится с pAudiodecoderIn. При нумерации и поиске пинов вы проверяете только направление (in/out), а надо ещё и тип среды (видео-, аудио-поток).
Ответить с цитированием
  #5  
Старый 07.12.2011, 16:02
flaunder flaunder вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 7
Репутация: 10
По умолчанию

А каким образом проверить видео поток это или нет?)
Ответить с цитированием
  #6  
Старый 08.12.2011, 10:55
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Когда вы находите IPin, то у него есть метод EnumMediaTypes. Это интерфейс IEnumMediaTypes, который через метод Next перечислит вам все возможные среды: массив структур AM_MEDIA_TYPE. Вот в этой структуре член majortype (GUID) будет равен или MEDIATYPE_Audio, или MEDIATYPE_Video, хотя есть и другие варианты. Извините, читаю справку (а там для Си), так что без примеров на Delphi.
Ответить с цитированием
  #7  
Старый 08.12.2011, 13:47
flaunder flaunder вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 7
Репутация: 10
По умолчанию

тогда получается мне находить этот majortype через свойства пина с помощью pPin.QueryPinInfo()? типо так?
Ответить с цитированием
  #8  
Старый 08.12.2011, 14:03
flaunder flaunder вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 7
Репутация: 10
По умолчанию

и ведь получилось таки)))) только не через тип майора)) а через название пина, оно тоже уникальное))) пришлось по подставлять, зато работает)) огромное спасибо.
Ответить с цитированием
  #9  
Старый 08.12.2011, 14:38
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от flaunder
тогда получается мне находить этот majortype через свойства пина с помощью pPin.QueryPinInfo()? типо так?
Нет, я же сказал, что это метод:
pPin.EnumMediaTypes()
Ответить с цитированием
  #10  
Старый 08.12.2011, 14:39
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от flaunder
и ведь получилось таки)))) только не через тип майора)) а через название пина, оно тоже уникальное))) пришлось по подставлять, зато работает)) огромное спасибо.
По названию я вам тоже хотел предложить, но тут есть особенность, что в некоторых системах названия русские. Желательно предварительно посмотреть в программе GraphEdit.
Ответить с цитированием
  #11  
Старый 08.12.2011, 14:41
flaunder flaunder вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 7
Репутация: 10
По умолчанию

ну я программу пишу, можно сказать, из графа) поэтому все должно быть чики-чики))
Ответить с цитированием
  #12  
Старый 08.12.2011, 20:02
flaunder flaunder вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 7
Репутация: 10
По умолчанию

появился еще один вопрос, мне для того, что бы сохранить в mov формате файл, надо видео и аудио поток соеденить при помощи фильтра MOV muxer. Но изначально у него только один вход, в граф едите) при соединение одного пина, сразу создается второй, а в делфи - нет. Как мне принудительно сделать еще один пин?
Ответить с цитированием
  #13  
Старый 09.12.2011, 10:05
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Нашёл пример, в котором сначала соединяют MUX с видеовходом, а затем ICaptureGraphBuilder2.RenderStream() подсоединит и аудиовход.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter