Цитата(GAZot @ 19.5.2009, 17:50 ) | | Спасибо,но тут bmp+bmp=avi,а мне нужно avi+avi=avi.Может для Вас это примерно одно и тоже,но я не понимаю как мне этот пример сможет помочь. |
Рассмотрим код
| Код | procedure TForm1.Button1Click(Sender: TObject); var Ops : TAVIFileOptions; Cmpr : TAVICompressor; bmp : TBitMap; i : Integer; fh : TMemoryStream; begin bmp := TBitMap.Create; bmp.LoadFromFile('H:\temp\Frame0001.bmp'); //первый кадр Ops.Init; Ops.Width := bmp.Width; Ops.Height := bmp.Height; Ops.FrameRate := 25; //число кадров в сек Ops.ShowDialog:= false; Ops.KeyFrameEvery := Ops.FrameRate; Ops.BytesPerSecond:= 400 * 1024; //400 кб/с битрейт Cmpr := TAVICompressor.Create; Cmpr.Open('H:\temp\1.avi', Ops); fh := TMemoryStream.Create; for I := 1 to 627 do Begin fh.LoadFromFile(Format('%s%.4d%s', ['H:\temp\Frame', i, '.bmp'])); // bmp.LoadFromFile(Format('%s%.4d%s', ['H:\temp\Frame', i, '.bmp'])); Cmpr.WriteFrame(PBitmapInfo(Pointer(Integer(fh.Memory) + sizeof(BitmapFileHeader)))); //читаем битмап напрямую, так быстрее memo1.Lines.Add(Format('%s%.4d%s', ['H:\temp\Frame', i, '.bmp'])); Application.ProcessMessages; End; fh.Free; Cmpr.Close; Cmpr.Free; bmp.Free; end;
|
Класс Ops : TAVIFileOptions; - определяет заголовок AVI. Класс Cmpr : TAVICompressor; - работает с кадрами и сжимает их Класс TAVICompressor принимает в качестве кадров битмапы с заголовками Infoheader Cmpr.WriteFrame() - запишет очередной кадр в поток. Получается что нужно создать новый AVI и добавить в него кадры из обоих AVI или же открыть первый и добавить в него кадры из второго (не уверен получиться ли).
Так работает алгоритм если требуется пересжатие, если форматы одинаковы, то нужно делать как-то по другому. |