Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Склеивание avi-файлов


Автор: GAZot 17.5.2009, 21:14
Здравствуйте Уважаемые эксперты! Обращаюсь уже в 3 форум  smile в надежде получить ответ на свой вопрос желательно с примером,а не на пальцах.Мне нужно в своём проекте склеивать один или более avi-файлов в один.Я так думаю тут надо использовать модули VFW или DirectShow,но опять же повторяю нужен пример. smile 

Автор: Keeper89 17.5.2009, 21:45
Посмотрите для начала компоненты http://www.torry.net/pages.php?id=168, там есть и примеры работы с AVI.

Добавлено @ 21:50
Плюс посмотрите вот http://articles.org.ru/cfaq/index.php?qid=2980статью по работе с AVI.

Автор: GAZot 18.5.2009, 19:10
Keeper89 
Это всё не то.Мне не нужны сторонние компоненты,тем более платные.Я же написал что нужно использовать модули VFW или DirectShow.

Автор: Alexeis 19.5.2009, 09:28
Вот тут был пример http://forum.vingrad.ru/forum/topic-194120/kw-avi-bmp-%D0%B5%D0%BC%D0%B0/hl/avi/index.html

Автор: GAZot 19.5.2009, 18:50
Alexeis 
Спасибо,но тут bmp+bmp=avi,а мне нужно avi+avi=avi.Может для Вас это примерно одно и тоже,но я не понимаю как мне этот пример сможет помочь.Может набросаете что нибудь с пояснениями,особенно меня интересует как заново создавать заголовок файла(т.е инфо об файле.

Автор: Alexeis 19.5.2009, 19:56
Цитата(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 или же открыть первый и добавить в него кадры из второго (не уверен получиться ли).

Так работает алгоритм если требуется пересжатие, если форматы одинаковы, то нужно делать как-то по другому.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)