Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как экстрагировать фрейм из AVI

Delphi , Мультимедиа , Видео



Автор: http://www.swissdelphicenter.ch

uses
  VfW { from download };

function GrabAVIFrame(avifn: string; iFrameNumber: Integer; ToFileName:
  TFileName): Boolean;
var
  Error: Integer;
  pFile: PAVIFile;
  AVIStream: PAVIStream;
  gapgf: PGETFRAME;
  lpbi: PBITMAPINFOHEADER;
  bits: PChar;
  hBmp: HBITMAP;
  AviInfo: TAVIFILEINFOW;
  sError: string;
  TmpBmp: TBitmap;
  DC_Handle: HDC;
begin
  Result := False;
  // Initialize the AVIFile library.
  AVIFileInit;

  // The AVIFileOpen function opens an AVI file
  Error := AVIFileOpen(pFile, PChar(avifn), 0, nil);
  if Error <> 0 then
  begin
    AVIFileExit;
    case Error of
      AVIERR_BADFORMAT: sError := 'The file couldnot be read';
      AVIERR_MEMORY: sError :=
        'The file could not be opened because of insufficient memory.';
      AVIERR_FILEREAD: sError :=
        'A disk error occurred while reading the file.';
      AVIERR_FILEOPEN: sError :=
        'A disk error occurred while opening the file.';
    end;
    ShowMessage(sError);
    Exit;
  end;

  // AVIFileInfo obtains information about an AVI file
  if AVIFileInfo(pFile, @AVIINFO, SizeOf(AVIINFO)) <> AVIERR_OK then
  begin
    // Clean up and exit
    AVIFileRelease(pFile);
    AVIFileExit;
    Exit;
  end;

  // Show some information about the AVI
  Form1.Memo1.Lines.Add('AVI Width : ' + IntToStr(AVIINFO.dwWidth));
  Form1.Memo1.Lines.Add('AVI Height : ' + IntToStr(AVIINFO.dwHeight));
  Form1.Memo1.Lines.Add('AVI Length : ' + IntToStr(AVIINFO.dwLength));

  // Open a Stream from the file
  Error := AVIFileGetStream(pFile, AVIStream, streamtypeVIDEO, 0);
  if Error <> AVIERR_OK then
  begin
    // Clean up and exit
    AVIFileRelease(pFile);
    AVIFileExit;
    Exit;
  end;

  // Prepares to decompress video frames
  gapgf := AVIStreamGetFrameOpen(AVIStream, nil);
  if gapgf = nil then
  begin
    AVIStreamRelease(AVIStream);
    AVIFileRelease(pFile);
    AVIFileExit;
    Exit;
  end;

  // Read current Frame
  // AVIStreamGetFrame Returns the address of a decompressed video frame
  lpbi := AVIStreamGetFrame(gapgf, iFrameNumber);
  if lpbi = nil then
  begin
    AVIStreamGetFrameClose(gapgf);
    AVIStreamRelease(AVIStream);
    AVIFileRelease(pFile);
    AVIFileExit;
    Exit;
  end;

  // Show number of frames:
  Form1.Memo1.Lines.Add(Format('Framstart: %d FrameEnd: %d',
    [AVIStreamStart(AVIStream), AVIStreamEnd(AVIStream)]));

  TmpBmp := TBitmap.Create;
  try
    TmpBmp.Height := lpbi.biHeight;
    TmpBmp.Width := lpbi.biWidth;
    bits := Pointer(Integer(lpbi) + SizeOf(TBITMAPINFOHEADER));

    DC_Handle := CreateDC('Display', nil, nil, nil);
    try
      hBmp := CreateDIBitmap(DC_Handle, // handle of device context
        lpbi^, // address of bitmap size and format data
        CBM_INIT, // initialization flag
        bits, // address of initialization data
        PBITMAPINFO(lpbi)^, // address of bitmap color-format data
        DIB_RGB_COLORS); // color-data usage
    finally
      DeleteDC(DC_Handle);
    end;

    TmpBmp.Handle := hBmp;
    AVIStreamGetFrameClose(gapgf);
    AVIStreamRelease(AVIStream);
    AVIFileRelease(pfile);
    AVIFileExit;
    try
      TmpBmp.SaveToFile(ToFileName);
      Result := True;
    except
    end;
  finally
    TmpBmp.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Extract Frame 3 from AVI file
  GrabAVIFrame('C:\Test.avi', 3, 'c:\avifram.bmp');
end;

Программа на Delphi для извлечения конкретной рамки из файла AVI с использованием библиотеки VfW (Video for Windows). Вот подробное описание, что код делает:

Главная процедура: GrabAVIFrame

  • Принимает три параметра:
    • avifn: имя файла AVI для чтения.
    • iFrameNumber: номер рамки для извлечения (индекс с 1).
    • ToFileName: имя файла bitmap для сохранения извлеченной рамки.
  • Инициализирует библиотеку VfW с помощью AVIFileInit.
  • Открывает файл AVI с помощью AVIFileOpen и проверяет ошибки.
  • Получает информацию о файле AVI с помощью AVIFileInfo и отображает некоторые основные данные в контроле Memo (Form1.Memo1).
  • Открывает поток из файла с помощью AVIFileGetStream и проверяет ошибки.
  • Подготавливается к декомпрессии видеорамок с помощью AVIStreamGetFrameOpen и проверяет ошибки.
  • Читает указанную рамку номера с помощью AVIStreamGetFrame и проверяет ошибки.
  • Создает временный bitmap (TmpBmp) для хранения данных извлеченной рамки.
    • Устанавливает высоту и ширину битмапы в соответствии с размерами рамки.
    • Распределяет память для данных рамки с помощью Pointer(Integer(lpbi) + SizeOf(TBITMAPINFOHEADER)).
    • Создает контекст устройства (DC_Handle) для отображения битмапы.
    • Создает DIBitmap (hBmp) из данных рамки с помощью CreateDIBitmap.
    • Присваивает handle битмапы временной битмапе (TmpBmp.Handle).
  • Сохраняет извлеченную рамку в файл bitmap с помощью TmpBmp.SaveToFile. Если возникает ошибка при сохранении, она будет поймана и проигнорирована.
  • Наконец, освобождает любые ресурсы, зарезервированные библиотекой VfW, и выходит.

Событийная процедура: Button1Click

  • Это обработчик события вызывает GrabAVIFrame, чтобы извлечь рамку номер 3 из файла AVI 'C:\Test.avi' и сохранить ее в файле bitmap, названном 'c:\avifram.bmp'.

Обратите внимание:

  • Библиотека VfW довольно старая, поэтому вам может потребоваться адаптация кода для работы с более новыми версиями Delphi или другими языками программирования.
  • Код предполагает, что файл AVI имеет только один видеопоток. Если ваш файл AVI имеет несколько потоков, вам нужно будет модифицировать код соответствующим образом.
  • Обработка ошибок относительно проста в этом примере; вы можете добавить более robust обработку ошибок в зависимости от своих конкретных требований.

В целом, этот код должен быть able извлечь конкретную рамку из файла AVI и сохранить ее в файле bitmap.

В статье описывается процесс экстрагирования фрейма из файла AVI с помощью библиотеки VfW и языка программирования Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Видео ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 17:24:47/0.0034358501434326/0