Фильтры делятся на три типа:
Фильтры-источники (Sourcefilters) - эти фильтры просто получают данные из какого-то источника, с диска (как фильтр File Source (Async) на рисунке), с CD или DVD дисковода или с TV – карты или карты, к которой подключена цифровая видеокамера.
Фильтры-преобразователи (Transform filters) – эти фильтры как видно из названия преобразуют поток данных, проходящий через них каким-либо образом, например – разделяет поток данных на кадры, производят декомпрессию и т.п. На нашем рисунке к таким фильтрам относятся AVI Splitter и AVI Decompressor.
Фильтры вывода (Renderer filters) – фильтры, которые получают полностью обработанные данные и выводят их на монитор, звуковую карту, пишут на диск или выводят на еще какое-нибудь устройство.
Итак из фильтров-кубиков можно выстраивать граф. Делается это с помощью интерфейса IGraphBuilder. Создать объект типа IGraphBuilder можно так:
CoCreateInstance(CLSID_FilterGraph,nil,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,MyGraphBuilder);
Здесь переменная MyGraphBuilderимеет тип IGraphBuilder; идентификатор класса CLSID_FilterGraphи IID_IGraphBuilderобьявлены в файле DShow.pas, поэтому не забудьте добавить:
uses DShow.pas
Итак, интерфейс IGraphBuilder получен. Можно построить граф фильтров, такой, какой нам нужно. Впрочем, все не так сложно, IGraphBuilder достаточно интеллектуален, он может сам, автоматически, построить граф, в зависимости от
того какие файлы мы собираемся воспроизводить. Интерфейс IGraphBuilder имеет метод RenderFile, который получает имя файла в качестве параметра и, в зависимости от типа файла (которое определяется по расширению и по
специальным сигнатурам в файле), сканирует реестр, в поисках необходимой для построения графа информации, создает необходимые фильтры и строит
9
граф, предназначенный для воспроизведения файлов этого типа (WAV, AVI, MP2, MPG и т.д.).
2.2 Описание программ комплекса
После построения графа, DirectShow готов к воспроизведению. Для управления потоком данных через граф обработки предназначен интерфейс IMediaControl – он имеет методы Run, Pause и Stop.
Пример:
uses
... DShow, ActiveX,ComObj;
var
MyGraphBuilder : IGraphBuilder;
MyMediaControl : IMediaControl;
begin
CoInitialize(nil);
{получаеминтерфейс IGraphBuilder}
CoCreateInstance(CLSID_FilterGraph,nil,CLSCTX_INPROC_SERVER,IID_I GraphBuilder,MyGraphBuilder);
{вызываем RenderFile - граф фильтров строится автоматически}
MyGraphBuilder.RenderFile(cool.avi',nil);
{получаеминтерфейс ImediaControl}
MyGraphBuilder.QueryInterface(IID_IMediaControl,MyMediaControl);
{Примечание - MyMediaControl - переменнаятипа IMediaControl}
{проигрываем видео}
MyMediaControl.Run;
{ждем пока пользователь не нажмет ОК (видео воспроизводится в отдельном (thread) потоке)}
ShowMessage('Нажмите OК');
CoUninitialize;
end;
Интерфейс IVideoWindow содержит методы для управления заголовком, стилем, местоположением и размерами окошка в котором проигрывается видео.
Давайте попробуем переделать наш пример так, чтобы видео выводилось не в отдельном окошке, а, скажем на компоненте TPanel, расположенном в нашей форме. Добавьте на форму компонент TPanel, пусть он называется Panel1.
10
uses
... DShow, ActiveX,ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
MyGraphBuilder : IGraphBuilder;
MyMediaControl : IMediaControl;
VideoWindow : IVideoWindow;
begin
CoInitialize(nil);
{получаем интерфейс IGraphBuilder}
CoCreateInstance(CLSID_FilterGraph,nil,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,MyGraphBuilder);
{вызываем RenderFile - граф фильтров строится автоматически}
MyGraphBuilder.RenderFile('C:\Program Files\Borland\Pascal\Demos\Coolstuf\cool.avi',nil);
{получаем интерфейс ImediaControl}
MyGraphBuilder.QueryInterface(IID_IMediaControl,MyMediaControl);
{Примечание - MyMediaControl - переменнаятипа IMediaControl}
{получаем интерфейс IVideoWindow}
MyGraphBuilder.QueryInterface(IID_IVideoWindow,VideoWindow);
{Примечание - VideoWindow - переменнаятипа IVideoWindow}
{располагаем окошко с видео на панель}
VideoWindow.Set_Owner(Self.Panel1.Handle);
VideoWindow.Set_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);
VideoWindow.SetWindowPosition(0,0,Panel1.ClientRect.Right,Panel1.ClientRect.Bottom);
{проигрываем видео}
MyMediaControl.Run;
ShowMessage('Нажмите OК');
CoUninitialize;
end;
Программа Speaker1 предназначена для генерации последовательности прямоугольных звуковых импульсов:
Двоичное представление шестнадцатеричного значения #FC имеет вид 11111100. Вначале определяются значение, находящееся в порте динамика, и два младших бита обнуляются (благодаря использованию операции and и маски $FC). В цикле динамик включается (в бит b1 записывается единица), затем, после
небольшой задержки, отключается и так повторяется до нажатия произвольной
11
клавиши. После нажатия клавиши выполнение цикла прекращается. Важно то, что оба младших бита будут содержать нулевые значения, и при всех последующих обращениях к динамику других программ он будет работать правильно. Программа генерирует тон частотой примерно 100Гц.
2.3 Макро блок - схема комплекса
Существует много способов описания, представления алгоритмов. Мы остановимся на четырех: естественном языке, графическом языке, алгоритмическом языке и языке программирования.
Каждый вид представления имеет средства описания алгоритмов, ориентированные на своего исполнителя:
- естественный язык - слова на естественном языке общения;
- графический язык - графические схемы (блок-схемы) с описанием действий;
-алгоритмический язык - определенные слова естественного языка, которым придается значение действия или команды для исполнителя;
-язык программирования - команды языка программирования.
Во всех предложенных способах представления алгоритма, кроме последнего исполнителем является человек, а в последнем четвертом случае исполнитель-компьютер.
Алгоритмический язык - это система обозначений и правил для единообразной и точной записи алгоритмов и их исполнения.
Алгоритмический язык, с одной стороны, близок к обычному языку, поэтому читается и записывается как обыкновенный текст. С другой стороны, по своей форме алгоритмический язык приближается к языкам программирования, что дает возможность быстрее освоить языки программирования для ЭВМ.
Алгоритмический язык имеет свой словарь. Основу его составляют слова, представляющие команды этого языка. В алгоритмическом языке также используются слова, смысл и способ употребления которых не изменяется. Они называются служебными словами.
Служебные слова алгоритмического языка подчеркиваются и записываются, как правило, в сокращенной форме и предназначены для оформления алгоритма.
Синтаксические конструкции языка подразделяются на два типа: описания данных (величин) и операторов (команд).
Представление алгоритмов в виде блок-схем. Наиболее наглядным способом представления алгоритма является его графическое представление в виде блок-схем.
Блок-схема - это графическое представление алгоритма, каждое действие алгоритма записывается соответствующей геометрической фигурой.
12
Условное обозначение | Пояснение |
Начало алгоритма;Конец алгоритма;Процесс или группа действий;Выбор действия в зависимости от истинности или ложности;Повторение действии заданное количество разВвод (вывод) значений переменных;Направление вычисления. |
2.4 Таблица идентификаторов комплекса