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

Получение информации о AVI файле 2

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

Получение информации о AVI файле 2

Автор: Alex Kantchev
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение информации о AVI файле (новая версия)

Unit содерйущии (пока) единственая функция для получение информации о AVI файле.
function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo;
Описание: Получение информации о AVI файле.
Параметры: FileName: String;
ErrCode: Код возвращаемый от функции; (in/out)
Возвращаемая стоемость: TAVIFileInfo - структура для сохранение всей информации об фаилом.
Кометарии:
Новая версия. Базируется на процедуре:
intermediate procedure ReadAviInfo
автором на которой является [NIKEL]

Зависимости: SysUtils
Автор:       Alex Kantchev, stoma@bitex.bg
Copyright:   Оригинал: [NIKEL] Модификация: Alex Kantchev
Дата:        28 апреля 2003 г.
***************************************************** }

unit AviInformation;

interface

uses
  SysUtils;
type
  //
  // structure containing avi file info
  //
  TAVIFileInfo = packed record
    AVIFileName: string;
    FileSize: double;
    ClipLength: double;
    VideoCodec: string[32];
    ClipBitrate: double;
    ClipWidth: Integer;
    ClipHeight: Integer;
    ClipFPS: double;
    AudioCodec: string[32];
    AudioBitRate: Integer;
    AudioSampleRate: Integer;
    AudioChannelCnt: Byte;
  end;
function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo;

implementation
//
// Function for reading avi file
//

function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo;
var
  // хэндл файла
  iFileHandle: Integer;
  // Для позционирования в AVI файле
  Aviheadersize: integer;
  Vheadersize: integer;
  Aviheaderstart: integer;
  Vheaderstart: integer;
  Aheaderstart: integer;
  Astrhsize: integer;
  // Временные переменные
  TempFExt: string[5];
  TempSize: Integer;
  TempVcodec: string[5];
  TempAcodec: integer;
  TempMicrosec: integer;
  TempLengthInFrames: integer;
  TempAchannels: integer;
  TempAsamplerate: integer;
  TempAbitrate: integer;
  //Выходные данные
  Size: double;
  Length: double;
  Vcodec: string;
  Vbitrate: double;
  VWidth: integer;
  VHeight: integer;
  Fps: double;

  LengthInSec: double;
  Acodec: string;
  Abitrate: Integer;
  RetVal: TAVIFileInfo;
begin
  ErrCode := 0;
  TempAcodec := 0;
  TempAbitrate := 0;
  TempAsamplerate := 0;
  TempAchannels := 0;
  if not FileExists(FileName) then
  begin
    ErrCode := 1;
    exit;
  end;
  // Открываем
  iFileHandle := FileOpen(FileName, fmOpenRead);
  // Грубая проверка на подлинность файла
  FileSeek(iFileHandle, 7, 0);
  FileRead(iFileHandle, TempFExt, 5);
  if copy(TempFExt, 0, 4) <> 'AVI ' then
  begin
    ErrCode := 2;
    exit;
  end;
  // Размер файла
  FileSeek(iFileHandle, 4, 0);
  FileRead(iFileHandle, TempSize, 4);
  // Размер хедера (needed to locate the audio part)
  FileSeek(iFileHandle, 28, 0);
  FileRead(iFileHandle, Aviheadersize, 4);
  // старт хедера (needed to locate the video part)
  Aviheaderstart := 32;
  // Милисекунды (1000000 / TempMicrosec = fps)
  FileSeek(iFileHandle, Aviheaderstart, 0);
  FileRead(iFileHandle, TempMicrosec, 4);
  // Размер во фреймах
  FileSeek(iFileHandle, Aviheaderstart + 16, 0);
  FileRead(iFileHandle, TempLengthInFrames, 4);
  // Ширина
  FileSeek(iFileHandle, Aviheaderstart + 32, 0);
  FileRead(iFileHandle, VWidth, 4);
  // Высота
  FileSeek(iFileHandle, Aviheaderstart + 36, 0);
  FileRead(iFileHandle, VHeight, 4);
  //calculate header size
  FileSeek(iFileHandle, Aviheaderstart + Aviheadersize + 4, 0);
  FileRead(iFileHandle, Vheadersize, 4);
  Vheaderstart := Aviheaderstart + Aviheadersize + 20;
  // Video Codec
  FileSeek(iFileHandle, Vheaderstart + 3, 0);
  FileRead(iFileHandle, TempVCodec, 5);
  Aheaderstart := Vheaderstart + Vheadersize + 8;
  FileSeek(iFileHandle, Aheaderstart - 4, 0);
  FileRead(iFileHandle, Astrhsize, 5);
  // Audio codec
  FileSeek(iFileHandle, Aheaderstart + Astrhsize + 8, 0);
  FileRead(iFileHandle, TempACodec, 2);
  // Audio каналы (1 = mono, 2 = stereo)
  FileSeek(iFileHandle, Aheaderstart + Astrhsize + 10, 0);
  FileRead(iFileHandle, TempAchannels, 2);
  // Audio samplerate
  FileSeek(iFileHandle, Aheaderstart + Astrhsize + 12, 0);
  FileRead(iFileHandle, TempAsamplerate, 4);
  // Audio bitrate
  FileSeek(iFileHandle, Aheaderstart + Astrhsize + 16, 0);
  FileRead(iFileHandle, TempAbitrate, 4);
  // закрываем файл
  FileClose(iFileHandle);
  // анализируем видео кодек (можно добавить больше)
  Vcodec := copy(TempVcodec, 0, 4);
  if Vcodec = 'div2' then
    Vcodec := 'MS MPEG4 v2'
  else if Vcodec = 'DIV2' then
    Vcodec := 'MS MPEG4 v2'
  else if Vcodec = 'div3' then
    Vcodec := 'DivX;-) MPEG4 v3'
  else if Vcodec = 'DIV3' then
    Vcodec := 'DivX;-) MPEG4 v3'
  else if Vcodec = 'div4' then
    Vcodec := 'DivX;-) MPEG4 v4'
  else if Vcodec = 'DIV4' then
    Vcodec := 'DivX;-) MPEG4 v4'
  else if Vcodec = 'div5' then
    Vcodec := 'DivX;-) MPEG4 v5'
  else if Vcodec = 'DIV5' then
    Vcodec := 'DivX;-) MPEG4 v5'
  else if Vcodec = 'divx' then
    Vcodec := 'DivX 4'
  else if Vcodec = 'mp43' then
    Vcodec := 'Microcrap MPEG4 v3';
  // тоже с аудио
  case TempAcodec of
    0: Acodec := 'PCM';
    1: Acodec := 'PCM';
    85: Acodec := 'MPEG Layer 3';
    353: Acodec := 'DivX;-) Audio';
    8192: Acodec := 'AC3-Digital';
  else
    Acodec := 'Unknown (' + IntToStr(TempAcodec) + ')';
  end;
  //Audio bitrate
  case (Trunc(TempAbitrate / 1024 * 8)) of
    246..260: Abitrate := 128;
    216..228: Abitrate := 128;
    187..196: Abitrate := 128;
    156..164: Abitrate := 128;
    124..132: Abitrate := 128;
    108..116: Abitrate := 128;
    92..100: Abitrate := 128;
    60..68: Abitrate := 128;
  else
    Abitrate := Round(TempAbitrate / 1024 * 8);
  end;
  // тут некоторые вычисления
  Size := TempSize / 1024 / 1024;
  Fps := 1000000 / TempMicrosec; // FPS
  // Length in seconds
  LengthInSec := TempLengthInFrames / fps;
  //length in minutes
  Length := LengthInSec / 60;
  //Round(LengthInSec - (Int(LengthInSec / 60) * 60)));
  Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8;
  //fill up the file info structure
  RetVal.AVIFileName := FileName;
  RetVal.FileSize := Size;
  RetVal.ClipLength := Length;
  RetVal.VideoCodec := VCodec;
  RetVal.ClipBitrate := Vbitrate;
  RetVal.ClipWidth := VWidth;
  RetVal.ClipHeight := VHeight;
  RetVal.ClipFPS := FPS;
  RetVal.AudioCodec := Acodec;
  RetVal.AudioBitRate := Abitrate;
  RetVal.AudioSampleRate := TempAsamplerate;
  RetVal.AudioChannelCnt := TempAchannels;
  ReadAviInfo := RetVal;
end;

end.

Пример использования:

unit AVIInfo;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, AviInformation;

type
  //
  // structure containing avi file info
  //
  TAVIFileInfo = packed record
    AVIFileName: string;
    FileSize: double;
    ClipLength: double;
    VideoCodec: string[32];
    ClipBitrate: double;
    ClipWidth: Integer;
    ClipHeight: Integer;
    ClipFPS: double;
    AudioCodec: string[32];
    AudioBitRate: Integer;
    AudioSampleRate: Integer;
    AudioChannelCnt: Byte;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    AVIVideoInfo: TMemo;
    OpenDialog1: TOpenDialog;
    AVIAudioInfo: TMemo;
    AVIGenInfo: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
// function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  FInfo: AviInformation.TAVIFileInfo;
  ErrCode: Byte;
begin
  if OpenDialog1.Execute then
  begin
    FInfo := AviInformation.ReadAviInfo(OpenDialog1.FileName, ErrCode);
    AviGenInfo.Clear;
    AVIVideoInfo.Clear;
    AVIAudioInfo.Clear;
    if ErrCode > 0 then
      exit;
    AviGenInfo.Lines.Add('AVI INFORMATION');
    AviGenInfo.lines.Add('FileName: ' + FInfo.AVIFileName);
    AviGenInfo.lines.Add('Size: ' + FormatFloat('#.## MB', FInfo.FileSize));
    AviGenInfo.Lines.Add('Length: ' + FormatFloat('#.## min.',
      FInfo.ClipLength));
    AVIVideoInfo.Lines.Add('VIDEO INFORMATION');
    AVIVideoInfo.Lines.Add('Codec: ' + FInfo.VideoCodec);
    AVIVideoInfo.Lines.Add('Bitrate: ' + FormatFloat('# Kbit/s',
      Finfo.ClipBitrate));
    AVIVideoInfo.lines.Add('Width: ' + IntToStr(Finfo.ClipWidth) + ' px');
    AVIVideoInfo.lines.Add('Height: ' + IntToStr(Finfo.ClipHeight) + ' px');
    AVIVideoInfo.Lines.Add('FPS: ' + FormatFloat('#.##', Finfo.ClipFPS));
    AVIAudioInfo.Lines.Add('AUDIO INFORMATION');
    AVIAudioInfo.Lines.Add('Codec: ' + Finfo.AudioCodec);
    AVIAudioInfo.Lines.Add('Bitrate: ' + FormatFloat('#.##',
      Finfo.AudioBitRate));
    AVIAudioInfo.Lines.Add('Audio sample Rate: ' +
      IntToStr(FInfo.AudioSampleRate));
    AVIAudioInfo.Lines.Add('Audio Channel Count: ' +
      IntToStr(FInfo.AudioChannelCnt));
  end;
end;

{function TForm1.ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo;
var
   // хэндл файла
  iFileHandle: Integer;
  // Для позционирования в AVI файле
  Aviheadersize: integer;
  Vheadersize: integer;
  Aviheaderstart: integer;
  Vheaderstart: integer;
  Aheaderstart: integer;
  Astrhsize: integer;
  // Временные переменные
  TempFExt: String[5];
  TempSize: Integer;
  TempVcodec: String[5];
  TempAcodec: integer;
  TempMicrosec: integer;
  TempLengthInFrames: integer;
  TempAchannels: integer;
  TempAsamplerate: integer;
  TempAbitrate: integer;
  //Выходные данные
  Size: double;
  Length: double;
  Vcodec: string;
  Vbitrate: double;
  VWidth: integer;
  VHeight: integer;
  Fps: double;

  LengthInSec: double;
  Acodec: string;
  Abitrate: Integer;
  RetVal: TAVIFileInfo;
begin
  ErrCode := 0;
  TempAcodec := 0;
  TempAbitrate := 0;
  TempAsamplerate := 0;
  TempAchannels := 0;
  if not FileExists(FileName) then
   begin
    ErrCode := 1;
    exit;
   end;
  // Открываем
  iFileHandle := FileOpen(FileName, fmOpenRead);
  // Грубая проверка на подлинность файла
  FileSeek(iFileHandle, 7, 0);
  FileRead(iFileHandle, TempFExt, 5);
  if copy(TempFExt, 0, 4) <> 'AVI ' then
  begin
    ErrCode := 2;
    exit;
  end;
  // Размер файла
  FileSeek(iFileHandle,4,0);
  FileRead(iFileHandle, TempSize, 4);
  // Размер хедера (needed to locate the audio part)
  FileSeek(iFileHandle,28,0);
  FileRead(iFileHandle, Aviheadersize, 4);
  // старт хедера (needed to locate the video part)
  Aviheaderstart := 32;
  // Милисекунды (1000000 / TempMicrosec = fps)
  FileSeek(iFileHandle,Aviheaderstart,0);
  FileRead(iFileHandle, TempMicrosec, 4);
  // Размер во фреймах
  FileSeek(iFileHandle,Aviheaderstart + 16,0);
  FileRead(iFileHandle, TempLengthInFrames, 4);
  // Ширина
  FileSeek(iFileHandle,Aviheaderstart + 32,0);
  FileRead(iFileHandle, VWidth, 4);
  // Высота
  FileSeek(iFileHandle,Aviheaderstart + 36,0);
  FileRead(iFileHandle, VHeight, 4);
  //calculate header size
  FileSeek(iFileHandle,Aviheaderstart + Aviheadersize + 4,0);
  FileRead(iFileHandle, Vheadersize, 4);
  Vheaderstart := Aviheaderstart + Aviheadersize + 20;
  // Video Codec
  FileSeek(iFileHandle,Vheaderstart + 3,0);
  FileRead(iFileHandle, TempVCodec, 5);
  Aheaderstart := Vheaderstart + Vheadersize + 8;
  FileSeek(iFileHandle,Aheaderstart - 4,0);
  FileRead(iFileHandle, Astrhsize, 5);
  // Audio codec
  FileSeek(iFileHandle,Aheaderstart + Astrhsize + 8,0);
  FileRead(iFileHandle, TempACodec, 2);
  // Audio каналы (1 = mono, 2 = stereo)
  FileSeek(iFileHandle,Aheaderstart + Astrhsize + 10,0);
  FileRead(iFileHandle, TempAchannels, 2);
  // Audio samplerate
  FileSeek(iFileHandle,Aheaderstart + Astrhsize + 12,0);
  FileRead(iFileHandle, TempAsamplerate, 4);
  // Audio bitrate
  FileSeek(iFileHandle,Aheaderstart + Astrhsize + 16,0);
  FileRead(iFileHandle, TempAbitrate, 4);
  // закрываем файл
  FileClose(iFileHandle);
  // анализируем видео кодек (можно добавить больше)
  Vcodec := copy(TempVcodec, 0, 4);
  if Vcodec = 'div2' then Vcodec := 'MS MPEG4 v2'
  else if Vcodec = 'DIV2' then Vcodec := 'MS MPEG4 v2'
  else if Vcodec = 'div3' then Vcodec := 'DivX;-) MPEG4 v3'
  else if Vcodec = 'DIV3' then Vcodec := 'DivX;-) MPEG4 v3'
  else if Vcodec = 'div4' then Vcodec := 'DivX;-) MPEG4 v4'
  else if Vcodec = 'DIV4' then Vcodec := 'DivX;-) MPEG4 v4'
  else if Vcodec = 'div5' then Vcodec := 'DivX;-) MPEG4 v5'
  else if Vcodec = 'DIV5' then Vcodec := 'DivX;-) MPEG4 v5'
  else if Vcodec = 'divx' then Vcodec := 'DivX 4'
  else if Vcodec = 'mp43' then Vcodec := 'Microcrap MPEG4 v3';
  // тоже с аудио
  case TempAcodec of
    0: Acodec := 'PCM';
    1: Acodec := 'PCM';
    85: Acodec := 'MPEG Layer 3';
    353: Acodec := 'DivX;-) Audio';
    8192: Acodec := 'AC3-Digital';
  else
    Acodec := 'Unknown (' + IntToStr(TempAcodec) + ')';
  end;
  //Audio bitrate
  case (Trunc(TempAbitrate / 1024 * 8)) of
    246..260: Abitrate := 128;
    216..228: Abitrate := 128;
    187..196: Abitrate := 128;
    156..164: Abitrate := 128;
    124..132: Abitrate := 128;
    108..116: Abitrate := 128;
    92..100: Abitrate := 128;
    60..68: Abitrate := 128;
  else
    Abitrate := Round(TempAbitrate / 1024 * 8);
  end;
  // тут некоторые вычисления
  Size := TempSize / 1024 / 1024;
  Fps := 1000000 / TempMicrosec; // FPS
  // Length in seconds
  LengthInSec := TempLengthInFrames / fps;
  //length in minutes
  Length := LengthInSec / 60;
  //Round(LengthInSec - (Int(LengthInSec / 60) * 60)));
  Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8;
  //fill up the file info structure
  RetVal.AVIFileName := FileName;
  RetVal.FileSize := Size;
  RetVal.ClipLength := Length;
  RetVal.VideoCodec := VCodec;
  RetVal.ClipBitrate := Vbitrate;
  RetVal.ClipWidth := VWidth;
  RetVal.ClipHeight := VHeight;
  RetVal.ClipFPS := FPS;
  RetVal.AudioCodec := Acodec;
  RetVal.AudioBitRate := Abitrate;
  RetVal.AudioSampleRate := TempAsamplerate;
  RetVal.AudioChannelCnt := TempAchannels;
  ReadAviInfo := RetVal;
end; }
end.

Программный модуль на языке Delphi, который предоставляет функцию чтения информации из файла AVI. Функция ReadAviInfo принимает имя файла AVI в качестве входного параметра и возвращает структуру, содержащую различные детали о файле, такие как его размер, длина, кодек видео, кодек аудио, битрейт, частота кадров, ширина, высота и т.д.

Вот шаг за шагом, что код делает:

  1. Сначала проверяется, существует ли файл и имеет ли он валидный заголовок AVI.
  2. Затем из файла читаются различные заголовки для извлечения информации о видео- и аудиопотоках.
  3. Рассчитывается частота кадров, деля 1000000 (что эквивалентно одному секунде) на значение, прочитанное из поля Microsec в заголовке.
  4. Рассчитывается длина файла в секундах, деля количество кадров на частоту кадров.
  5. Конвертируется битрейт из байт в секунду в килобиты в секунду (kbps).
  6. Функция заполняет структуру извлеченной информацией и возвращает ее.

Пример использования в конце показывает, как вызывать эту функцию и отображать извлеченную информацию в контроле memo на форме.

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

Получение информации о AVI файле: программно-инструментарный комплекс для чтения и анализа информации о видеофайле формата AVI.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:24:47/0.0066099166870117/1