Показать сообщение отдельно
  #4  
Старый 26.02.2008, 22:12
vitalik007 vitalik007 вне форума
Прохожий
 
Регистрация: 12.10.2007
Адрес: Минск
Сообщения: 30
Репутация: 10
По умолчанию

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
//Процедура для чтения информации об AVI
procedure AviInfo(FileName: string);
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
procedure TForm1.AviInfo(FileName: string);
var
AviFileHandle: Integer;

AVI_HEADER_SIZE: integer;
V_HEADER_SIZE: integer;
AVI_HEADER_START: integer;
V_HEADER_START: integer;
A_HEADER_START: integer;
A_STRH_SIZE: integer;

//Временные значения
TEMP_TEST: string[5];
TEMP_SIZE: Integer;
TEMP_VCODEC: String[5];
TEMP_ACODEC: integer;
TEMP_MICROSEC: integer;
TEMP_LENGTHinFRAMES: integer;
TEMP_ACHANNELS: integer;
TEMP_ASAMPLERATE: integer;
TEMP_ABITRATE: integer;

//Окончательные значения
Size: double;
Length: string;
Vcodec: string;
Vbitrate: double;
VWidth: integer;
VHeight: integer;
Fps: double;
LengthInSec: double;
Acodec: string;
Abitrate: string;
begin
//Открываем файл
AviFileHandle := FileOpen(FileName, fmOpenRead);

//Проверяем, что это AVI файл
FileSeek(AviFileHandle, 7, 0);
FileRead(AviFileHandle, TEMP_TEST, 5);
if copy(TEMP_TEST, 0, 4) <> 'AVI ' then
begin
ShowMessage('Невозможно обработать выбранный AVI файл. Операция остановлена!');
exit;
end;

// Определяем размер файла
FileSeek(AviFileHandle,4,0);
FileRead(AviFileHandle, TEMP_SIZE, 4);

//Производим инициализирующие действия, чтобы в дальнешем получить
//информацию об аудио и видео
FileSeek(AviFileHandle,28,0);
FileRead(AviFileHandle, AVI_HEADER_SIZE, 4);
AVI_HEADER_START := 32;

//Значение необходимо для получения fps
FileSeek(AviFileHandle,AVI_HEADER_START,0);
FileRead(AviFileHandle, TEMP_MICROSEC, 4);

//Длина фильма в кадрах
FileSeek(AviFileHandle,AVI_HEADER_START + 16,0);
FileRead(AviFileHandle, TEMP_LENGTHinFRAMES, 4);

//Ширина
FileSeek(AviFileHandle,AVI_HEADER_START + 32,0);
FileRead(AviFileHandle, VWidth, 4);

//Высота
FileSeek(AviFileHandle,AVI_HEADER_START + 36,0);
FileRead(AviFileHandle, VHeight, 4);

FileSeek(AviFileHandle,AVI_HEADER_START + AVI_HEADER_SIZE + 4,0);
FileRead(AviFileHandle, V_HEADER_SIZE, 4);
V_HEADER_START := AVI_HEADER_START + AVI_HEADER_SIZE + 20;

//Видеокодек
FileSeek(AviFileHandle,V_HEADER_SIZE + 3,0);
FileRead(AviFileHandle, TEMP_VCODEC, 5);
A_HEADER_START := V_HEADER_START + V_HEADER_SIZE + 8;
FileSeek(AviFileHandle,AVI_HEADER_START - 4,0);
FileRead(AviFileHandle, A_STRH_SIZE, 5);

//Аудиокодек
FileSeek(AviFileHandle,A_HEADER_START + A_STRH_SIZE + 8,0);
FileRead(AviFileHandle, TEMP_ACODEC, 2);

//Дополнительная информация об аудио
//Mono(1), Stereo(2)
FileSeek(AviFileHandle,AVI_HEADER_START + A_STRH_SIZE + 10,0);
FileRead(AviFileHandle, TEMP_ACHANNELS, 2);
//samplerate
FileSeek(AviFileHandle,AVI_HEADER_START + A_STRH_SIZE + 12,0);
FileRead(AviFileHandle, TEMP_ASAMPLERATE, 4);
//bitrate
FileSeek(AviFileHandle,AVI_HEADER_START + A_STRH_SIZE + 16,0);
FileRead(AviFileHandle, TEMP_ABITRATE, 4);

//Информация прочитана, закрываем файл
FileClose(AviFileHandle);

//Определяем название видеокодека
Vcodec := copy(TEMP_VCODEC, 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 TEMP_ACODEC of
0: Acodec := 'PCM';
1: Acodec := 'PCM';
85: Acodec := 'MPEG Layer 3';
353: Acodec := 'DivX;-) Audio';
8192: Acodec := 'AC3-Digital';
else
Acodec := 'Неизвестный (' + IntToStr(TEMP_ACODEC) + ')';
end;

//Определяем bitrate
case (Trunc(TEMP_ABITRATE / 1024 * 8)) of
246..260: Abitrate := '128 Kbit/s';
216..228: Abitrate := '128 Kbit/s';
187..196: Abitrate := '128 Kbit/s';
156..164: Abitrate := '128 Kbit/s';
124..132: Abitrate := '128 Kbit/s';
108..116: Abitrate := '128 Kbit/s';
92..100: Abitrate := '128 Kbit/s';
60..68: Abitrate := '128 Kbit/s';
else
Abitrate := FormatFloat('# Kbit/s', TEMP_ABITRATE / 1024 * 8);
end;

//Окончательный рассчет
Size := TEMP_SIZE / 1024 / 1024;
Fps := 1000000 / TEMP_MICROSEC; // FPS
LengthInSec := TEMP_LENGTHinFRAMES / fps; // Length in seconds
Length := FormatFloat('# min', Int(LengthInSec / 60)) +
FormatFloat(' # sec', Round(LengthInSec - (Int(LengthInSec / 60) * 60)));
Vbitrate := (TEMP_SIZE / LengthInSec - TEMP_ABITRATE) / 1024 * 8;

//Выводит информацию в TMemo
Memo1.Lines.Add('СВЕДЕНИЯ ОБ AVI файле: '+FileName);
Memo1.lines.Add('Размер: ' + FormatFloat('#.## MB',Size));
Memo1.Lines.Add('Длина: ' + Length);
Memo1.Lines.Add('');
Memo1.Lines.Add('информация о видео');
Memo1.Lines.Add('Кодек: ' + Vcodec);
Memo1.Lines.Add('Bitrate: ' + FormatFloat('# Kbit/s', Vbitrate));
Memo1.lines.Add('Ширина: ' + IntToStr(VWidth) + ' px');
Memo1.lines.Add('Высота: ' + IntToStr(VHeight) + ' px');
Memo1.Lines.Add('FPS: ' + FormatFloat('#.##', fps));
Memo1.Lines.Add('');
Memo1.Lines.Add('информация об аудио');
Memo1.Lines.Add('Кодек: ' + Acodec);
Memo1.Lines.Add('Bitrate: ' + Abitrate);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Filter := 'AVI files (*.avi)|*.avi';
if OpenDialog1.Execute then
begin
Memo1.Clear;
AviInfo(OpenDialog1.FileName);
end;
end;

end.
Ответить с цитированием