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

Запись в видеофайл



.Познакомившись с различными способами воспроизведения видеоданных, мы научимся создавать AVI-файлы. Пройдет этот процесс для вас очень легко, поскольку воспользуемся мы готовым модулем AviMaker. Он содержит описание класса TAviMaker, выполняющего за нас всю изнурительную работу. Нам остается только подготовить набор растров, составляющих последовательность кадров создаваемого фильма, и вызвать метод записи.
Вот скромный набор свойств и методов класса, необходимых нам для работы:

Bitmaps TList; // Список объектов класса Bitmap, кадры AVI
Height Integer; // Размеры кадров AVI
Width Integer;
FrameTime Integer; // Величина паузы между кадрами
Stretch BOOL; // Признак, надо ли масштабировать кадры
FileName String; // Имя файла результата
PixelFormat : TPixelFormat; // Разрядность AVI
constructor Create;
destructor Destroy; override;
procedure Write; // Запись AVI

Здесь используется модуль VFW, поэтому в опциях проекта указывается путь к файлу ole2.dcu. В проекте каталога Ех03 формируются кадры, на которых вращается спираль (рис. 6.3).

Рис. 6.3. Один из кадров нашего фильма Создается

Для записи фильма используется объект AviMakeri класса TAviMaker:

AviMakerI := TAviMaker.Create;
with AviMakeri do begin
Width := 256;
Height := 256;
Stretch := True; // Кадры будут масштабироваться
PixelFormat := pf24bit; // 24-битный формат кадра
FrameTime := 100;
FileName := 'test.avi';
end;

фильм из 20-ти кадров, продолжительностью 2 секунды:

function TfrmDD.UpdateFrame : HRESULT;
const
step = 2 * Pi / 400;
var
i : Integer;
hRet : HRESULT;
Вitmap : ТВ i tmap; DC : HOC;
begin
ThisTickCount := GetTickCount;
// В этом примере паузы можно было бы и не делать
if ThisTickCount - LastTickCount > 30 then begin
Angle := Angle + 0.25;
if Angle > 2 * Pi then Angle := Angle - 2 * Pi;
LastTickCount := GetTickCount;
// Берем 20 кадров
Inc (FrameCount);
if FrameCount > 20 then begin
FActive := False;
Result := DD_OK;
AviMakerl.Write; // Записываем AVI
Close;
Exit;
end;
// Выводим фон
hRet := FDDSBack. BltFast (0, 0, E'DDSBackGround,
nil, DDBLTFAST_WAIT);
if hRet = DDERR_SURFACELOST then begin
Result := hRet;
if Failed (RestoreAll) then Exit;
end;
// Выводим точки спирали for i := 0 to 800 do
if FDDSBack.BltFast (310 + trunc (cos(Angle -f i * step) * i / 4) ,
230 + trunc (sin(Angle + i * step) *i / 4),
FDDSImage, nil,
DDBLTFAST_WAIT) = DDERR_SURFACELOST then begin
hRet := RestoreAll;
if Failed (hRet) then begin
Result := hRet; Expend;
end;
// Формируем кадр ролика
Bitmap := TBitmap.Create;
with Bitmap do begin Width := ScreenWidth;
Height := ScreenHeight;
PixelFormat := pf24bit; // Важно, иначе устанавливается 8 бит
FDDSBack.GetDC (DC);
BitBlt(Canvas.Handle, 0, 0, // Копируем экран в растр
ScreenWidth, ScreenHeight, DC, 0, 0, SRCCOPY);
FDDSBack.ReleaseDC (DC) ;
AviMakerl.Bitmaps.Add (Bitmap); // Добавляем кадр в фильм
end;
end;
Result := DD_OK;
end;

Кадры масштабируются при записи фильма, в качестве упражнения исправьте код так, чтобы их изменение происходило при формировании списка.



Содержание раздела