Главная страницаОбратная связьКарта сайта

Получение информации о 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.

Обсудить статью на форуме


Если Вас заинтересовала или понравилась информация по разработке на Delph - "Получение информации о AVI файле 2", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!
   


Copyright © 2008 - 2024 Дискета.info