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