// First, put a memo, button and a open dialog on an empty form.// Then use the following code to show the information of a avi file.unit Unit1;
interfaceuses
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{ Public declarations }procedure ReadAviInfo(FileName: string);
end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.ReadAviInfo(FileName: string);
var
iFileHandle: Integer; // File handle// Needed for positioning in the avi file
Aviheadersize: integer;
Vheadersize: integer;
Aviheaderstart: integer;
Vheaderstart: integer;
Aheaderstart: integer;
Astrhsize: integer;
// Temporary values
TempTest: String[5];
TempSize: Integer;
TempVcodec: String[5];
TempAcodec: integer;
TempMicrosec: integer;
TempLengthInFrames: integer;
TempAchannels: integer;
TempAsamplerate: integer;
TempAbitrate: integer;
// Final values
Size: double;
Length: string;
Vcodec: string;
Vbitrate: double;
VWidth: integer;
VHeight: integer;
Fps: double;
LengthInSec: double;
Acodec: string;
Abitrate: string;
begin// Open the file
iFileHandle := FileOpen(FileName, fmOpenRead);
// Test to see if file is AVI
FileSeek(iFileHandle, 7, 0);
FileRead(iFileHandle, TempTest, 5);
if copy(TempTest, 0, 4) <> 'AVI ' thenbegin
MessageDlg('Could not open ' + FileName +
' because it is not a valid video file', mtError, [mbOk], 0);
Exit;
end;
// File size
FileSeek(iFileHandle,4,0);
FileRead(iFileHandle, TempSize, 4);
// Avi header size (needed to locate the audio part)
FileSeek(iFileHandle,28,0);
FileRead(iFileHandle, Aviheadersize, 4);
// Avi header start (needed to locate the video part)
Aviheaderstart := 32;
// Microseconds (1000000 / TempMicrosec = fps)
FileSeek(iFileHandle,Aviheaderstart,0);
FileRead(iFileHandle, TempMicrosec, 4);
// Length of movie in frames
FileSeek(iFileHandle,Aviheaderstart + 16,0);
FileRead(iFileHandle, TempLengthInFrames, 4);
// Width
FileSeek(iFileHandle,Aviheaderstart + 32,0);
FileRead(iFileHandle, VWidth, 4);
// Height
FileSeek(iFileHandle,Aviheaderstart + 36,0);
FileRead(iFileHandle, VHeight, 4);
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 channels (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);
// Close the file
FileClose(iFileHandle);
// Analyse the video codec (more can be added)
Vcodec := copy(TempVcodec, 0, 4);
if Vcodec = 'div2' then Vcodec := 'MS MPEG4 v2'
elseif Vcodec = 'DIV2' then Vcodec := 'MS MPEG4 v2'
elseif Vcodec = 'div3' then Vcodec := 'DivX;-) MPEG4 v3'
elseif Vcodec = 'DIV3' then Vcodec := 'DivX;-) MPEG4 v3'
elseif Vcodec = 'div4' then Vcodec := 'DivX;-) MPEG4 v4'
elseif Vcodec = 'DIV4' then Vcodec := 'DivX;-) MPEG4 v4'
elseif Vcodec = 'div5' then Vcodec := 'DivX;-) MPEG4 v5'
elseif Vcodec = 'DIV5' then Vcodec := 'DivX;-) MPEG4 v5'
elseif Vcodec = 'divx' then Vcodec := 'DivX 4'
elseif Vcodec = 'mp43' then Vcodec := 'Microcrap MPEG4 v3';
// Analyse the audio codec (more can be added)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;
// Some final calculations
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;
// Output information to memo field
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
OpenDialog1.Filter := 'AVI files (*.avi)|*.avi';
if OpenDialog1.Execute thenbegin
Memo1.Clear;
ReadAviInfo(OpenDialog1.FileName);
end;
end;
end.
Программа на Delphi, которая извлекает информацию из файлов AVI. Она использует компонент TForm для создания формы с кнопкой, полем ввода и диалогом открытия. Когда кнопка нажата, она открывает диалог "Открыть", позволяя пользователю выбрать файл AVI. Затем программа читает заголовок файла, чтобы извлечь информацию,such as размер, длина, кодек видео, кодек аудио, частота кадров, битрейт и т.д.
Программа состоит из следующих шагов:
Она настраивает форму с кнопкой, полем ввода и диалогом открытия.
В процедуре ReadAviInfo она открывает выбранный файл и читает его заголовок для извлечения информации.
Она проверяет, является ли файл AVI, прочитав первые 4 байта файла.
Затем она извлекает различные части информации из заголовка файла, включая:
Размер
Длина кадров
Кодек видео (например, "DivX;-) MPEG4 v3")
Кодек аудио (например, "MPEG Layer 3")
Частота кадров (FPS)
Битрейт
Ширина и высота видео
Она рассчитывает некоторые дополнительные значения, такие как:
Длина файла в секундах
Видео битрейт
Наконец, она выводит всю эту информацию в поле ввода.
Процедура Button1Click вызывается при нажатии кнопки. Она настраивает фильтр диалога открытия для отображения только файлов AVI и затем выполняет диалог. Если файл выбран, она очищает поле ввода и вызывает процедуру ReadAviInfo, чтобы извлечь информацию о файле.
Некоторые предложения по улучшению:
Обработка ошибок: код не обрабатывает ошибки, которые могут возникнуть при чтении или записи в файл.
Организация кода: процедура ReadAviInfo слишком длинная и может быть разбита на более маленькие процедуры для лучшей читаемости и поддерживаемости.
Имя переменных: некоторые имена переменных неясны, такие как TempTest и TempSize. Рекомендуется использовать более описательные имена.
Комментарии кода: нет комментариев к коду, чтобы объяснить, что он делает или почему были сделаны определенные решения. Добавление комментариев может сделать код более понятным для других (и для себя в будущем).
Получение информации о звуковых файлах с помощью Delphi, позволяет отображать размер, длину, кодек и битрейт аудио и видеопотока в AVI-файле.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.