Получение информации о 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", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:
Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи , в сообщение обязательно указывайте название или ссылку на статью!