|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Конвертор 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
|
|||
|
|||
Нет красного цвета. Где вылетает?
|
#3
|
|||
|
|||
спасибо администратору, который удалил весь второй листинг))
Код:
// берем пины 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
|
|||
|
|||
У вас два последних Connect не могут сработать одновременно, т.к. вы дважды задействовали пин pAVIspliterOutV. Попробуйте поменять местами, может, он соединится с pAudiodecoderIn. При нумерации и поиске пинов вы проверяете только направление (in/out), а надо ещё и тип среды (видео-, аудио-поток).
|
#5
|
|||
|
|||
А каким образом проверить видео поток это или нет?)
|
#6
|
|||
|
|||
Когда вы находите IPin, то у него есть метод EnumMediaTypes. Это интерфейс IEnumMediaTypes, который через метод Next перечислит вам все возможные среды: массив структур AM_MEDIA_TYPE. Вот в этой структуре член majortype (GUID) будет равен или MEDIATYPE_Audio, или MEDIATYPE_Video, хотя есть и другие варианты. Извините, читаю справку (а там для Си), так что без примеров на Delphi.
|
#7
|
|||
|
|||
тогда получается мне находить этот majortype через свойства пина с помощью pPin.QueryPinInfo()? типо так?
|
#8
|
|||
|
|||
и ведь получилось таки)))) только не через тип майора)) а через название пина, оно тоже уникальное))) пришлось по подставлять, зато работает)) огромное спасибо.
|
#9
|
|||
|
|||
Цитата:
pPin.EnumMediaTypes() |
#10
|
|||
|
|||
Цитата:
|
#11
|
|||
|
|||
ну я программу пишу, можно сказать, из графа) поэтому все должно быть чики-чики))
|
#12
|
|||
|
|||
появился еще один вопрос, мне для того, что бы сохранить в mov формате файл, надо видео и аудио поток соеденить при помощи фильтра MOV muxer. Но изначально у него только один вход, в граф едите) при соединение одного пина, сразу создается второй, а в делфи - нет. Как мне принудительно сделать еще один пин?
|