Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Информация о AVI файле, (разбор заголовка AVI)

Поиск:
Код
unit Unit1;

interface

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

Type
 TForm1 = class(TForm)
   Memo1: TMemo;
   OpenDialog1: TOpenDialog;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 Public
   procedure ReadAviInfo(FileName: String);
 End;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ReadAviInfo(FileName: String);
var
 iFileHandle: Integer; // хэндл файла

 // Для позмционирования в AVI файле
 Aviheadersize: Integer;
 Vheadersize: Integer;
 Aviheaderstart: Integer;
 Vheaderstart: Integer;
 Aheaderstart: Integer;
 Astrhsize: Integer;

 // Временные переменные
 TempTest: String[5];
 TempSize: Integer;
 TempVcodec: String[5];
 TempAcodec: Integer;
 TempMicrosec: Integer;
 TempLengthInFrames: Integer;
 TempAchannels: Integer;
 TempAsamplerate: Integer;
 TempAbitrate: Integer;

 //Выходные данные
 Size: Double;
 Length: String;
 Vcodec: String;
 Vbitrate: Double;
 VWidth: Integer;
 VHeight: Integer;
 Fps: Double;

 LengthInSec: Double;
 Acodec: String;
 Abitrate: String;
begin
 // Открываем
 iFileHandle := FileOpen(FileName, fmOpenRead);

 // Грубая проверка на подлинность файла
 FileSeek(iFileHandle, 7, 0);
 FileRead(iFileHandle, TempTest, 5);
 If copy(TempTest, 0, 4) <> 'AVI ' then
 begin
   MessageDlg('Could not open ' + FileName + ' because it is not a valid video file', mtError, [mbOk], 0);
   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);

 FileSeek(iFileHandle,Aviheaderstart + Aviheadersize + 4,0);
 FileRead(iFileHandle, Vheadersize, 4);

 Vheaderstart := Aviheaderstart + Aviheadersize + 20;

 // кодек
 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;

 Case (Trunc(TempAbitrate / 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', TempAbitrate / 1024 * 8);
 End;

 // тут некоторые вычисления
 Size := TempSize / 1024 / 1024;
 Fps := 1000000 / TempMicrosec; // FPS
 LengthInSec := TempLengthInFrames / fps; // Length In seconds
 Length := FormatFloat('# min', Int(LengthInSec / 60)) + FormatFloat(' # sec',
   Round(LengthInSec - (Int(LengthInSec / 60) * 60)));
 Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8;

 // Выводим инфу в мемо
 Memo1.Lines.Add('AVI INFORMATION');
 Memo1.lines.Add('Size: ' + FormatFloat('#.## MB',Size));
 Memo1.Lines.Add('Length: ' + Length);
 Memo1.Lines.Add('');
 Memo1.Lines.Add('VIDEO INFORMATION');
 Memo1.Lines.Add('Codec: ' + Vcodec);
 Memo1.Lines.Add('Bitrate: ' + FormatFloat('# Kbit/s', Vbitrate));
 Memo1.lines.Add('Width: ' + IntToStr(VWidth) + ' px');
 Memo1.lines.Add('Height: ' + IntToStr(VHeight) + ' px');
 Memo1.Lines.Add('FPS: ' + FormatFloat('#.##', fps));
 Memo1.Lines.Add('');
 Memo1.Lines.Add('AUDIO INFORMATION');
 Memo1.Lines.Add('Codec: ' + Acodec);
 Memo1.Lines.Add('Bitrate: ' + Abitrate);
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
 If OpenDialog1.Execute Then ReadAviInfo(OpenDialog1.FileName);
End;

end.
Автор: Rouse_
Сайт: http://forum.sources.ru






Просмотров: 2859

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную