DirectX Графика в проектах Delphi




Модуль VFW



Существует много способов работы с видео. Предназначенные для этого компоненты Delphi не очень помогут в решении задачи воспроизведения подобных файлов на поверхностях, поэтому нам придется воспользоваться нестандартными методами.
Прежде всего мы познакомимся с модулем vfw.pas, не входящим в набор стандартных модулей Delphi, но работающим со стандартной системной библиотекой avifil32.dll.
Вместе с Delphi поставляется набор справочных файлов системного программиста, корпорации Microsoft. С их помощью вы сможете разобраться во всех тонкостях использования этого модуля. Я же приведу конкретные решения с краткими пояснениями. Для большей части читателей этого объема должно вполне хватать.
В проекте каталога ExOl на знакомом нам фоне воспроизводится AVl-файл, взятый мною из набора файлов, поставляемых в составе DirectX SDK (рис. 6.1).

Рис. 6.1. Простой пример воспроизведения видео на поверхности

В списке подключаемых модулей добавлен модуль VFW, а в установках проекта - путь к файлу ole2.dcu, в котором нуждается подключаемый модуль.
Следующие переменные связаны со спецификой примера:

var
TmpBmp : TBitmap; // Вспомогательное изображение
AviStream : PAVISTREAM; // AVI-поток
Frame : PGetFrame; // кадр видео
pbmi : PBITMAPINFOHEADER; // Указатель на заголовок растра
bits : Pointer; // Указатель на картинку растра
CurrFrame DWORD - 0; // Счетчик кадров
AVIClock DWORD; // Эмулятор таймера
AVIDelay DWORD; // Величина паузы между кадрами
AVIWidth DWORD; // Характеристики кадра
AVIHeight DWORD;
AVILength DWORD; // Количество кадров в AVI

Перед инициализацией DirectDraw нам необходимо узнать характеристики отображаемого видео, для этого используем функции рассматриваемого модуля, связанные с работой AVI как с файлом:

var
AVIFile : PAVIFile; // Обрабатываем AVI как файл
AVIlnfo : TAVIFilelnfo; // Заголовок файла, характеристики AVI
begin
TmpBmp := TBitmap.Create; // Создаем вспомогательный растр
AVIFileOpen(AVIFile, AVIName, OF_READ, nil); // Открытие AVI
// Считываем заголовочную информацию, заполняются поля AVIlnfo
AVIFilelnfo(AVIFile, AVIlnfo, SizeOf (AVIlnfo));
AVIWidth := AVIInfo.dwWidth; // Запоминаем размеры кадра
AVIHeight := AVIlnfo.dwHeight;
AVILength := AVIlnfo.dwLength; // Количество кадров
// Вычисляем паузу между очередными кадрами
AVIDelay := 1000 div (AVIInfo.dwRate div AVIInfo.dwScale);
AVIFileRelease(AVIFile); // Освобождаем AVI




Содержание  Назад  Вперед