Delphi World - Получение информации о AVI файле 2
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Получение информации о 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 World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования